๐ŸŽ Get the FREE AI Skills Starter Guide โ€” Subscribe โ†’
BytesAgainBytesAgain
๐Ÿฆ€ ClawHub

Ms Todo Oauth

by @nathanatgit

Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...

Versionv1.0.5
Downloads1,688
Starsโญ 1
TERMINAL
clawhub install ms-todo-oauth

๐Ÿ“– About This Skill


name: ms-todo-oauth description: > A robust CLI skill to manage Microsoft To Do tasks via Microsoft Graph API. Supports full task lifecycle management including lists, tasks with priorities, due dates, reminders, recurrence patterns, views, search, and data export. Includes comprehensive test suite for reliability. THIS IS A REVISED OAUTH2-BASED VERSION OF ms-todo-sync with AI ASSISTANCE. ALL CREDITS TO THE ORIGINAL AUTHOR. metadata: version: 1.0.3 author: yalonghan@gmaill.com license: MIT License tags: [productivity, task-management, microsoft-todo, cli, graph-api, tested] category: productivity tested: true test_coverage: 29 comprehensive tests

ms-todo-oauth

A fully-tested Microsoft To Do command-line client for managing tasks and lists via Microsoft Graph API.

โš ๏ธThis is a oauth based script. It contains a generated Azure Client ID and Secret ID

IF YOU WORRIED ABOUT YOUR PRIVACY, CONSIDER REPLACING THEM TO YOUR OWN IN scripts\ms-todo-oauth.py. Just search for values below:

client_id="ca6ec244โ€ฆโ€ฆ

client_secret="TwQ8Qโ€ฆโ€ฆ

โœจ Features

  • โœ… Full Task Management: Create, complete, delete, and search tasks
  • ๐Ÿ—‚๏ธ List Organization: Create and manage multiple task lists
  • โฐ Rich Task Options: Priorities, due dates, reminders, descriptions, tags
  • ๐Ÿ”„ Recurring Tasks: Daily, weekly, monthly patterns with custom intervals
  • ๐Ÿ“Š Multiple Views: Today, overdue, pending, statistics
  • ๐Ÿ” Powerful Search: Find tasks across all lists
  • ๐Ÿ’พ Data Export: Export all tasks to JSON
  • ๐Ÿงช Fully Tested: 29 comprehensive automated tests
  • ๐ŸŒ Unicode Support: Full support for Chinese characters and emojis
  • Prerequisites

    1. Python >= 3.9 must be installed 2. Working directory: All commands MUST be run from the root of this skill (the directory containing this SKILL.md file) 3. Network access: Requires internet access to Microsoft Graph API endpoints 4. Microsoft Account: Personal Microsoft account (Hotmail, Outlook.com) or work/school account 5. Authentication: First-time use requires OAuth2 login via browser. See Authentication section - Token cache: ~/.mstodo_token_cache.json (persists across sessions, auto-refreshed)

    Installation & Setup

    First-Time Setup

    Before using this skill for the first time, dependencies must be installed:

    # Navigate to skill directory
    cd 

    Create a venv in the project (creates '.venv' folder)

    python3 -m venv .venv

    Activate the venv choose based on platforms:

    #- Bash/Zsh: source .venv/bin/activate

    - Fish:

    source .venv/bin/activate.fish

    - Windows (PowerShell):

    .venv\Scripts\Activate.ps1

    pip install --upgrade pip pip install -r requirements.txt

    Alternative (global python env, not recommended):

    pip install -r requirements.txt

    Dependencies:

  • msal (Microsoft Authentication Library) - Official Microsoft OAuth library
  • requests - HTTP client for API calls
  • Specified in requirements.txt
  • Environment Verification

    After installation, verify the setup:

    
    

    If using native venv (activate as above):

    python3 scripts/ms-todo-oauth.py --help

    Expected: Command help text should be displayed

    Troubleshooting:

  • If Python not found, install Python 3.9 or higher from https://python.org
  • Testing (Optional but Recommended)

    Verify all functionality works correctly:

    # Run comprehensive automated test suite (29 tests)
    python3 test_ms_todo_oauth.py

    Expected: All tests pass (100% pass rate)

    See Testing section for details.

    Security Notes

  • Uses official Microsoft Graph API via Microsoft's msal library
  • All code is plain Python (.py files), readable and auditable
  • Tokens stored locally in ~/.mstodo_token_cache.json
  • All API calls go directly to Microsoft endpoints (graph.microsoft.com)
  • OAuth2 standard authentication flow
  • No third-party services involved
  • Command Reference

    All commands follow this pattern:

    python3 scripts/ms-todo-oauth.py [GLOBAL_OPTIONS]  [COMMAND_OPTIONS]
    

    Global Options

    | Option | Description | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | -v, --verbose | Show detailed information (IDs, dates, notes).Must be placed BEFORE the subcommand. | | --debug | Enable debug mode to display API requests and responses. Useful for troubleshooting.Must be placed BEFORE the subcommand. | | --reauth | Force re-authentication by clearing the token cache and starting fresh login |

    > โš ๏ธ Common mistake: Global options MUST come before the subcommand. > > - โœ… python3 scripts/ms-todo-oauth.py -v lists > - โœ… python3 scripts/ms-todo-oauth.py --debug add "Task" > - โŒ python3 scripts/ms-todo-oauth.py lists -v


    Authentication

    Authentication uses OAuth2 authorization code flow, designed for both interactive and automated environments.

    #### login get โ€” Get OAuth2 authorization URL

    python3 scripts/ms-todo-oauth.py login get
    

    Output example:

    ======================================================================
    ๐Ÿ” OAuth2 Authorization Required
    ======================================================================

    Please visit the following URL to authorize the application:

    https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?...

    After authorization, you will be redirected to a callback URL. Copy the 'code' parameter from the callback URL and run:

    ms-todo-oauth.py login verify

    ======================================================================

    What to do:

    1. Open the provided URL in your browser 2. Sign in with your Microsoft account 3. Grant permissions when prompted 4. You'll be redirected to a URL like: http://localhost:8000/callback?code=M.R3_BAY.abc123... 5. Copy the entire code after code= (usually a long string starting with M.R3_BAY.)

    Agent behavior: Present the URL to the user and explain they need to:

    1. Visit the URL 2. Complete the login 3. Copy the authorization code from the callback URL 4. Provide it to you

    #### login verify โ€” Complete login with authorization code

    python3 scripts/ms-todo-oauth.py login verify 
    

    Example:

    python3 scripts/ms-todo-oauth.py login verify "M.R3_BAY.abc123def456..."
    

    Output on success:

    โœ“ Authentication successful!
    โœ“ Login information saved, you will be logged in automatically next time.
    

    Output on failure:

    โŒ Token acquisition failed
    Error: invalid_grant
    Description: AADSTS54005: OAuth2 Authorization code was already redeemed...
    

    Exit code: 0 on success, 1 on failure.

    Important notes:

  • Each authorization code can only be used ONCE
  • If verification fails, you need to run login get again to get a new code
  • Once successfully logged in, the token is cached and you won't need to login again unless:
  • - You run logout - You run --reauth - The token expires and cannot be auto-refreshed

    #### logout โ€” Clear saved login

    python3 scripts/ms-todo-oauth.py logout
    

    Output: โœ“ Login information cleared

    Only use when the user explicitly asks to switch accounts or clear login data. Under normal circumstances, the token is cached and login is automatic.


    List Management

    #### lists โ€” List all task lists

    python3 scripts/ms-todo-oauth.py lists
    python3 scripts/ms-todo-oauth.py -v lists  # with IDs and creation dates
    

    Output example:

    ๐Ÿ“‹ Task Lists (3 total):

    1. ไปปๅŠก ID: AQMkADAwATYwMAItYTQwZC04OThhLTAwAi0wMAoALgAAA0QJKpxW32BIsIlHaM... Created: 2024-12-15T08:30:00Z 2. Work 3. Shopping

    #### create-list โ€” Create a new list

    python3 scripts/ms-todo-oauth.py create-list ""
    

    | Argument | Required | Description | | -------- | -------- | ----------------------------------------------- | | name | Yes | Name of the new list (supports Unicode/Chinese) |

    Example:

    python3 scripts/ms-todo-oauth.py create-list "้กน็›ฎ A"
    

    Output: โœ“ List created: ้กน็›ฎ A

    #### delete-list โ€” Delete a list

    python3 scripts/ms-todo-oauth.py delete-list "" [-y]
    

    | Argument/Option | Required | Description | | --------------- | -------- | -------------------------- | | name | Yes | Name of the list to delete | | -y, --yes | No | Skip confirmation prompt |

    > โš ๏ธ This is a destructive operation. Without -y, the command will prompt for confirmation. All tasks in the list will be deleted. Consider asking the user before deleting important lists.

    Output: โœ“ List deleted:

    Exit code: 1 if list not found, 0 on success


    Task Operations

    #### add โ€” Add a new task

    python3 scripts/ms-todo-oauth.py add "" [options]
    </code></pre></p><p style="margin:8px 0">| Option                | Required | Default        | Description                                                                                                                                                                                                                             |
    | --------------------- | -------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">title</code>             | Yes      | โ€”             | Task title (positional argument, supports Unicode/Chinese/emojis)                                                                                                                                                                       |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l, --list</code>        | No       | (default list) | Target list name. If not specified, uses your Microsoft To Do default list.                                                                                                                                                             |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-p, --priority</code>    | No       | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">normal</code>     | Priority:<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">low</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">normal</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">high</code>                                                                                                                                                                                                  |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-d, --due</code>         | No       | โ€”             | Due date. Accepts days from now (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">3</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">3d</code>) or date (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2026-02-15</code>). <strong style="color:#e5e7eb">Note:</strong> Only date is supported by Microsoft To Do API, not time.                                                                                    |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-r, --reminder</code>    | No       | โ€”             | Reminder datetime. Formats:<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">3h</code> (hours from now), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2d</code> (days from now), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2026-02-15 14:30</code> (date+time with space, needs quotes), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2026-02-15T14:30:00</code> (ISO format), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2026-02-15</code> (date only, defaults to 09:00).             |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-R, --recurrence</code>  | No       | โ€”             | Recurrence pattern. Formats:<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">daily</code> (every day), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">weekdays</code> (Mon-Fri), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">weekly</code> (every week), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">monthly</code> (every month). With interval: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">daily:2</code> (every 2 days), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">weekly:3</code> (every 3 weeks), <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">monthly:2</code> (every 2 months). |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-D, --description</code> | No       | โ€”             | Task description/notes (supports multiline with quotes)                                                                                                                                                                                 |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-t, --tags</code>        | No       | โ€”             | Comma-separated tags/categories (e.g.,<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">"work,urgent"</code>)                                                                                                                                                                                |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--create-list</code>     | No       | False          | Create the list if it doesn't exist (deprecated, lists auto-create now)                                                                                                                                                                 |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Auto-created lists</strong>: If the specified list doesn't exist, it will be automatically created.</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">โœ“ Task added: Complete report
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">With recurrence:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">โœ“ Task added: Daily standup
    ๐Ÿ”„ Recurring task created
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Examples:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Simple task
    python3 scripts/ms-todo-oauth.py add "Buy milk" -l "Shopping"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">High priority task due in 3 days</h2>
    python3 scripts/ms-todo-oauth.py add "Submit report" -l "Work" -p high -d 3</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Task with reminder in 2 hours</h2>
    python3 scripts/ms-todo-oauth.py add "Call client" -r 2h</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Task with specific date and time reminder</h2>
    python3 scripts/ms-todo-oauth.py add "Meeting" -d 2026-03-15 -r "2026-03-15 14:30"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Daily recurring task</h2>
    python3 scripts/ms-todo-oauth.py add "Daily standup" -l "Work" -R daily</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Weekday recurring task  </h2>
    python3 scripts/ms-todo-oauth.py add "Gym" -R weekdays -l "Personal"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Task with all options</h2>
    python3 scripts/ms-todo-oauth.py add "Project Review" \
      -l "Work" \
      -p high \
      -d 7 \
      -r "2026-02-20 14:00" \
      -D "Review Q1 deliverables and prepare presentation" \
      -t "work,important,meeting"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Chinese task with emoji</h2>
    python3 scripts/ms-todo-oauth.py add "๐ŸŽ‰ ๅฎŒๆˆ้กน็›ฎ" -l "ไปปๅŠก" -p high
    </code></pre></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">complete</code> โ€” Mark a task as completed</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py complete "<title>" [-l "<list>"]
    </code></pre></p><p style="margin:8px 0">| Option         | Required | Default        | Description                      |
    | -------------- | -------- | -------------- | -------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">title</code>      | Yes      | โ€”             | <strong style="color:#e5e7eb">Exact</strong> task title       |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l, --list</code> | No       | (default list) | List name where the task resides |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Title matching</strong>: Requires <strong style="color:#e5e7eb">exact match</strong>. If unsure of exact title, use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> first.</p><p style="margin:8px 0">Output: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โœ“ Task completed: <title></code></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Exit code</strong>: 1 if task not found, 0 on success</p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete</code> โ€” Delete a task</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py delete "<title>" [-l "<list>"] [-y]
    </code></pre></p><p style="margin:8px 0">| Option         | Required | Default        | Description                      |
    | -------------- | -------- | -------------- | -------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">title</code>      | Yes      | โ€”             | <strong style="color:#e5e7eb">Exact</strong> task title       |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l, --list</code> | No       | (default list) | List name where the task resides |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-y, --yes</code>  | No       | โ€”             | Skip confirmation prompt         |</p><p style="margin:8px 0">> โš ๏ธ <strong style="color:#e5e7eb">Destructive operation</strong>. Without <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-y</code>, will prompt for confirmation.</p><p style="margin:8px 0">Output: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โœ“ Task deleted: <title></code></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Exit code</strong>: 1 if task not found, 0 on success</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Task Views</h4></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">tasks</code> โ€” List tasks in a specific list</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py tasks "<list>" [-a]
    </code></pre></p><p style="margin:8px 0">| Option        | Required | Description                                        |
    | ------------- | -------- | -------------------------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">list</code>      | Yes      | List name (exact match)                            |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-a, --all</code> | No       | Include completed tasks (default: incomplete only) |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“‹ Tasks in list "Work" (2 total):</p><p style="margin:8px 0">1. [In Progress] Write documentation โญ
    2. [In Progress] Review PR
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">With <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-a</code> flag:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“‹ Tasks in list "Work" (3 total):</p><p style="margin:8px 0">1. [In Progress] Write documentation โญ
    2. [Completed] Submit report
    3. [In Progress] Review PR
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Exit code</strong>: 1 if list not found, 0 on success</p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pending</code> โ€” All incomplete tasks across all lists</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py pending [-g]
    </code></pre></p><p style="margin:8px 0">| Option          | Required | Description           |
    | --------------- | -------- | --------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-g, --group</code> | No       | Group results by list |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example (with <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-g</code>):</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“‹ All incomplete tasks (3 total):</p><p style="margin:8px 0">๐Ÿ“‚ Work:
      [In Progress] Write documentation โญ
      [In Progress] Review PR</p><p style="margin:8px 0">๐Ÿ“‚ Shopping:
      [In Progress] Buy groceries
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Without <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-g</code>:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“‹ All incomplete tasks (3 total):</p><p style="margin:8px 0">[In Progress] Write documentation โญ
       List: Work
    [In Progress] Review PR
       List: Work
    [In Progress] Buy groceries
       List: Shopping
    </code></pre></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">today</code> โ€” Tasks due today</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py today
    </code></pre></p><p style="margin:8px 0">Lists incomplete tasks with due date matching today's date.</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“… Tasks due today (2 total):</p><p style="margin:8px 0">[In Progress] Submit report โญ
       List: Work
    [In Progress] Buy groceries
       List: Shopping
    </code></pre></p><p style="margin:8px 0">If no tasks: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">๐Ÿ“… No tasks due today</code></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">overdue</code> โ€” Overdue tasks</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py overdue
    </code></pre></p><p style="margin:8px 0">Lists incomplete tasks past their due date, sorted by days overdue.</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">โš ๏ธ  Overdue tasks (1 total):</p><p style="margin:8px 0">[In Progress] Submit report โญ
       List: Work
       Overdue: 3 days
    </code></pre></p><p style="margin:8px 0">If no overdue tasks: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โœ“ No overdue tasks</code></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">detail</code> โ€” View full task details</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py detail "<title>" [-l "<list>"]
    </code></pre></p><p style="margin:8px 0">| Option         | Required | Default        | Description                                        |
    | -------------- | -------- | -------------- | -------------------------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">title</code>      | Yes      | โ€”             | Task title (supports<strong style="color:#e5e7eb">partial/fuzzy match</strong>) |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l, --list</code> | No       | (default list) | List name                                          |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Fuzzy matching</strong>: Matches tasks containing the search string (case-insensitive).</p><p style="margin:8px 0">When multiple tasks match:</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Prefers <strong style="color:#e5e7eb">incomplete</strong> tasks over completed</li>
    <li style="color:#94a3b8;margin:3px 0">Returns most recently modified task</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">============================================================
    ๐Ÿ“Œ Task Details
    ============================================================</p><p style="margin:8px 0">๐Ÿ“‹ Title: Complete Q1 Report
    ๐Ÿ”– Status: [In Progress]
    โšก Priority: โญ High
    ๐Ÿ“… Created: 2026-01-15 08:30:00
    ๐Ÿ“ Modified: 2026-02-10 14:22:00
    โฐ Due: 2026-02-20 00:00:00
    ๐Ÿ”” Reminder: 2026-02-20 09:00:00</p><p style="margin:8px 0">๐Ÿ“ Notes:
    <li style="color:#94a3b8;margin:3px 0">Review sales figures</li>
    <li style="color:#94a3b8;margin:3px 0">Include charts</li>
    <li style="color:#94a3b8;margin:3px 0">Prepare for board meeting</li></p><p style="margin:8px 0">๐Ÿท๏ธ  Categories: work, important, Q1</p><p style="margin:8px 0">๐Ÿ”„ Recurrence:
       Every week on Monday
       Start date: 2026-02-17
       No end date</p><p style="margin:8px 0">============================================================
    </code></pre></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> โ€” Search tasks by keyword</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py search "<keyword>"
    </code></pre></p><p style="margin:8px 0">Searches across <strong style="color:#e5e7eb">all lists</strong> in both task titles and descriptions (case-insensitive).</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ” Search results for "report" (2 found):</p><p style="margin:8px 0">[In Progress] Complete Q1 Report โญ
       List: Work
       Notes: Review sales figures...</p><p style="margin:8px 0">[Completed] Submit weekly report
       List: Work
    </code></pre></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">stats</code> โ€” Task statistics</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py stats
    </code></pre></p><p style="margin:8px 0">Shows aggregate statistics across all lists.</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output example:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ“Š Task Statistics:</p><p style="margin:8px 0">  Total lists: 3
      Total tasks: 15
      Completed: 10
      Pending: 5
      High priority: 2
      Overdue: 1</p><p style="margin:8px 0">  Completion rate: 66.7%
    </code></pre></p><p style="margin:8px 0">#### <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">export</code> โ€” Export all tasks to JSON</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py export [-o "<filename>"]
    </code></pre></p><p style="margin:8px 0">| Option           | Required | Default              | Description      |
    | ---------------- | -------- | -------------------- | ---------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-o, --output</code> | No       | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">todo_export.json</code> | Output file path |</p><p style="margin:8px 0">Exports complete task data from all lists in JSON format.</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Output:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โœ“ Tasks exported to: <filename></code></p><p style="margin:8px 0"><strong style="color:#e5e7eb">JSON structure:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">{
      "Work": [
        {
          "id": "AQMkADAwATYwMAItYTQw...",
          "title": "Complete report",
          "status": "notStarted",
          "importance": "high",
          "createdDateTime": "2026-01-15T08:30:00Z",
          "dueDateTime": {
            "dateTime": "2026-02-20T00:00:00.0000000",
            "timeZone": "UTC"
          },
          "body": {
            "content": "Review Q1 numbers",
            "contentType": "text"
          },
          "categories": ["work", "important"]
        }
      ],
      "Shopping": [...]
    }
    </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Error Handling</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Exit Codes</h4></p><p style="margin:8px 0">| Code  | Meaning                                                                   |
    | ----- | ------------------------------------------------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">0</code> | Success                                                                   |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">1</code> | Failure (not logged in, API error, invalid arguments, resource not found) |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">2</code> | Invalid command-line arguments                                            |</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Common Error Messages</h4></p><p style="margin:8px 0">| Error                                           | Cause                             | Resolution                                                                  |
    | ----------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------- |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Not logged in</code>                            | No cached token or token expired  | Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code> then <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login verify <code></code>                              |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">ModuleNotFoundError: No module named 'msal'</code> | Dependencies not installed        | Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pip install -r requirements.txt</code>                      |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ List not found: <name></code>                   | Specified list does not exist     | Check list name with <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">lists</code> command. Note: exact match required.         |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Task not found: <name></code>                   | No task with exact matching title | Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> to find exact title, or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">tasks "<list>"</code> to list all tasks |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Error: Invalid isoformat string</code>          | DateTime parsing error            | This should not occur in v1.1.0+. If you see this, report as bug.           |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Error: Unsupported HTTP method</code>           | Internal API error                | This should not occur in v1.1.0+. If you see this, report as bug.           |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Error: <API error message></code>               | Microsoft Graph API error         | Retry; check network; use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code> for full details                      |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">Network error</code> / <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">Connection timeout</code>      | No internet or API unreachable    | Check network connection; verify access to graph.microsoft.com              |</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Testing</h3></p><p style="margin:8px 0">This skill includes a comprehensive test suite to ensure reliability.</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Automated Testing</h4></p><p style="margin:8px 0">Run the full test suite:</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">cd <skill-directory>
    python3 test_ms_todo_oauth.py
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Prerequisites:</strong></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Must be authenticated (logged in) before running tests</li>
    <li style="color:#94a3b8;margin:3px 0">Internet connection required</li>
    <li style="color:#94a3b8;margin:3px 0">Approximately 2-3 minutes to complete</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Test Coverage</strong> (29 tests):</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">โœ… Authentication (login/logout)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… List management (create, delete, list)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Basic task operations (add, complete, delete, list)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Task options (priorities, due dates, reminders, descriptions, tags)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Recurring tasks (daily, weekly, weekdays, monthly, custom intervals)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Task views (today, overdue, pending, search, stats)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Data export and validation</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Error handling (non-existent resources)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… Unicode support (Chinese characters, emojis)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Expected output:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">========================================================================
    TEST SUMMARY
    ========================================================================</p><p style="margin:8px 0">Total tests: 29
    Passed: 29
    Failed: 0
    Pass rate: 100.0%</p><p style="margin:8px 0">========================================================================
    ๐ŸŽ‰ ALL TESTS PASSED! ๐ŸŽ‰
    ========================================================================
    </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Manual Testing</h4></p><p style="margin:8px 0">For manual verification, see <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">MANUAL_TEST_CHECKLIST.txt</code> which provides:</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Step-by-step test procedures</li>
    <li style="color:#94a3b8;margin:3px 0">Expected outcomes</li>
    <li style="color:#94a3b8;margin:3px 0">9 test categories covering all functionality</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Test Cleanup</h4></p><p style="margin:8px 0">The automated test suite:</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Creates a temporary test list (e.g., <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">๐Ÿงช Test List 14:23:45</code>)</li>
    <li style="color:#94a3b8;margin:3px 0">Runs all tests in isolation</li>
    <li style="color:#94a3b8;margin:3px 0">Deletes the test list on completion</li>
    <li style="color:#94a3b8;margin:3px 0">Cleans up any temporary files</li></p><p style="margin:8px 0">If tests are interrupted, you may need to manually delete leftover test lists.</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Agent Usage Guidelines</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Critical Rules</h4></p><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Working directory</strong>: Always <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">cd</code> to the directory containing this SKILL.md before running commands.
    2. <strong style="color:#e5e7eb">Dependency installation</strong>: Before first use or when encountering import errors, ensure all dependencies are installed.
    3. <strong style="color:#e5e7eb">Check authentication first</strong>: Before any operation, verify authentication status:</p><p style="margin:8px 0">   <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">   python3 scripts/ms-todo-oauth.py lists
       </code></pre></p><p style="margin:8px 0">   If this returns "Not logged in" error (exit code 1), initiate the login flow.
    4. <strong style="color:#e5e7eb">Task list organization</strong>: When adding tasks:</p><p style="margin:8px 0">   - First, run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">lists</code> to see available task lists
       - If user doesn't specify a list, tasks will be added to their <strong style="color:#e5e7eb">default list</strong> (usually "Tasks" or "ไปปๅŠก")
       - Intelligently categorize tasks into appropriate lists:
         - Work tasks โ†’ "Work" list
         - Personal errands โ†’ "Personal" or default list
         - Shopping โ†’ "Shopping" list
         - Project-specific โ†’ Use project name as list
       - Lists will be auto-created if they don't exist
       - Support Chinese list names and Unicode characters
    5. <strong style="color:#e5e7eb">Destructive operations</strong>: For <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete</code> and <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete-list</code>:</p><p style="margin:8px 0">   - These commands prompt for confirmation by default (blocking behavior)
       - Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-y</code> flag ONLY when:
         - User has explicitly requested to delete without confirmation
         - The deletion intent is unambiguous and confirmed through conversation
       - When in doubt, ask the user for confirmation instead of using <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-y</code>
       - These operations return exit code 1 on failure (resource not found)
    6. <strong style="color:#e5e7eb">Global option placement</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-v</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code>, and <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--reauth</code> must come BEFORE the subcommand:</p><p style="margin:8px 0">   - โœ… <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py -v lists</code>
       - โŒ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py lists -v</code>
    7. <strong style="color:#e5e7eb">Login flow</strong>:</p><p style="margin:8px 0">   - Do NOT call <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login verify</code> until user confirms they've completed browser authentication
       - Each authorization code can only be used once
       - If verify fails, you must run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code> again for a new code
    8. <strong style="color:#e5e7eb">Error handling</strong>:</p><p style="margin:8px 0">   - Check exit codes: 0 = success, 1 = failure, 2 = invalid arguments
       - Parse error messages to provide helpful guidance
       - Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code> flag when troubleshooting API issues</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Recommended Workflow for Agents</h4></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">Step 1: Setup and Authentication Check
    ---------------------------------------
    cd <skill_directory></p><p style="margin:8px 0">python3 scripts/ms-todo-oauth.py lists          # Test auth & see available lists</p><p style="margin:8px 0">If exit code is 1 and output contains "Not logged in":
      a. python3 scripts/ms-todo-oauth.py login get
      b. Present URL to user
      c. Explain: "Visit this URL, login, and copy the 'code' parameter from callback URL"
      d. Wait for user to provide authorization code
      e. python3 scripts/ms-todo-oauth.py login verify "<code>"
      f. Verify success (exit code 0)</p><p style="margin:8px 0">Step 2: Task Analysis and List Selection
    -----------------------------------------
    When user requests to add task(s):
      a. Analyze task context from user's description
      b. Review available lists (from Step 1 output)
      c. Choose appropriate list or use default:
         - Work-related โ†’ "Work"
         - Personal errands โ†’ "Personal" or default
         - Shopping items โ†’ "Shopping"
         - Project-specific โ†’ "<ProjectName>"
      d. If list doesn't exist, it will be auto-created</p><p style="margin:8px 0">Step 3: Execute Operation
    --------------------------
    Add task with appropriate options:
      python3 scripts/ms-todo-oauth.py add "Task Title" \
        -l "Work" \
        -p high \
        -d 3 \
        -r 2h \
        -D "Detailed description" \
        -t "tag1,tag2"</p><p style="margin:8px 0">Step 4: Verify and Report
    --------------------------
    Check exit code:
      - 0: Success โ†’ Confirm to user
      - 1: Failure โ†’ Parse error, provide guidance
      - 2: Invalid args โ†’ Fix command syntax</p><p style="margin:8px 0">Optionally verify:
      python3 scripts/ms-todo-oauth.py tasks "<list>"  # Show updated list
    </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Task Title Matching Rules</h4></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Exact match required</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">complete</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete</code> commands</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Partial/fuzzy match supported</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">detail</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> commands</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Case-insensitive</strong>: All search operations</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Best practice</strong>: Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> first to find exact title, then use it in subsequent commands</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Example workflow:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Find task with fuzzy search
    python3 scripts/ms-todo-oauth.py search "report"
    <h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Output shows: "Complete Q1 Report"</h2></p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Use exact title from search results</h2>
    python3 scripts/ms-todo-oauth.py complete "Complete Q1 Report" -l "Work"
    </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Default List Behavior</h4></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">When <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l</code> is not specified, operations use the Microsoft To Do default list</li>
    <li style="color:#94a3b8;margin:3px 0">The default list is typically named "Tasks" (English) or "ไปปๅŠก" (Chinese)</li>
    <li style="color:#94a3b8;margin:3px 0">To target a specific list, always provide <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">-l "<ListName>"</code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Example Task Categorization</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">User request:</strong> "Add these tasks: buy milk, finish report, call dentist"</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Agent approach:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># First check available lists
    python3 scripts/ms-todo-oauth.py lists</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Categorize intelligently:</h2>
    python3 scripts/ms-todo-oauth.py add "Buy milk" -l "Shopping"
    python3 scripts/ms-todo-oauth.py add "Finish report" -l "Work" -p high -d 2
    python3 scripts/ms-todo-oauth.py add "Call dentist" -l "Personal"
    <h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Or use default list if no specific context: add "Call dentist"</h2>
    </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Quick Reference</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Common Workflows</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Daily task review:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python3 scripts/ms-todo-oauth.py today          # Check today's tasks
    python3 scripts/ms-todo-oauth.py overdue        # Check overdue tasks
    python3 scripts/ms-todo-oauth.py -v pending -g  # Review all pending, grouped
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Adding various task types:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Simple task (default list)
    python3 scripts/ms-todo-oauth.py add "Buy milk"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Work task with priority and deadline</h2>
    python3 scripts/ms-todo-oauth.py add "Quarterly review" -l "Work" -p high -d 7</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Task with reminder</h2>
    python3 scripts/ms-todo-oauth.py add "Call client" -r 3h</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Detailed task with all options</h2>
    python3 scripts/ms-todo-oauth.py add "Project meeting" \
      -l "Work" \
      -p high \
      -d 2026-03-15 \
      -r "2026-03-15 14:30" \
      -D "Discuss Q1 goals and resource allocation" \
      -t "meeting,important,Q1"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Recurring tasks</h2>
    python3 scripts/ms-todo-oauth.py add "Daily standup" -R daily -l "Work"
    python3 scripts/ms-todo-oauth.py add "Weekly review" -R weekly -d 7
    python3 scripts/ms-todo-oauth.py add "Gym" -R weekdays -l "Personal"
    python3 scripts/ms-todo-oauth.py add "Monthly report" -R monthly -p high
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Task completion workflow:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Search for task
    python3 scripts/ms-todo-oauth.py search "report"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Complete using exact title from search results</h2>
    python3 scripts/ms-todo-oauth.py complete "Quarterly review" -l "Work"
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Data management:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Export for backup
    python3 scripts/ms-todo-oauth.py export -o "backup_$(date +%Y%m%d).json"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">View statistics</h2>
    python3 scripts/ms-todo-oauth.py stats
    </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Changelog</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Version 1.1.0 (Current)</h4></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Fixed</strong>: DateTime parsing errors (Microsoft's 7-decimal format)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Fixed</strong>: HTTP method parameter order bugs</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Fixed</strong>: Missing <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">start_date</code> parameter in <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">create_task()</code></li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Fixed</strong>: Missing <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">complete_task()</code> method</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Fixed</strong>: Error exit codes now correctly return 1 on failure</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Added</strong>: Comprehensive test suite (29 automated tests)</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Added</strong>: Better error messages and troubleshooting</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Improved</strong>: OAuth2 authentication flow documentation</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Improved</strong>: Unicode and emoji support documentation</li>
    <li style="color:#94a3b8;margin:3px 0">โœ… <strong style="color:#e5e7eb">Improved</strong>: Agent usage guidelines</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Version 1.0.2 (Previous)</h4></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Initial release with OAuth2 authentication</li>
    <li style="color:#94a3b8;margin:3px 0">Basic task and list management</li>
    <li style="color:#94a3b8;margin:3px 0">Recurring task support</li>
    <li style="color:#94a3b8;margin:3px 0">Multiple task views</li>
    <li style="color:#94a3b8;margin:3px 0">Data export functionality</li></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Troubleshooting</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Authentication Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Not logged in</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code>, complete browser flow, then <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login verify <code></code></li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Token acquisition failed: invalid_grant</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Cause</strong>: Authorization code already used or expired</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code> again to get a fresh code</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Login worked but now getting "Not logged in" again</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Cause</strong>: Token expired and auto-refresh failed</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--reauth</code> to force fresh login:</li>
      <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">  python3 scripts/ms-todo-oauth.py --reauth lists
      </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Import/Dependency Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">ModuleNotFoundError: No module named 'msal'</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Install dependencies: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pip install -r requirements.txt</code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">API/Network Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Connection timeout or network errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Internet connection</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Can you access https://graph.microsoft.com in browser?</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Using <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code> flag to see full API request/response</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Unexpected API errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Re-authenticate: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py --reauth lists</code></li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Debug mode: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py --debug <command></code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Task/List Not Found</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Task not found: <title></code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> to find exact title</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Note</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">complete</code> and <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete</code> require exact title match</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ List not found: <name></code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">lists</code> to see exact list names</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Note</strong>: List names are case-sensitive</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Test Failures</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Tests failing with datetime errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Ensure you've applied all v1.1.0 fixes</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Verify <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">_parse_ms_datetime()</code> helper function exists</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Tests failing with "Not logged in"</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Authenticate before running tests:</li>
      <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">  python3 scripts/ms-todo-oauth.py login get
      # Complete browser flow
      python3 scripts/ms-todo-oauth.py login verify <code>
      # Then run tests
      python3 test_ms_todo_oauth.py
      </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Additional Resources</h3></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Test Suite</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">test_ms_todo_oauth.py</code> - Automated tests</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Manual Tests</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">MANUAL_TEST_CHECKLIST.txt</code> - Step-by-step testing guide</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Quick Reference</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">QUICK_REFERENCE.txt</code> - Command cheat sheet</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Bug Fixes</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">COMPLETE_FIX_PATCH.txt</code> - Documentation of v1.1.0 fixes</li></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Support & Contributing</h3></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Reporting Issues:</strong></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Provide error message and command used</li>
    <li style="color:#94a3b8;margin:3px 0">Include output from <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code> flag if applicable</li>
    <li style="color:#94a3b8;margin:3px 0">Note your Python version: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 --version</code></li>
    <li style="color:#94a3b8;margin:3px 0">Note your OS: Windows/Mac/Linux</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Testing New Features:</strong></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">Always run the test suite after code changes</li>
    <li style="color:#94a3b8;margin:3px 0">Add new test cases to <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">test_ms_todo_oauth.py</code> for new features</li>
    <li style="color:#94a3b8;margin:3px 0">Update <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">MANUAL_TEST_CHECKLIST.txt</code> with manual test procedures</li></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">License</h3></p><p style="margin:8px 0">MIT License - See LICENSE file for details</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Version</strong>: 1.1.0
    <strong style="color:#e5e7eb">Last Updated</strong>: 2026-02-13
    <strong style="color:#e5e7eb">Status</strong>: โœ… Fully Tested & Production Ready
    </p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">โš™๏ธ Configuration</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Python >= 3.9</strong> must be installed
    2. <strong style="color:#e5e7eb">Working directory</strong>: All commands MUST be run from the root of this skill (the directory containing this SKILL.md file)
    3. <strong style="color:#e5e7eb">Network access</strong>: Requires internet access to Microsoft Graph API endpoints
    4. <strong style="color:#e5e7eb">Microsoft Account</strong>: Personal Microsoft account (Hotmail, Outlook.com) or work/school account
    5. <strong style="color:#e5e7eb">Authentication</strong>: First-time use requires OAuth2 login via browser. See <a href="#authentication" target="_blank" rel="noopener" style="color:#6366f1">Authentication</a> section
       - <strong style="color:#e5e7eb">Token cache</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">~/.mstodo_token_cache.json</code> (persists across sessions, auto-refreshed)</p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">๐Ÿ“‹ Tips & Best Practices</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Authentication Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Not logged in</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code>, complete browser flow, then <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login verify <code></code></li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Token acquisition failed: invalid_grant</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Cause</strong>: Authorization code already used or expired</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">login get</code> again to get a fresh code</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Login worked but now getting "Not logged in" again</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Cause</strong>: Token expired and auto-refresh failed</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--reauth</code> to force fresh login:</li>
      <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">  python3 scripts/ms-todo-oauth.py --reauth lists
      </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Import/Dependency Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">ModuleNotFoundError: No module named 'msal'</code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Install dependencies: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pip install -r requirements.txt</code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">API/Network Issues</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Connection timeout or network errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Internet connection</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Can you access https://graph.microsoft.com in browser?</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Using <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--debug</code> flag to see full API request/response</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Unexpected API errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Re-authenticate: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py --reauth lists</code></li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Try</strong>: Debug mode: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python3 scripts/ms-todo-oauth.py --debug <command></code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Task/List Not Found</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ Task not found: <title></code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">search</code> to find exact title</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Note</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">complete</code> and <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delete</code> require exact title match</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">โŒ List not found: <name></code></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">lists</code> to see exact list names</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Note</strong>: List names are case-sensitive</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Test Failures</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Tests failing with datetime errors</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Ensure you've applied all v1.1.0 fixes</li>
    <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Check</strong>: Verify <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">_parse_ms_datetime()</code> helper function exists</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Problem:</strong> Tests failing with "Not logged in"</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Solution</strong>: Authenticate before running tests:</li>
      <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">  python3 scripts/ms-todo-oauth.py login get
      # Complete browser flow
      python3 scripts/ms-todo-oauth.py login verify <code>
      # Then run tests
      python3 test_ms_todo_oauth.py
      </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p></div></section></div><div class="two-col-side"></div></div></div><script>
            document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn => {
              btn.addEventListener('click', () => {
                const cmd = btn.getAttribute('data-cmd');
                if (!cmd) return;
                navigator.clipboard.writeText(cmd).then(() => {
                  const orig = btn.textContent;
                  btn.textContent = 'Copied!';
                  setTimeout(() => btn.textContent = orig, 1500);
                }).catch(() => {});
              });
            });
          </script><!--$--><!--/$--></main><footer style="background:var(--bg-primary);border-top:1px solid var(--border-secondary);margin-top:60px"><div style="border-top:1px solid var(--border-light);max-width:1200px;margin:0 auto;padding:24px 20px"><div style="display:flex;justify-content:space-between;flex-wrap:wrap;gap:24px;margin-bottom:24px"><div><div style="font-weight:700;color:var(--text-muted);margin-bottom:8px">BytesAgain</div><div style="color:var(--text-muted3);font-size:.82em;max-width:200px">Discover the best AI agent skills for your workflow.</div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Explore</div><div style="margin-bottom:6px"><a href="/skills" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Skills</a></div><div style="margin-bottom:6px"><a href="/articles" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Articles</a></div><div style="margin-bottom:6px"><a href="/use-case" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Cases</a></div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Company</div><div style="margin-bottom:6px"><a href="/about" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">About</a></div><div style="margin-bottom:6px"><a href="/contact" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Contact</a></div><div style="margin-bottom:6px"><a href="/privacy-policy" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Privacy Policy</a></div><div style="margin-bottom:6px"><a href="/terms" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Terms</a></div><div style="margin-bottom:6px"><a href="/feedback" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Feedback</a></div></div></div><div style="border-top:1px solid var(--border-light);padding-top:16px"><div style="color:var(--text-muted4);font-size:.8em;margin-bottom:8px">ยฉ <!-- -->2026<!-- --> BytesAgain. All rights reserved.</div><div style="color:var(--text-muted5);font-size:.75em;line-height:1.6;max-width:720px">BytesAgain is an independent skill directory. We index and link to third-party content (ClawHub, GitHub, LobeHub, Dify, etc.) for informational purposes only. All trademarks, skill names, and content are the property of their respective owners. BytesAgain does not claim ownership of any indexed content.</div></div></div></footer><button style="position:fixed;bottom:28px;right:28px;z-index:1000;width:48px;height:48px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#667eea,#00d4ff);color:#fff;font-size:1.3em;box-shadow:0 4px 20px #667eea66;display:flex;align-items:center;justify-content:center;transition:transform .2s">๐Ÿ’ฌ</button><script src="/_next/static/chunks/0ze4gu236oq96.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[62894,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"LangProvider\"]\n3:I[89220,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ThemeProvider\"]\n4:I[16988,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\ne:I[68027,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\",1]\n:HL[\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"style\"]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n5:Td5e,"])</script><script>self.__next_f.push([1,"[{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"description\":\"Search 60,000+ verified AI agent skills via MCP API or REST. Supports 7 languages. Free, no auth required.\",\"inLanguage\":[\"en\",\"zh\",\"es\",\"fr\",\"de\",\"ja\",\"ko\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://bytesagain.com/skills?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://bytesagain.com/og-image.png\"},\"description\":\"AI agent skill directory. Search 60,000+ skills, 1,000+ use cases, and community requests.\",\"foundingDate\":\"2026\",\"foundingLocation\":{\"@type\":\"Place\",\"name\":\"Global\"},\"sameAs\":[\"https://x.com/bytesagain\",\"https://github.com/bytesagain/ai-skills\",\"https://clawhub.ai/profile/bytesagain\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"email\":\"hello@bytesagain.com\",\"contactType\":\"customer support\"},\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"value\":1}},{\"@context\":\"https://schema.org\",\"@type\":\"WebApplication\",\"name\":\"BytesAgain AI Skills Search\",\"url\":\"https://bytesagain.com\",\"applicationCategory\":\"DeveloperApplication\",\"operatingSystem\":\"Web\",\"description\":\"Search engine and MCP API for 60,000+ AI agent skills. Semantic search, role recommendations, and use case packs.\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"featureList\":[\"Search 60,000+ AI agent skills\",\"Role-based recommendations for developers, creators, and traders\",\"1,000+ curated use case packs\",\"Free MCP API and REST API\",\"Multi-language search (EN, ZH, ES, FR, DE, JA, KO)\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":\"https://bytesagain.com/skills?q={search_term_string}\",\"query-input\":\"required name=search_term_string\"},\"dateModified\":\"2026-07-21\"},{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What is BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"BytesAgain is a curated directory of 60,000+ AI agent skills from ClawHub, GitHub, LobeHub, and Dify. Search skills by keyword in 7 languages, browse by role (developer, creator, trader, marketer) or by use case.\"}},{\"@type\":\"Question\",\"name\":\"How do I find AI skills on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the search bar on BytesAgain.com to search by keyword in 7 languages. You can also browse by role (developer, creator, trader, marketer) or by use case. Each skill shows install instructions for Claude, Cursor, OpenClaw, Continue, and more.\"}},{\"@type\":\"Question\",\"name\":\"Is BytesAgain free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, BytesAgain is completely free. No registration required for searching skills. The MCP API is also free with rate limits.\"}},{\"@type\":\"Question\",\"name\":\"Does BytesAgain have an API for AI agents?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! BytesAgain provides a free MCP SSE endpoint at /api/mcp/sse for AI agents, plus a REST API at /api/mcp?action=search\u0026q=\u003cquery\u003e. No authentication needed.\"}},{\"@type\":\"Question\",\"name\":\"Can I request a new AI skill on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! Visit the Requests page on BytesAgain.com to submit a skill request. Your request will be visible to the community and notified to the site admin.\"}}]}]"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skill\",\"ms-todo-oauth\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skill\",{\"children\":[[\"slug\",\"ms-todo-oauth\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"llms\",\"href\":\"/llms.txt\"}],[\"$\",\"link\",null,{\"rel\":\"llms-full\",\"href\":\"/llms-full.txt\"}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3C1MM9FWYF\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n          window.dataLayer = window.dataLayer || [];\\n          function gtag(){dataLayer.push(arguments);}\\n          gtag('js', new Date());\\n          gtag('config', 'G-3C1MM9FWYF');\\n        \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_9e050971-module__05dp7a__className\",\"style\":{\"margin\":0},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":\"100%\",\"background\":\"var(--bg-subscribe)\",\"borderBottom\":\"1px solid var(--border-primary)\",\"padding\":\"8px 20px\",\"textAlign\":\"center\",\"fontSize\":\".82em\",\"color\":\"#818cf8\"},\"children\":[\"๐ŸŽ \",[\"$\",\"strong\",null,{\"style\":{\"color\":\"var(--text-primary)\"},\"children\":\"Get the FREE AI Skills Starter Guide\"}],\" โ€” \",[\"$\",\"a\",null,{\"href\":\"/register\",\"style\":{\"color\":\"#00d4ff\",\"textDecoration\":\"underline\"},\"children\":\"Subscribe โ†’\"}]]}],[\"$\",\"$L4\",null,{}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$5\"}}],\"$L6\",\"$L7\",\"$L8\"]}]}]}]]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:I[39756,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n11:I[37457,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n12:I[22016,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0ka051yepewro.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"\"]\n13:I[90940,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n14:I[16397,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n16:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"OutletBoundary\"]\n17:\"$Sreact.suspense\"\n1a:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ViewportBoundary\"]\n1c:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"main\",null,{\"children\":[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"main\",null,{\"style\":{\"minHeight\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"background\":\"#050611\",\"color\":\"#e5e7eb\"},\"children\":[[\"$\",\"style\",null,{\"children\":\"\\n        .nf-box { text-align: center; padding: 60px 32px; }\\n        .nf-code { font-size: 6rem; font-weight: 900; color: #22d3ee; line-height: 1; margin: 0; }\\n        .nf-title { font-size: 1.8rem; font-weight: 800; margin: 12px 0 8px; }\\n        .nf-desc { color: var(--text-muted2); font-size: 1rem; margin-bottom: 32px; max-width: 440px; }\\n        .nf-link { display: inline-block; padding: 12px 28px; background: linear-gradient(135deg,#34d399,#22d3ee); color: #000; font-weight: 900; border-radius: 12px; text-decoration: none; }\\n      \"}],[\"$\",\"div\",null,{\"className\":\"nf-box\",\"children\":[[\"$\",\"p\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"nf-title\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"nf-desc\",\"children\":\"The skill or page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L12\",null,{\"className\":\"nf-link\",\"href\":\"/\",\"children\":\"Back to BytesAgain\"}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"$L13\",null,{}]\n8:[\"$\",\"$L14\",null,{}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L15\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@18\"}]}]]}]\n19:[]\nc:\"$W19\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1a\",null,{\"children\":\"$L1b\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1d\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"1b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1e:I[27201,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"IconMark\"]\n18:null\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"title\",\"0\",{\"children\":\"Ms Todo Oauth โ€” AI Agent Skill | BytesAgain | BytesAgain\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"llms-txt\",\"content\":\"https://bytesagain.com/llms.txt\"}],[\"$\",\"meta\",\"5\",{\"name\":\"llms-full-txt\",\"content\":\"https://bytesagain.com/llms-full.txt\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://bytesagain.com/skill/ms-todo-oauth\"}],[\"$\",\"meta\",\"7\",{\"name\":\"baidu-site-verification\",\"content\":\"codeva-0evUqX1TFs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Ms Todo Oauth โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://bytesagain.com/skill/ms-todo-oauth\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"BytesAgain\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Ms Todo Oauth โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1e\",\"23\",{}]]\n"])</script><script>self.__next_f.push([1,"1f:T1562,"])</script><script>self.__next_f.push([1,"\n        .skill-page { max-width: 1100px; margin: 0 auto; padding: 32px 20px 80px; }\n        .two-col { display: flex; gap: 32px; align-items: flex-start; }\n        .two-col-main { flex: 1; min-width: 0; }\n        .two-col-side { width: 300px; flex-shrink: 0; }\n        @media (max-width: 860px) {\n          .two-col { flex-direction: column; }\n          .two-col-side { width: 100%; }\n        }\n        .breadcrumb { font-size: .82em; color: var(--text-muted2); margin-bottom: 28px; }\n        .breadcrumb a { color: #818cf8; text-decoration: none; }\n        .breadcrumb a:hover { text-decoration: underline; }\n        .skill-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 20px; padding: 28px; margin-bottom: 24px; }\n        .skill-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n        .skill-badges { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n        .skill-top-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }\n        .badge { display: inline-flex; align-items: center; gap: 5px; font-size: .75em; font-weight: 600; padding: 4px 12px; border-radius: 999px; border: 1px solid transparent; }\n        .skill-title { font-size: 1.6em; font-weight: 800; color: var(--text-primary); margin: 0 0 4px; line-height: 1.2; }\n        .skill-owner { font-size: .82em; color: var(--text-muted2); margin: 0 0 14px; }\n        .skill-owner span { color: #818cf8; }\n        .skill-desc { font-size: .92em; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }\n        .skill-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-card); }\n        .meta-item { display: flex; flex-direction: column; gap: 2px; }\n        .meta-label { font-size: .7em; color: var(--text-muted5); text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }\n        .meta-value { font-size: .92em; color: var(--text-muted2); font-weight: 600; }\n        .tags-row { display: flex; gap: 6px; flex-wrap: wrap; }\n        .tag { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 3px 10px; text-decoration: none; }\n        .tag:hover { background: #6366f125; }\n        .install-box { background: var(--bg-deep); border: 1px solid var(--border-card); border-radius: 12px; overflow: hidden; margin-bottom: 24px; }\n        .install-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid var(--border-card); }\n        .install-dots { display: flex; gap: 6px; }\n        .dot { width: 10px; height: 10px; border-radius: 50%; }\n        .install-label { font-size: .72em; color: var(--text-muted5); font-family: monospace; letter-spacing: 1px; }\n        .install-body { padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n        .install-cmd { color: var(--text-code);\n font-family: 'Courier New', monospace; font-size: 1em; }\n        .copy-btn { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 5px 12px; cursor: pointer; white-space: nowrap; transition: all .15s; }\n        .copy-btn:hover { background: #6366f125; }\n        .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 13px 24px; background: transparent; border: 1px solid var(--border-card); border-radius: 10px; color: #6b7280; text-decoration: none; font-weight: 600; font-size: .95em; transition: all .15s; }\n        .btn-secondary:hover { border-color: #818cf8; color: #818cf8; }\n        .ours-badge { display: inline-flex; align-items: center; gap: 6px; font-size: .72em; font-weight: 700; color: #22d3ee; background: #22d3ee10; border: 1px solid #22d3ee30; border-radius: 999px; padding: 4px 14px; }\n        .section-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 16px; padding: 22px 24px; margin-bottom: 20px; }\n        .section-title { color: var(--text-primary); font-size: 1.08em; font-weight: 800; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }\n        /* Script box */\n        .script-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--bg-input); border-bottom: 1px solid var(--border-card); }\n        .script-filename { font-size: .72em; color: var(--text-muted2); font-family: 'Courier New', monospace; }\n        .script-copy-btn { font-size: .72em; color: #6366f1; background: none; border: 1px solid #6366f130; border-radius: 4px; padding: 2px 10px; cursor: pointer; }\n        .script-copy-btn:hover { background: #6366f115; }\n        .script-body { padding: 14px 16px; font-family: 'Courier New', monospace; font-size: .82em; line-height: 1.6; color: var(--text-code); overflow-x: auto; max-height: 420px; overflow-y: auto; white-space: pre; }\n        /* Articles */\n        .article-card { display: block; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 10px; padding: 14px 16px; text-decoration: none; transition: border-color .15s; }\n        .article-card:hover { border-color: #6366f1; }\n        @media (max-width: 600px) {\n          .skill-card { padding: 20px; }\n          .skill-title { font-size: 1.5em; }\n        }\n      "])</script><script>self.__next_f.push([1,"15:[[\"$\",\"style\",null,{\"children\":\"$1f\"}],\"$L20\",\"$L21\"]\n"])</script><script>self.__next_f.push([1,"22:I[78297,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n23:T14a38,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\nname: ms-todo-oauth\ndescription: \u003e\n  A robust CLI skill to manage Microsoft To Do tasks via Microsoft Graph API.\n  Supports full task lifecycle management including lists, tasks with priorities,\n  due dates, reminders, recurrence patterns, views, search, and data export.\n  Includes comprehensive test suite for reliability.\n  THIS IS A REVISED OAUTH2-BASED VERSION OF ms-todo-sync with AI ASSISTANCE.\n  ALL CREDITS TO THE ORIGINAL AUTHOR.\nmetadata:\n  version: 1.0.3\n  author: yalonghan@gmaill.com\n  license: MIT License\n  tags: [productivity, task-management, microsoft-todo, cli, graph-api, tested]\n  category: productivity\n  tested: true\n  test_coverage: 29 comprehensive tests\n\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003ems-todo-oauth\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eA fully-tested Microsoft To Do command-line client for managing tasks and lists via Microsoft Graph API.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eโš ๏ธThis is a oauth based script. It contains a generated Azure Client ID and Secret ID\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIF YOU WORRIED ABOUT YOUR PRIVACY, CONSIDER REPLACING THEM TO YOUR OWN IN \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts\\ms-todo-oauth.py\u003c/code\u003e.\nJust search for values below:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eclient_id=\"ca6ec244โ€ฆโ€ฆ\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eclient_secret=\"TwQ8Qโ€ฆโ€ฆ\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eโœจ Features\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFull Task Management\u003c/strong\u003e: Create, complete, delete, and search tasks\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿ—‚๏ธ \u003cstrong style=\"color:#e5e7eb\"\u003eList Organization\u003c/strong\u003e: Create and manage multiple task lists\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโฐ \u003cstrong style=\"color:#e5e7eb\"\u003eRich Task Options\u003c/strong\u003e: Priorities, due dates, reminders, descriptions, tags\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿ”„ \u003cstrong style=\"color:#e5e7eb\"\u003eRecurring Tasks\u003c/strong\u003e: Daily, weekly, monthly patterns with custom intervals\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿ“Š \u003cstrong style=\"color:#e5e7eb\"\u003eMultiple Views\u003c/strong\u003e: Today, overdue, pending, statistics\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿ” \u003cstrong style=\"color:#e5e7eb\"\u003ePowerful Search\u003c/strong\u003e: Find tasks across all lists\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿ’พ \u003cstrong style=\"color:#e5e7eb\"\u003eData Export\u003c/strong\u003e: Export all tasks to JSON\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐Ÿงช \u003cstrong style=\"color:#e5e7eb\"\u003eFully Tested\u003c/strong\u003e: 29 comprehensive automated tests\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e๐ŸŒ \u003cstrong style=\"color:#e5e7eb\"\u003eUnicode Support\u003c/strong\u003e: Full support for Chinese characters and emojis\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePrerequisites\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003ePython \u003e= 3.9\u003c/strong\u003e must be installed\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eWorking directory\u003c/strong\u003e: All commands MUST be run from the root of this skill (the directory containing this SKILL.md file)\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eNetwork access\u003c/strong\u003e: Requires internet access to Microsoft Graph API endpoints\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eMicrosoft Account\u003c/strong\u003e: Personal Microsoft account (Hotmail, Outlook.com) or work/school account\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eAuthentication\u003c/strong\u003e: First-time use requires OAuth2 login via browser. See \u003ca href=\"#authentication\" target=\"_blank\" rel=\"noopener\" style=\"color:#6366f1\"\u003eAuthentication\u003c/a\u003e section\n   - \u003cstrong style=\"color:#e5e7eb\"\u003eToken cache\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e~/.mstodo_token_cache.json\u003c/code\u003e (persists across sessions, auto-refreshed)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eInstallation \u0026 Setup\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eFirst-Time Setup\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBefore using this skill for the first time, dependencies must be installed:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Navigate to skill directory\ncd \u003cpath-to-ms-todo-oauth\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eCreate a venv in the project (creates '.venv' folder)\u003c/h2\u003e\npython3 -m venv .venv\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eActivate the venv choose based on platforms:\u003c/h2\u003e\n#- Bash/Zsh: \nsource .venv/bin/activate\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003e- Fish: \u003c/h2\u003e\nsource .venv/bin/activate.fish\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003e - Windows (PowerShell):\u003c/h2\u003e\n.venv\\Scripts\\Activate.ps1\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003epip install --upgrade pip\npip install -r requirements.txt\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eAlternative (global python env, not recommended):\u003c/h2\u003e\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003epip install -r requirements.txt\u003c/h2\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDependencies:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emsal\u003c/code\u003e (Microsoft Authentication Library) - Official Microsoft OAuth library\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erequests\u003c/code\u003e - HTTP client for API calls\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eSpecified in \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erequirements.txt\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eEnvironment Verification\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAfter installation, verify the setup:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eIf using native venv (activate as above):\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py --help\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eExpected: Command help text should be displayed\u003c/h2\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTroubleshooting:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eIf \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ePython not found\u003c/code\u003e, install Python 3.9 or higher from https://python.org\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTesting (Optional but Recommended)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eVerify all functionality works correctly:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Run comprehensive automated test suite (29 tests)\npython3 test_ms_todo_oauth.py\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eExpected: All tests pass (100% pass rate)\u003c/h2\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSee \u003ca href=\"#testing\" target=\"_blank\" rel=\"noopener\" style=\"color:#6366f1\"\u003eTesting\u003c/a\u003e section for details.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eSecurity Notes\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUses official Microsoft Graph API via Microsoft's \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emsal\u003c/code\u003e library\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAll code is plain Python (.py files), readable and auditable\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eTokens stored locally in \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e~/.mstodo_token_cache.json\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAll API calls go directly to Microsoft endpoints (graph.microsoft.com)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eOAuth2 standard authentication flow\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNo third-party services involved\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eCommand Reference\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAll commands follow this pattern:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py [GLOBAL_OPTIONS] \u003ccommand\u003e [COMMAND_OPTIONS]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eGlobal Options\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option            | Description                                                                                                                         |\n| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-v, --verbose\u003c/code\u003e | Show detailed information (IDs, dates, notes).\u003cstrong style=\"color:#e5e7eb\"\u003eMust be placed BEFORE the subcommand.\u003c/strong\u003e                                       |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e       | Enable debug mode to display API requests and responses. Useful for troubleshooting.\u003cstrong style=\"color:#e5e7eb\"\u003eMust be placed BEFORE the subcommand.\u003c/strong\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--reauth\u003c/code\u003e      | Force re-authentication by clearing the token cache and starting fresh login                                                        |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e โš ๏ธ \u003cstrong style=\"color:#e5e7eb\"\u003eCommon mistake\u003c/strong\u003e: Global options MUST come before the subcommand.\n\u003e\n\u003e - โœ… \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py -v lists\u003c/code\u003e\n\u003e - โœ… \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py --debug add \"Task\"\u003c/code\u003e\n\u003e - โŒ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py lists -v\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAuthentication\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAuthentication uses OAuth2 authorization code flow, designed for both interactive and automated environments.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e โ€” Get OAuth2 authorization URL\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py login get\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e======================================================================\n๐Ÿ” OAuth2 Authorization Required\n======================================================================\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003ePlease visit the following URL to authorize the application:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e  https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?...\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAfter authorization, you will be redirected to a callback URL.\nCopy the 'code' parameter from the callback URL and run:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e  ms-todo-oauth.py login verify \u003cauthorization_code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e======================================================================\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWhat to do:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Open the provided URL in your browser\n2. Sign in with your Microsoft account\n3. Grant permissions when prompted\n4. You'll be redirected to a URL like: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ehttp://localhost:8000/callback?code=M.R3_BAY.abc123...\u003c/code\u003e\n5. Copy the entire code after \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecode=\u003c/code\u003e (usually a long string starting with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eM.R3_BAY.\u003c/code\u003e)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAgent behavior\u003c/strong\u003e: Present the URL to the user and explain they need to:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Visit the URL\n2. Complete the login\n3. Copy the authorization code from the callback URL\n4. Provide it to you\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin verify\u003c/code\u003e โ€” Complete login with authorization code\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py login verify \u003cauthorization_code\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExample:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py login verify \"M.R3_BAY.abc123def456...\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput on success:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโœ“ Authentication successful!\nโœ“ Login information saved, you will be logged in automatically next time.\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput on failure:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโŒ Token acquisition failed\nError: invalid_grant\nDescription: AADSTS54005: OAuth2 Authorization code was already redeemed...\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExit code\u003c/strong\u003e: 0 on success, 1 on failure.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eImportant notes:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eEach authorization code can only be used ONCE\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eIf verification fails, you need to run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e again to get a new code\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eOnce successfully logged in, the token is cached and you won't need to login again unless:\u003c/li\u003e\n  - You run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogout\u003c/code\u003e\n  - You run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--reauth\u003c/code\u003e\n  - The token expires and cannot be auto-refreshed\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogout\u003c/code\u003e โ€” Clear saved login\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py logout\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOutput: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ Login information cleared\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOnly use when the user explicitly asks to switch accounts or clear login data. Under normal circumstances, the token is cached and login is automatic.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eList Management\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elists\u003c/code\u003e โ€” List all task lists\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py lists\npython3 scripts/ms-todo-oauth.py -v lists  # with IDs and creation dates\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“‹ Task Lists (3 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. ไปปๅŠก\n   ID: AQMkADAwATYwMAItYTQwZC04OThhLTAwAi0wMAoALgAAA0QJKpxW32BIsIlHaM...\n   Created: 2024-12-15T08:30:00Z\n2. Work\n3. Shopping\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecreate-list\u003c/code\u003e โ€” Create a new list\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py create-list \"\u003cname\u003e\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Argument | Required | Description                                     |\n| -------- | -------- | ----------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ename\u003c/code\u003e | Yes      | Name of the new list (supports Unicode/Chinese) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExample:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py create-list \"้กน็›ฎ A\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOutput: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ List created: ้กน็›ฎ A\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete-list\u003c/code\u003e โ€” Delete a list\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py delete-list \"\u003cname\u003e\" [-y]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Argument/Option | Required | Description                |\n| --------------- | -------- | -------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ename\u003c/code\u003e        | Yes      | Name of the list to delete |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y, --yes\u003c/code\u003e   | No       | Skip confirmation prompt   |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e โš ๏ธ \u003cstrong style=\"color:#e5e7eb\"\u003eThis is a destructive operation\u003c/strong\u003e. Without \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y\u003c/code\u003e, the command will prompt for confirmation. All tasks in the list will be deleted. Consider asking the user before deleting important lists.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOutput: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ List deleted: \u003cname\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExit code\u003c/strong\u003e: 1 if list not found, 0 on success\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTask Operations\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eadd\u003c/code\u003e โ€” Add a new task\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py add \"\u003ctitle\u003e\" [options]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option                | Required | Default        | Description                                                                                                                                                                                                                             |\n| --------------------- | -------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etitle\u003c/code\u003e             | Yes      | โ€”             | Task title (positional argument, supports Unicode/Chinese/emojis)                                                                                                                                                                       |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l, --list\u003c/code\u003e        | No       | (default list) | Target list name. If not specified, uses your Microsoft To Do default list.                                                                                                                                                             |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-p, --priority\u003c/code\u003e    | No       | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enormal\u003c/code\u003e     | Priority:\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elow\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enormal\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ehigh\u003c/code\u003e                                                                                                                                                                                                  |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-d, --due\u003c/code\u003e         | No       | โ€”             | Due date. Accepts days from now (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e3\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e3d\u003c/code\u003e) or date (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2026-02-15\u003c/code\u003e). \u003cstrong style=\"color:#e5e7eb\"\u003eNote:\u003c/strong\u003e Only date is supported by Microsoft To Do API, not time.                                                                                    |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-r, --reminder\u003c/code\u003e    | No       | โ€”             | Reminder datetime. Formats:\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e3h\u003c/code\u003e (hours from now), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2d\u003c/code\u003e (days from now), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2026-02-15 14:30\u003c/code\u003e (date+time with space, needs quotes), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2026-02-15T14:30:00\u003c/code\u003e (ISO format), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2026-02-15\u003c/code\u003e (date only, defaults to 09:00).             |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-R, --recurrence\u003c/code\u003e  | No       | โ€”             | Recurrence pattern. Formats:\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edaily\u003c/code\u003e (every day), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eweekdays\u003c/code\u003e (Mon-Fri), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eweekly\u003c/code\u003e (every week), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emonthly\u003c/code\u003e (every month). With interval: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edaily:2\u003c/code\u003e (every 2 days), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eweekly:3\u003c/code\u003e (every 3 weeks), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emonthly:2\u003c/code\u003e (every 2 months). |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-D, --description\u003c/code\u003e | No       | โ€”             | Task description/notes (supports multiline with quotes)                                                                                                                                                                                 |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-t, --tags\u003c/code\u003e        | No       | โ€”             | Comma-separated tags/categories (e.g.,\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e\"work,urgent\"\u003c/code\u003e)                                                                                                                                                                                |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--create-list\u003c/code\u003e     | No       | False          | Create the list if it doesn't exist (deprecated, lists auto-create now)                                                                                                                                                                 |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAuto-created lists\u003c/strong\u003e: If the specified list doesn't exist, it will be automatically created.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโœ“ Task added: Complete report\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWith recurrence:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโœ“ Task added: Daily standup\n๐Ÿ”„ Recurring task created\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExamples:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Simple task\npython3 scripts/ms-todo-oauth.py add \"Buy milk\" -l \"Shopping\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eHigh priority task due in 3 days\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Submit report\" -l \"Work\" -p high -d 3\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eTask with reminder in 2 hours\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Call client\" -r 2h\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eTask with specific date and time reminder\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Meeting\" -d 2026-03-15 -r \"2026-03-15 14:30\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eDaily recurring task\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Daily standup\" -l \"Work\" -R daily\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eWeekday recurring task  \u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Gym\" -R weekdays -l \"Personal\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eTask with all options\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Project Review\" \\\n  -l \"Work\" \\\n  -p high \\\n  -d 7 \\\n  -r \"2026-02-20 14:00\" \\\n  -D \"Review Q1 deliverables and prepare presentation\" \\\n  -t \"work,important,meeting\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eChinese task with emoji\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"๐ŸŽ‰ ๅฎŒๆˆ้กน็›ฎ\" -l \"ไปปๅŠก\" -p high\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecomplete\u003c/code\u003e โ€” Mark a task as completed\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py complete \"\u003ctitle\u003e\" [-l \"\u003clist\u003e\"]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option         | Required | Default        | Description                      |\n| -------------- | -------- | -------------- | -------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etitle\u003c/code\u003e      | Yes      | โ€”             | \u003cstrong style=\"color:#e5e7eb\"\u003eExact\u003c/strong\u003e task title       |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l, --list\u003c/code\u003e | No       | (default list) | List name where the task resides |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTitle matching\u003c/strong\u003e: Requires \u003cstrong style=\"color:#e5e7eb\"\u003eexact match\u003c/strong\u003e. If unsure of exact title, use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e first.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOutput: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ Task completed: \u003ctitle\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExit code\u003c/strong\u003e: 1 if task not found, 0 on success\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete\u003c/code\u003e โ€” Delete a task\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py delete \"\u003ctitle\u003e\" [-l \"\u003clist\u003e\"] [-y]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option         | Required | Default        | Description                      |\n| -------------- | -------- | -------------- | -------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etitle\u003c/code\u003e      | Yes      | โ€”             | \u003cstrong style=\"color:#e5e7eb\"\u003eExact\u003c/strong\u003e task title       |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l, --list\u003c/code\u003e | No       | (default list) | List name where the task resides |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y, --yes\u003c/code\u003e  | No       | โ€”             | Skip confirmation prompt         |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e โš ๏ธ \u003cstrong style=\"color:#e5e7eb\"\u003eDestructive operation\u003c/strong\u003e. Without \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y\u003c/code\u003e, will prompt for confirmation.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOutput: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ Task deleted: \u003ctitle\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExit code\u003c/strong\u003e: 1 if task not found, 0 on success\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTask Views\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etasks\u003c/code\u003e โ€” List tasks in a specific list\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py tasks \"\u003clist\u003e\" [-a]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option        | Required | Description                                        |\n| ------------- | -------- | -------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elist\u003c/code\u003e      | Yes      | List name (exact match)                            |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-a, --all\u003c/code\u003e | No       | Include completed tasks (default: incomplete only) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“‹ Tasks in list \"Work\" (2 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. [In Progress] Write documentation โญ\n2. [In Progress] Review PR\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWith \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-a\u003c/code\u003e flag:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“‹ Tasks in list \"Work\" (3 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. [In Progress] Write documentation โญ\n2. [Completed] Submit report\n3. [In Progress] Review PR\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExit code\u003c/strong\u003e: 1 if list not found, 0 on success\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending\u003c/code\u003e โ€” All incomplete tasks across all lists\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py pending [-g]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option          | Required | Description           |\n| --------------- | -------- | --------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-g, --group\u003c/code\u003e | No       | Group results by list |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example (with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-g\u003c/code\u003e):\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“‹ All incomplete tasks (3 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ“‚ Work:\n  [In Progress] Write documentation โญ\n  [In Progress] Review PR\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ“‚ Shopping:\n  [In Progress] Buy groceries\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWithout \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-g\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“‹ All incomplete tasks (3 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e[In Progress] Write documentation โญ\n   List: Work\n[In Progress] Review PR\n   List: Work\n[In Progress] Buy groceries\n   List: Shopping\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etoday\u003c/code\u003e โ€” Tasks due today\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py today\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eLists incomplete tasks with due date matching today's date.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“… Tasks due today (2 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e[In Progress] Submit report โญ\n   List: Work\n[In Progress] Buy groceries\n   List: Shopping\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIf no tasks: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e๐Ÿ“… No tasks due today\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eoverdue\u003c/code\u003e โ€” Overdue tasks\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py overdue\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eLists incomplete tasks past their due date, sorted by days overdue.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโš ๏ธ  Overdue tasks (1 total):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e[In Progress] Submit report โญ\n   List: Work\n   Overdue: 3 days\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIf no overdue tasks: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ No overdue tasks\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edetail\u003c/code\u003e โ€” View full task details\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py detail \"\u003ctitle\u003e\" [-l \"\u003clist\u003e\"]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option         | Required | Default        | Description                                        |\n| -------------- | -------- | -------------- | -------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etitle\u003c/code\u003e      | Yes      | โ€”             | Task title (supports\u003cstrong style=\"color:#e5e7eb\"\u003epartial/fuzzy match\u003c/strong\u003e) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l, --list\u003c/code\u003e | No       | (default list) | List name                                          |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eFuzzy matching\u003c/strong\u003e: Matches tasks containing the search string (case-insensitive).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eWhen multiple tasks match:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003ePrefers \u003cstrong style=\"color:#e5e7eb\"\u003eincomplete\u003c/strong\u003e tasks over completed\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eReturns most recently modified task\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e============================================================\n๐Ÿ“Œ Task Details\n============================================================\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ“‹ Title: Complete Q1 Report\n๐Ÿ”– Status: [In Progress]\nโšก Priority: โญ High\n๐Ÿ“… Created: 2026-01-15 08:30:00\n๐Ÿ“ Modified: 2026-02-10 14:22:00\nโฐ Due: 2026-02-20 00:00:00\n๐Ÿ”” Reminder: 2026-02-20 09:00:00\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ“ Notes:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eReview sales figures\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eInclude charts\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003ePrepare for board meeting\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿท๏ธ  Categories: work, important, Q1\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ”„ Recurrence:\n   Every week on Monday\n   Start date: 2026-02-17\n   No end date\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e============================================================\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e โ€” Search tasks by keyword\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py search \"\u003ckeyword\u003e\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSearches across \u003cstrong style=\"color:#e5e7eb\"\u003eall lists\u003c/strong\u003e in both task titles and descriptions (case-insensitive).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ” Search results for \"report\" (2 found):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e[In Progress] Complete Q1 Report โญ\n   List: Work\n   Notes: Review sales figures...\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e[Completed] Submit weekly report\n   List: Work\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estats\u003c/code\u003e โ€” Task statistics\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py stats\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eShows aggregate statistics across all lists.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput example:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ“Š Task Statistics:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e  Total lists: 3\n  Total tasks: 15\n  Completed: 10\n  Pending: 5\n  High priority: 2\n  Overdue: 1\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e  Completion rate: 66.7%\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e#### \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eexport\u003c/code\u003e โ€” Export all tasks to JSON\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py export [-o \"\u003cfilename\u003e\"]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option           | Required | Default              | Description      |\n| ---------------- | -------- | -------------------- | ---------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-o, --output\u003c/code\u003e | No       | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etodo_export.json\u003c/code\u003e | Output file path |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eExports complete task data from all lists in JSON format.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโœ“ Tasks exported to: \u003cfilename\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eJSON structure:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e{\n  \"Work\": [\n    {\n      \"id\": \"AQMkADAwATYwMAItYTQw...\",\n      \"title\": \"Complete report\",\n      \"status\": \"notStarted\",\n      \"importance\": \"high\",\n      \"createdDateTime\": \"2026-01-15T08:30:00Z\",\n      \"dueDateTime\": {\n        \"dateTime\": \"2026-02-20T00:00:00.0000000\",\n        \"timeZone\": \"UTC\"\n      },\n      \"body\": {\n        \"content\": \"Review Q1 numbers\",\n        \"contentType\": \"text\"\n      },\n      \"categories\": [\"work\", \"important\"]\n    }\n  ],\n  \"Shopping\": [...]\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eError Handling\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eExit Codes\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Code  | Meaning                                                                   |\n| ----- | ------------------------------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e0\u003c/code\u003e | Success                                                                   |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e1\u003c/code\u003e | Failure (not logged in, API error, invalid arguments, resource not found) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e2\u003c/code\u003e | Invalid command-line arguments                                            |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eCommon Error Messages\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Error                                           | Cause                             | Resolution                                                                  |\n| ----------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------- |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Not logged in\u003c/code\u003e                            | No cached token or token expired  | Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e then \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin verify \u003ccode\u003e\u003c/code\u003e                              |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eModuleNotFoundError: No module named 'msal'\u003c/code\u003e | Dependencies not installed        | Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epip install -r requirements.txt\u003c/code\u003e                      |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ List not found: \u003cname\u003e\u003c/code\u003e                   | Specified list does not exist     | Check list name with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elists\u003c/code\u003e command. Note: exact match required.         |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Task not found: \u003cname\u003e\u003c/code\u003e                   | No task with exact matching title | Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e to find exact title, or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etasks \"\u003clist\u003e\"\u003c/code\u003e to list all tasks |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Error: Invalid isoformat string\u003c/code\u003e          | DateTime parsing error            | This should not occur in v1.1.0+. If you see this, report as bug.           |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Error: Unsupported HTTP method\u003c/code\u003e           | Internal API error                | This should not occur in v1.1.0+. If you see this, report as bug.           |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Error: \u003cAPI error message\u003e\u003c/code\u003e               | Microsoft Graph API error         | Retry; check network; use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e for full details                      |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eNetwork error\u003c/code\u003e / \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eConnection timeout\u003c/code\u003e      | No internet or API unreachable    | Check network connection; verify access to graph.microsoft.com              |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eTesting\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThis skill includes a comprehensive test suite to ensure reliability.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAutomated Testing\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eRun the full test suite:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003ecd \u003cskill-directory\u003e\npython3 test_ms_todo_oauth.py\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003ePrerequisites:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eMust be authenticated (logged in) before running tests\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eInternet connection required\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eApproximately 2-3 minutes to complete\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTest Coverage\u003c/strong\u003e (29 tests):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Authentication (login/logout)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… List management (create, delete, list)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Basic task operations (add, complete, delete, list)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Task options (priorities, due dates, reminders, descriptions, tags)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Recurring tasks (daily, weekly, weekdays, monthly, custom intervals)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Task views (today, overdue, pending, search, stats)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Data export and validation\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Error handling (non-existent resources)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… Unicode support (Chinese characters, emojis)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExpected output:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e========================================================================\nTEST SUMMARY\n========================================================================\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eTotal tests: 29\nPassed: 29\nFailed: 0\nPass rate: 100.0%\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e========================================================================\n๐ŸŽ‰ ALL TESTS PASSED! ๐ŸŽ‰\n========================================================================\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eManual Testing\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eFor manual verification, see \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eMANUAL_TEST_CHECKLIST.txt\u003c/code\u003e which provides:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eStep-by-step test procedures\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eExpected outcomes\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e9 test categories covering all functionality\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTest Cleanup\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThe automated test suite:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eCreates a temporary test list (e.g., \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e๐Ÿงช Test List 14:23:45\u003c/code\u003e)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eRuns all tests in isolation\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eDeletes the test list on completion\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eCleans up any temporary files\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIf tests are interrupted, you may need to manually delete leftover test lists.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eAgent Usage Guidelines\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eCritical Rules\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003eWorking directory\u003c/strong\u003e: Always \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecd\u003c/code\u003e to the directory containing this SKILL.md before running commands.\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eDependency installation\u003c/strong\u003e: Before first use or when encountering import errors, ensure all dependencies are installed.\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eCheck authentication first\u003c/strong\u003e: Before any operation, verify authentication status:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e   python3 scripts/ms-todo-oauth.py lists\n   \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   If this returns \"Not logged in\" error (exit code 1), initiate the login flow.\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eTask list organization\u003c/strong\u003e: When adding tasks:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   - First, run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elists\u003c/code\u003e to see available task lists\n   - If user doesn't specify a list, tasks will be added to their \u003cstrong style=\"color:#e5e7eb\"\u003edefault list\u003c/strong\u003e (usually \"Tasks\" or \"ไปปๅŠก\")\n   - Intelligently categorize tasks into appropriate lists:\n     - Work tasks โ†’ \"Work\" list\n     - Personal errands โ†’ \"Personal\" or default list\n     - Shopping โ†’ \"Shopping\" list\n     - Project-specific โ†’ Use project name as list\n   - Lists will be auto-created if they don't exist\n   - Support Chinese list names and Unicode characters\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eDestructive operations\u003c/strong\u003e: For \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete\u003c/code\u003e and \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete-list\u003c/code\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   - These commands prompt for confirmation by default (blocking behavior)\n   - Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y\u003c/code\u003e flag ONLY when:\n     - User has explicitly requested to delete without confirmation\n     - The deletion intent is unambiguous and confirmed through conversation\n   - When in doubt, ask the user for confirmation instead of using \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-y\u003c/code\u003e\n   - These operations return exit code 1 on failure (resource not found)\n6. \u003cstrong style=\"color:#e5e7eb\"\u003eGlobal option placement\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-v\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e, and \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--reauth\u003c/code\u003e must come BEFORE the subcommand:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   - โœ… \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py -v lists\u003c/code\u003e\n   - โŒ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py lists -v\u003c/code\u003e\n7. \u003cstrong style=\"color:#e5e7eb\"\u003eLogin flow\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   - Do NOT call \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin verify\u003c/code\u003e until user confirms they've completed browser authentication\n   - Each authorization code can only be used once\n   - If verify fails, you must run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e again for a new code\n8. \u003cstrong style=\"color:#e5e7eb\"\u003eError handling\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e   - Check exit codes: 0 = success, 1 = failure, 2 = invalid arguments\n   - Parse error messages to provide helpful guidance\n   - Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e flag when troubleshooting API issues\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eRecommended Workflow for Agents\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eStep 1: Setup and Authentication Check\n---------------------------------------\ncd \u003cskill_directory\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003epython3 scripts/ms-todo-oauth.py lists          # Test auth \u0026 see available lists\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIf exit code is 1 and output contains \"Not logged in\":\n  a. python3 scripts/ms-todo-oauth.py login get\n  b. Present URL to user\n  c. Explain: \"Visit this URL, login, and copy the 'code' parameter from callback URL\"\n  d. Wait for user to provide authorization code\n  e. python3 scripts/ms-todo-oauth.py login verify \"\u003ccode\u003e\"\n  f. Verify success (exit code 0)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eStep 2: Task Analysis and List Selection\n-----------------------------------------\nWhen user requests to add task(s):\n  a. Analyze task context from user's description\n  b. Review available lists (from Step 1 output)\n  c. Choose appropriate list or use default:\n     - Work-related โ†’ \"Work\"\n     - Personal errands โ†’ \"Personal\" or default\n     - Shopping items โ†’ \"Shopping\"\n     - Project-specific โ†’ \"\u003cProjectName\u003e\"\n  d. If list doesn't exist, it will be auto-created\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eStep 3: Execute Operation\n--------------------------\nAdd task with appropriate options:\n  python3 scripts/ms-todo-oauth.py add \"Task Title\" \\\n    -l \"Work\" \\\n    -p high \\\n    -d 3 \\\n    -r 2h \\\n    -D \"Detailed description\" \\\n    -t \"tag1,tag2\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eStep 4: Verify and Report\n--------------------------\nCheck exit code:\n  - 0: Success โ†’ Confirm to user\n  - 1: Failure โ†’ Parse error, provide guidance\n  - 2: Invalid args โ†’ Fix command syntax\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOptionally verify:\n  python3 scripts/ms-todo-oauth.py tasks \"\u003clist\u003e\"  # Show updated list\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTask Title Matching Rules\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExact match required\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecomplete\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete\u003c/code\u003e commands\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003ePartial/fuzzy match supported\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edetail\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e commands\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCase-insensitive\u003c/strong\u003e: All search operations\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eBest practice\u003c/strong\u003e: Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e first to find exact title, then use it in subsequent commands\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eExample workflow:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Find task with fuzzy search\npython3 scripts/ms-todo-oauth.py search \"report\"\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eOutput shows: \"Complete Q1 Report\"\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eUse exact title from search results\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py complete \"Complete Q1 Report\" -l \"Work\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDefault List Behavior\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eWhen \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l\u003c/code\u003e is not specified, operations use the Microsoft To Do default list\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eThe default list is typically named \"Tasks\" (English) or \"ไปปๅŠก\" (Chinese)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eTo target a specific list, always provide \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e-l \"\u003cListName\u003e\"\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eExample Task Categorization\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eUser request:\u003c/strong\u003e \"Add these tasks: buy milk, finish report, call dentist\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAgent approach:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# First check available lists\npython3 scripts/ms-todo-oauth.py lists\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eCategorize intelligently:\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Buy milk\" -l \"Shopping\"\npython3 scripts/ms-todo-oauth.py add \"Finish report\" -l \"Work\" -p high -d 2\npython3 scripts/ms-todo-oauth.py add \"Call dentist\" -l \"Personal\"\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eOr use default list if no specific context: add \"Call dentist\"\u003c/h2\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eQuick Reference\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eCommon Workflows\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDaily task review:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 scripts/ms-todo-oauth.py today          # Check today's tasks\npython3 scripts/ms-todo-oauth.py overdue        # Check overdue tasks\npython3 scripts/ms-todo-oauth.py -v pending -g  # Review all pending, grouped\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAdding various task types:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Simple task (default list)\npython3 scripts/ms-todo-oauth.py add \"Buy milk\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eWork task with priority and deadline\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Quarterly review\" -l \"Work\" -p high -d 7\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eTask with reminder\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Call client\" -r 3h\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eDetailed task with all options\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Project meeting\" \\\n  -l \"Work\" \\\n  -p high \\\n  -d 2026-03-15 \\\n  -r \"2026-03-15 14:30\" \\\n  -D \"Discuss Q1 goals and resource allocation\" \\\n  -t \"meeting,important,Q1\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eRecurring tasks\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py add \"Daily standup\" -R daily -l \"Work\"\npython3 scripts/ms-todo-oauth.py add \"Weekly review\" -R weekly -d 7\npython3 scripts/ms-todo-oauth.py add \"Gym\" -R weekdays -l \"Personal\"\npython3 scripts/ms-todo-oauth.py add \"Monthly report\" -R monthly -p high\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTask completion workflow:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Search for task\npython3 scripts/ms-todo-oauth.py search \"report\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eComplete using exact title from search results\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py complete \"Quarterly review\" -l \"Work\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eData management:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Export for backup\npython3 scripts/ms-todo-oauth.py export -o \"backup_$(date +%Y%m%d).json\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eView statistics\u003c/h2\u003e\npython3 scripts/ms-todo-oauth.py stats\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eChangelog\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eVersion 1.1.0 (Current)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFixed\u003c/strong\u003e: DateTime parsing errors (Microsoft's 7-decimal format)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFixed\u003c/strong\u003e: HTTP method parameter order bugs\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFixed\u003c/strong\u003e: Missing \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estart_date\u003c/code\u003e parameter in \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecreate_task()\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFixed\u003c/strong\u003e: Missing \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecomplete_task()\u003c/code\u003e method\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eFixed\u003c/strong\u003e: Error exit codes now correctly return 1 on failure\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eAdded\u003c/strong\u003e: Comprehensive test suite (29 automated tests)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eAdded\u003c/strong\u003e: Better error messages and troubleshooting\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eImproved\u003c/strong\u003e: OAuth2 authentication flow documentation\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eImproved\u003c/strong\u003e: Unicode and emoji support documentation\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eโœ… \u003cstrong style=\"color:#e5e7eb\"\u003eImproved\u003c/strong\u003e: Agent usage guidelines\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eVersion 1.0.2 (Previous)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eInitial release with OAuth2 authentication\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eBasic task and list management\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eRecurring task support\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eMultiple task views\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eData export functionality\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eTroubleshooting\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAuthentication Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Not logged in\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e, complete browser flow, then \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin verify \u003ccode\u003e\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Token acquisition failed: invalid_grant\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCause\u003c/strong\u003e: Authorization code already used or expired\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e again to get a fresh code\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Login worked but now getting \"Not logged in\" again\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCause\u003c/strong\u003e: Token expired and auto-refresh failed\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--reauth\u003c/code\u003e to force fresh login:\u003c/li\u003e\n  \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e  python3 scripts/ms-todo-oauth.py --reauth lists\n  \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eImport/Dependency Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eModuleNotFoundError: No module named 'msal'\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Install dependencies: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epip install -r requirements.txt\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAPI/Network Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Connection timeout or network errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Internet connection\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Can you access https://graph.microsoft.com in browser?\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Using \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e flag to see full API request/response\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Unexpected API errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Re-authenticate: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py --reauth lists\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Debug mode: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py --debug \u003ccommand\u003e\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTask/List Not Found\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Task not found: \u003ctitle\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e to find exact title\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNote\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecomplete\u003c/code\u003e and \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete\u003c/code\u003e require exact title match\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ List not found: \u003cname\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elists\u003c/code\u003e to see exact list names\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNote\u003c/strong\u003e: List names are case-sensitive\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTest Failures\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Tests failing with datetime errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Ensure you've applied all v1.1.0 fixes\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Verify \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e_parse_ms_datetime()\u003c/code\u003e helper function exists\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Tests failing with \"Not logged in\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Authenticate before running tests:\u003c/li\u003e\n  \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e  python3 scripts/ms-todo-oauth.py login get\n  # Complete browser flow\n  python3 scripts/ms-todo-oauth.py login verify \u003ccode\u003e\n  # Then run tests\n  python3 test_ms_todo_oauth.py\n  \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eAdditional Resources\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTest Suite\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etest_ms_todo_oauth.py\u003c/code\u003e - Automated tests\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eManual Tests\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eMANUAL_TEST_CHECKLIST.txt\u003c/code\u003e - Step-by-step testing guide\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eQuick Reference\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eQUICK_REFERENCE.txt\u003c/code\u003e - Command cheat sheet\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eBug Fixes\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eCOMPLETE_FIX_PATCH.txt\u003c/code\u003e - Documentation of v1.1.0 fixes\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eSupport \u0026 Contributing\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eReporting Issues:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eProvide error message and command used\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eInclude output from \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e flag if applicable\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNote your Python version: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 --version\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNote your OS: Windows/Mac/Linux\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTesting New Features:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAlways run the test suite after code changes\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAdd new test cases to \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etest_ms_todo_oauth.py\u003c/code\u003e for new features\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUpdate \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eMANUAL_TEST_CHECKLIST.txt\u003c/code\u003e with manual test procedures\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eLicense\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eMIT License - See LICENSE file for details\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eVersion\u003c/strong\u003e: 1.1.0\n\u003cstrong style=\"color:#e5e7eb\"\u003eLast Updated\u003c/strong\u003e: 2026-02-13\n\u003cstrong style=\"color:#e5e7eb\"\u003eStatus\u003c/strong\u003e: โœ… Fully Tested \u0026 Production Ready\n\u003c/p\u003e"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",null,{\"className\":\"skill-page\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"Ms Todo Oauth\\\",\\\"description\\\":\\\"Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...\\\",\\\"url\\\":\\\"https://bytesagain.com/skill/ms-todo-oauth\\\",\\\"applicationCategory\\\":\\\"requires-oauth-token\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"},\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"BytesAgain\\\",\\\"url\\\":\\\"https://bytesagain.com\\\"}}\"}}],[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"children\":\"BytesAgain\"}],\" โ€บ \",[\"$\",\"a\",null,{\"href\":\"/skills\",\"children\":\"Skills\"}],\" โ€บ \",\"Ms Todo Oauth\"]}],[\"$\",\"div\",null,{\"className\":\"two-col\",\"children\":[[\"$\",\"div\",null,{\"className\":\"two-col-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-badges\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge\",\"style\":{\"color\":\"#818cf8\",\"background\":\"#818cf822\",\"borderColor\":\"#818cf844\"},\"children\":[\"๐Ÿฆ€\",\" \",\"ClawHub\"]}],false]}],[\"$\",\"div\",null,{\"className\":\"skill-top-actions\",\"children\":[\"$\",\"$L22\",null,{\"slug\":\"ms-todo-oauth\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"skill-title\",\"children\":\"Ms Todo Oauth\"}],[\"$\",\"p\",null,{\"className\":\"skill-owner\",\"children\":[\"by \",[\"$\",\"span\",null,{\"children\":[\"@\",\"nathanatgit\"]}]]}],[\"$\",\"p\",null,{\"className\":\"skill-desc\",\"children\":\"Manage Microsoft To Do lists and tasks through a local Python CLI backed by Microsoft Graph OAuth. Use when an agent needs to inspect, add, complete, delete,...\"}],[\"$\",\"div\",null,{\"className\":\"skill-meta\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Version\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"v\",\"1.0.5\"]}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Downloads\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"1,688\"}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Stars\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"โญ \",\"1\"]}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"style\":{\"flexDirection\":\"row\",\"gap\":6,\"alignItems\":\"center\"},\"children\":[[\"$\",\"a\",\"crypto-defi\",{\"href\":\"/?q=crypto-defi\",\"className\":\"tag\",\"children\":[\"#\",\"crypto-defi\"]}],[\"$\",\"a\",\"coding\",{\"href\":\"/?q=coding\",\"className\":\"tag\",\"children\":[\"#\",\"coding\"]}],[\"$\",\"a\",\"security\",{\"href\":\"/?q=security\",\"className\":\"tag\",\"children\":[\"#\",\"security\"]}],[\"$\",\"a\",\"legal\",{\"href\":\"/?q=legal\",\"className\":\"tag\",\"children\":[\"#\",\"legal\"]}],[\"$\",\"a\",\"productivity\",{\"href\":\"/?q=productivity\",\"className\":\"tag\",\"children\":[\"#\",\"productivity\"]}]]}]]}],[\"$\",\"div\",null,{\"style\":{\"marginTop\":6},\"children\":[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/nathanatgit/ms-todo-oauth\",\"target\":\"_blank\",\"rel\":\"noopener\",\"className\":\"btn-secondary\",\"style\":{\"padding\":\"6px 12px\",\"fontSize\":\".82em\",\"borderRadius\":8,\"background\":\"transparent\",\"border\":\"1px solid var(--border-card)\",\"color\":\"var(--text-muted2)\",\"textDecoration\":\"none\",\"whiteSpace\":\"nowrap\"},\"children\":[\"View on \",\"ClawHub\",\" โ†’\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"install-box\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-dots\",\"children\":[[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#ef4444\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#eab308\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#22c55e\"}}]]}],[\"$\",\"span\",null,{\"className\":\"install-label\",\"children\":\"TERMINAL\"}]]}],[\"$\",\"div\",null,{\"className\":\"install-body\",\"style\":{\"flexWrap\":\"wrap\"},\"children\":[[\"$\",\"code\",null,{\"className\":\"install-cmd\",\"children\":\"clawhub install ms-todo-oauth\"}],[\"$\",\"button\",null,{\"className\":\"copy-btn\",\"data-cmd\":\"clawhub install ms-todo-oauth\",\"style\":{\"fontWeight\":700},\"children\":\"Copy\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"๐Ÿ“– About This Skill\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$23\"}}]]}],null,null,\"$L24\",\"$L25\",null,null,null,false,false]}],\"$L26\"]}]]}]\n"])</script><script>self.__next_f.push([1,"21:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n        document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn =\u003e {\\n          btn.addEventListener('click', () =\u003e {\\n            const cmd = btn.getAttribute('data-cmd');\\n            if (!cmd) return;\\n            navigator.clipboard.writeText(cmd).then(() =\u003e {\\n              const orig = btn.textContent;\\n              btn.textContent = 'Copied!';\\n              setTimeout(() =\u003e btn.textContent = orig, 1500);\\n            }).catch(() =\u003e {});\\n          });\\n        });\\n      \"}}]\n"])</script><script>self.__next_f.push([1,"28:I[71521,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"24:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"โš™๏ธ Configuration\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cp style=\\\"margin:8px 0\\\"\u003e1. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003ePython \u003e= 3.9\u003c/strong\u003e must be installed\\n2. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eWorking directory\u003c/strong\u003e: All commands MUST be run from the root of this skill (the directory containing this SKILL.md file)\\n3. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eNetwork access\u003c/strong\u003e: Requires internet access to Microsoft Graph API endpoints\\n4. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eMicrosoft Account\u003c/strong\u003e: Personal Microsoft account (Hotmail, Outlook.com) or work/school account\\n5. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eAuthentication\u003c/strong\u003e: First-time use requires OAuth2 login via browser. See \u003ca href=\\\"#authentication\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" style=\\\"color:#6366f1\\\"\u003eAuthentication\u003c/a\u003e section\\n   - \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eToken cache\u003c/strong\u003e: \u003ccode style=\\\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\\\"\u003e~/.mstodo_token_cache.json\u003c/code\u003e (persists across sessions, auto-refreshed)\u003c/p\u003e\"}}]]}]\n"])</script><script>self.__next_f.push([1,"27:T1b4f,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAuthentication Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Not logged in\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e, complete browser flow, then \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin verify \u003ccode\u003e\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Token acquisition failed: invalid_grant\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCause\u003c/strong\u003e: Authorization code already used or expired\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin get\u003c/code\u003e again to get a fresh code\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Login worked but now getting \"Not logged in\" again\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCause\u003c/strong\u003e: Token expired and auto-refresh failed\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--reauth\u003c/code\u003e to force fresh login:\u003c/li\u003e\n  \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e  python3 scripts/ms-todo-oauth.py --reauth lists\n  \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eImport/Dependency Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eModuleNotFoundError: No module named 'msal'\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Install dependencies: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epip install -r requirements.txt\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAPI/Network Issues\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Connection timeout or network errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Internet connection\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Can you access https://graph.microsoft.com in browser?\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Using \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--debug\u003c/code\u003e flag to see full API request/response\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Unexpected API errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Re-authenticate: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py --reauth lists\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTry\u003c/strong\u003e: Debug mode: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython3 scripts/ms-todo-oauth.py --debug \u003ccommand\u003e\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTask/List Not Found\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ Task not found: \u003ctitle\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esearch\u003c/code\u003e to find exact title\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNote\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecomplete\u003c/code\u003e and \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete\u003c/code\u003e require exact title match\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eโŒ List not found: \u003cname\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elists\u003c/code\u003e to see exact list names\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNote\u003c/strong\u003e: List names are case-sensitive\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTest Failures\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Tests failing with datetime errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Ensure you've applied all v1.1.0 fixes\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCheck\u003c/strong\u003e: Verify \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e_parse_ms_datetime()\u003c/code\u003e helper function exists\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eProblem:\u003c/strong\u003e Tests failing with \"Not logged in\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSolution\u003c/strong\u003e: Authenticate before running tests:\u003c/li\u003e\n  \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e  python3 scripts/ms-todo-oauth.py login get\n  # Complete browser flow\n  python3 scripts/ms-todo-oauth.py login verify \u003ccode\u003e\n  # Then run tests\n  python3 test_ms_todo_oauth.py\n  \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e"])</script><script>self.__next_f.push([1,"25:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"๐Ÿ“‹ Tips \u0026 Best Practices\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$27\"}}]]}]\n26:[\"$\",\"div\",null,{\"className\":\"two-col-side\",\"children\":[\"$\",\"$L28\",null,{\"category\":\"requires-oauth-token\",\"currentSlug\":\"ms-todo-oauth\",\"name\":\"Ms Todo Oauth\",\"tags\":[\"crypto-defi\",\"coding\",\"security\",\"legal\",\"productivity\"]}]}]\n"])</script></body></html>