todo-agent 0.2.8__py3-none-any.whl → 0.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,11 +6,11 @@ AVAILABLE TOOLS:
6
6
  Discovery Tools (Call FIRST):
7
7
  - list_projects() - Get all available projects from todo.txt
8
8
  - list_contexts() - Get all available contexts from todo.txt
9
- - list_tasks(filter?) - List current tasks with optional filtering
10
- - list_completed_tasks(filter?, project?, context?, text_search?, date_from?, date_to?) - List completed tasks with optional filtering
9
+ - list_tasks() - List all current tasks from todo.txt
10
+ - list_completed_tasks() - List all completed tasks from done.txt
11
11
 
12
12
  Task Management Tools:
13
- - add_task(description, priority?, project?, context?, due?) - Add new task to todo.txt
13
+ - add_task(description, priority?, project?, context?, due?, recurring?) - Add new task to todo.txt
14
14
  - complete_task(task_number) - Mark task as complete by line number
15
15
  - replace_task(task_number, new_description) - Replace entire task content
16
16
  - append_to_task(task_number, text) - Add text to end of existing task
@@ -20,12 +20,16 @@ Task Management Tools:
20
20
  Priority Management Tools:
21
21
  - set_priority(task_number, priority) - Set or change task priority (A-Z)
22
22
  - remove_priority(task_number) - Remove priority from task
23
+ - set_due_date(task_number, due_date) - Set or update due date for a task by intelligently rewriting it (use empty string to remove due date)
24
+ - set_context(task_number, context) - Set or update context for a task by intelligently rewriting it (use empty string to remove context)
25
+ - set_project(task_number, projects) - Set or update projects for a task by intelligently rewriting it (handles array of projects with add/remove operations)
23
26
 
24
27
  Utility Tools:
25
28
  - get_overview() - Show task statistics and summary
26
29
  - move_task(task_number, destination, source?) - Move task between files
27
30
  - archive_tasks() - Archive completed tasks from todo.txt to done.txt
28
31
  - get_calendar(month, year) - Get calendar for specific month and year
32
+ - parse_date(date_expression) - Convert natural language date expressions to YYYY-MM-DD format
29
33
  """
30
34
 
31
35
  import subprocess
@@ -85,34 +89,18 @@ class ToolCallHandler:
85
89
  "function": {
86
90
  "name": "list_tasks",
87
91
  "description": (
88
- "List current tasks with optional filtering. Use this when: "
92
+ "List all current tasks from todo.txt. Use this when: "
89
93
  "1) User wants to see their tasks, "
90
- "2) You need to find a specific task by description, "
91
- "3) You need to check for potential duplicates before adding new tasks, "
92
- "4) You need to understand the current state before making changes, "
93
- "5) User says they finished/completed a task and you need to find the matching task. "
94
+ "2) You need to check for potential duplicates before adding new tasks, "
95
+ "3) You need to understand the current state before making changes, "
96
+ "4) User says they finished/completed a task and you need to find the matching task. "
94
97
  "CRITICAL: ALWAYS use this before add_task() to check for similar existing tasks. "
95
98
  "CRITICAL: ALWAYS use this when user mentions task completion to find the correct task number. "
96
- "COMPLETION INTELLIGENCE: When searching for completion matches, if exactly one task clearly "
97
- "matches the user's description, proceed to complete it immediately without asking for confirmation. "
98
- "IMPORTANT: When presenting the results to the user, convert the raw todo.txt format "
99
- "into conversational language. Do not show the raw format like '(A) task +project @context'. "
100
99
  "STRATEGIC CONTEXT: This is the primary discovery tool - call this FIRST when you need to "
101
- "understand existing tasks before making any modifications."
100
+ "understand existing tasks before making any modifications. Always get the complete task list "
101
+ "for full context rather than trying to filter."
102
102
  ),
103
- "parameters": {
104
- "type": "object",
105
- "properties": {
106
- "filter": {
107
- "type": "string",
108
- "description": (
109
- "Optional filter string (e.g., '+work', '@office', '(A)') - "
110
- "use when you want to see only specific tasks or when searching for completion matches"
111
- ),
112
- }
113
- },
114
- "required": [],
115
- },
103
+ "parameters": {"type": "object", "properties": {}, "required": []},
116
104
  },
117
105
  },
118
106
  {
@@ -120,72 +108,17 @@ class ToolCallHandler:
120
108
  "function": {
121
109
  "name": "list_completed_tasks",
122
110
  "description": (
123
- "List completed tasks from done.txt with optional filtering. Use this when: "
111
+ "List all completed tasks from done.txt. Use this when: "
124
112
  "1) User tries to complete a task that might already be done, "
125
113
  "2) User asks about completed tasks, "
126
114
  "3) You need to verify task status before taking action, "
127
- "4) User wants to search for specific completed tasks by project, context, text, or date. "
115
+ "4) User wants to see their task completion history. "
128
116
  "STRATEGIC CONTEXT: Call this BEFORE complete_task() to verify the task hasn't already "
129
117
  "been completed, preventing duplicate completion attempts. "
130
- "FILTERING: Use the filtering parameters to help users find specific completed tasks "
131
- "when they ask about work tasks, home tasks, tasks from a specific date, etc. "
132
- "DATE FILTERING LIMITATIONS: Due to todo.sh constraints, date filtering has specific behavior: "
133
- "• When both date_from and date_to are provided, filtering uses the year-month pattern (YYYY-MM) "
134
- "from date_from, matching all tasks in that month. "
135
- "• When only date_from is provided, filtering uses the exact date pattern (YYYY-MM-DD). "
136
- "• When only date_to is provided, filtering uses the year-month pattern (YYYY-MM) from date_to. "
137
- "• Complex date ranges (e.g., spanning multiple months) are not supported by todo.sh."
118
+ "Always get the complete completed task list for full historical context rather than "
119
+ "trying to filter by specific criteria."
138
120
  ),
139
- "parameters": {
140
- "type": "object",
141
- "properties": {
142
- "filter": {
143
- "type": "string",
144
- "description": (
145
- "Optional raw filter string (e.g., '+work', '@office') - "
146
- "use for advanced filtering when other parameters aren't sufficient"
147
- ),
148
- },
149
- "project": {
150
- "type": "string",
151
- "description": (
152
- "Optional project name to filter by (without the + symbol) - "
153
- "e.g., 'work', 'home', 'bills'"
154
- ),
155
- },
156
- "context": {
157
- "type": "string",
158
- "description": (
159
- "Optional context name to filter by (without the @ symbol) - "
160
- "e.g., 'office', 'home', 'phone'"
161
- ),
162
- },
163
- "text_search": {
164
- "type": "string",
165
- "description": (
166
- "Optional text to search for in task descriptions - "
167
- "e.g., 'review', 'call', 'email'"
168
- ),
169
- },
170
- "date_from": {
171
- "type": "string",
172
- "description": (
173
- "Optional start date for filtering (YYYY-MM-DD format) - "
174
- "e.g., '2025-08-01'. When used alone, matches exact date. "
175
- "When used with date_to, uses year-month pattern (YYYY-MM) for month-based filtering."
176
- ),
177
- },
178
- "date_to": {
179
- "type": "string",
180
- "description": (
181
- "Optional end date for filtering (YYYY-MM-DD format) - "
182
- "e.g., '2025-08-31'. When used alone, uses year-month pattern (YYYY-MM) "
183
- "for month-based filtering. When used with date_from, uses date_from's year-month pattern."
184
- ),
185
- },
186
- },
187
- "required": [],
188
- },
121
+ "parameters": {"type": "object", "properties": {}, "required": []},
189
122
  },
190
123
  },
191
124
  {
@@ -193,18 +126,21 @@ class ToolCallHandler:
193
126
  "function": {
194
127
  "name": "add_task",
195
128
  "description": (
196
- "Add a new task to todo.txt. CRITICAL: Before adding ANY task, you MUST "
197
- "use list_tasks() and list_completed_tasks() to check for potential duplicates. Look for tasks with "
198
- "similar descriptions, keywords, or intent. If you find similar tasks, "
129
+ "Add a NEW task to todo.txt with intelligent automatic inference capabilities. "
130
+ "USE CASE: Call this when user wants to create a NEW task, not when they want to complete, modify, or work with existing tasks. "
131
+ "CRITICAL: Before adding ANY task, you MUST use list_tasks() and list_completed_tasks() to check for potential duplicates. "
132
+ "Look for tasks with similar descriptions, keywords, or intent. If you find similar tasks, "
199
133
  "ask the user if they want to add a new task or modify an existing one. "
200
- "AUTOMATIC INFERENCE: When project, context, or due date is not specified, automatically infer appropriate tags "
201
- "and due dates based on the task content, natural language expressions, task nature, calendar context, and existing patterns. "
202
- "DUE DATE INFERENCE: Use parse_date() tool to convert any temporal expressions to YYYY-MM-DD format. "
203
- "Extract temporal expressions and use common sense to infer appropriate due dates based on task type, "
204
- "work patterns, personal schedules, and existing task due date patterns. Only ask for clarification when genuinely ambiguous. "
205
- "Always provide a complete, natural response to the user. "
206
- "STRATEGIC CONTEXT: This is a modification tool - call this LAST after using "
207
- "discovery tools (list_tasks, list_projects, list_contexts list_completed_tasks) "
134
+ "INTELLIGENT INFERENCE ENGINE: This tool automatically infers missing elements to create complete, actionable tasks: "
135
+ "PROJECT INFERENCE: Automatically detect and add appropriate +project tags based on task keywords, semantic patterns, and existing project usage. "
136
+ "CONTEXT INFERENCE: Automatically infer @context tags from task nature, location requirements, and historical context patterns. "
137
+ "DUE DATE INFERENCE: Use parse_date() tool to convert natural language expressions ('tomorrow', 'next week', 'by Friday') to YYYY-MM-DD format. "
138
+ "Apply strategic timing based on task type, work patterns, personal schedules, and existing due date patterns. "
139
+ "DURATION INFERENCE: Automatically estimate appropriate duration: tags based on task complexity, context, and historical patterns. "
140
+ "PRIORITY INFERENCE: Suggest appropriate priority levels (A-Z) based on urgency, importance, and existing priority patterns. "
141
+ "Only ask for clarification when genuinely ambiguous. Always provide a complete, natural response to the user. "
142
+ "STRATEGIC CONTEXT: This is a CREATION tool - call this LAST after using "
143
+ "discovery tools (list_tasks, list_projects, list_contexts, list_completed_tasks) "
208
144
  "to gather all necessary context and verify no duplicates exist."
209
145
  ),
210
146
  "parameters": {
@@ -234,6 +170,10 @@ class ToolCallHandler:
234
170
  "type": "string",
235
171
  "description": "Optional recurring pattern in rec:frequency[:interval] format (e.g., 'rec:daily', 'rec:weekly:2', 'rec:monthly'). Use for tasks that repeat automatically.",
236
172
  },
173
+ "duration": {
174
+ "type": "string",
175
+ "description": "Optional duration estimate in format: minutes (e.g., '30m'), hours (e.g., '2h'), or days (e.g., '1d'). Use for time planning and task prioritization.",
176
+ },
237
177
  },
238
178
  "required": ["description"],
239
179
  },
@@ -244,14 +184,11 @@ class ToolCallHandler:
244
184
  "function": {
245
185
  "name": "complete_task",
246
186
  "description": (
247
- "Mark a specific task as complete by its line number. IMPORTANT: "
248
- "When user says they finished/completed a task, FIRST use list_tasks() to find matching tasks, "
249
- "then list_completed_tasks() to verify it's not already done. "
250
- "COMPLETION LOGIC: If user's statement clearly matches exactly one task, complete it immediately. "
251
- "If multiple tasks match, show numbered options and ask for clarification. "
252
- "If the match is ambiguous, ask for confirmation. "
253
- "STRATEGIC CONTEXT: This is a modification tool - call this LAST after using "
254
- "discovery tools (list_tasks, list_completed_tasks) to verify the task exists and status."
187
+ "Mark an existing task as complete by its line number. "
188
+ "USE CASE: Only call this when user explicitly states they have finished/completed a task. "
189
+ "WORKFLOW: 1) Use list_tasks() to find the task to complete, 2) Use list_completed_tasks() to verify it's not already done, 3) Call complete_task() with the task number. "
190
+ "NOT FOR: Adding new tasks, modifying task content, or any other task operations. "
191
+ "This tool ONLY marks existing tasks as complete."
255
192
  ),
256
193
  "parameters": {
257
194
  "type": "object",
@@ -270,8 +207,10 @@ class ToolCallHandler:
270
207
  "function": {
271
208
  "name": "replace_task",
272
209
  "description": (
273
- "Replace the entire content of a task. IMPORTANT: Use list_tasks() first "
274
- "to find the correct task number if user doesn't specify it. "
210
+ "Replace the entire content of an EXISTING task. "
211
+ "USE CASE: Call this when user wants to completely rewrite an existing task description. "
212
+ "NOT FOR: Creating new tasks, completing tasks, or adding to tasks. "
213
+ "Use list_tasks() first to find the correct task number if user doesn't specify it. "
275
214
  "If multiple tasks match the description, ask for clarification."
276
215
  ),
277
216
  "parameters": {
@@ -295,8 +234,13 @@ class ToolCallHandler:
295
234
  "function": {
296
235
  "name": "append_to_task",
297
236
  "description": (
298
- "Add text to the end of an existing task. Use this when user wants "
299
- "to add additional information to a task without replacing it entirely."
237
+ "Add text to the end of an EXISTING task. "
238
+ "USE CASE: Call this when user wants to add additional descriptive text, notes, or comments to an existing task. "
239
+ "NOT FOR: Creating new tasks, completing tasks, or adding project/context/due date tags. "
240
+ "CRITICAL: DO NOT use this for adding project tags (+project) or context tags (@context) - "
241
+ "use set_project() or set_context() instead. "
242
+ "DO NOT use this for adding due dates - use set_due_date() instead. "
243
+ "This tool is ONLY for adding descriptive text, notes, or comments to existing tasks."
300
244
  ),
301
245
  "parameters": {
302
246
  "type": "object",
@@ -319,8 +263,10 @@ class ToolCallHandler:
319
263
  "function": {
320
264
  "name": "prepend_to_task",
321
265
  "description": (
322
- "Add text to the beginning of an existing task. Use this when user "
323
- "wants to add a prefix or modifier to a task."
266
+ "Add text to the beginning of an EXISTING task. "
267
+ "USE CASE: Call this when user wants to add a prefix or modifier to an existing task. "
268
+ "NOT FOR: Creating new tasks, completing tasks, or adding project/context/due date tags. "
269
+ "This tool is ONLY for modifying existing tasks by adding text at the beginning."
324
270
  ),
325
271
  "parameters": {
326
272
  "type": "object",
@@ -343,7 +289,9 @@ class ToolCallHandler:
343
289
  "function": {
344
290
  "name": "delete_task",
345
291
  "description": (
346
- "Delete an entire task or remove a specific term from a task. "
292
+ "Delete an entire EXISTING task or remove a specific term from an EXISTING task. "
293
+ "USE CASE: Call this when user wants to delete a task completely or remove specific text from an existing task. "
294
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
347
295
  "IMPORTANT: Use list_tasks() first to find the correct task number "
348
296
  "if user doesn't specify it."
349
297
  ),
@@ -371,7 +319,9 @@ class ToolCallHandler:
371
319
  "function": {
372
320
  "name": "set_priority",
373
321
  "description": (
374
- "Set or change the priority of a task (A-Z, where A is highest). "
322
+ "Set or change the priority of an EXISTING task (A-Z, where A is highest). "
323
+ "USE CASE: Call this when user wants to add, change, or remove priority on an existing task. "
324
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
375
325
  "IMPORTANT: Use list_tasks() first to find the correct task number "
376
326
  "if user doesn't specify it."
377
327
  ),
@@ -396,7 +346,10 @@ class ToolCallHandler:
396
346
  "function": {
397
347
  "name": "remove_priority",
398
348
  "description": (
399
- "Remove the priority from a task. IMPORTANT: Use list_tasks() first "
349
+ "Remove the priority from an EXISTING task. "
350
+ "USE CASE: Call this when user wants to remove priority from an existing task. "
351
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
352
+ "IMPORTANT: Use list_tasks() first "
400
353
  "to find the correct task number if user doesn't specify it."
401
354
  ),
402
355
  "parameters": {
@@ -411,6 +364,103 @@ class ToolCallHandler:
411
364
  },
412
365
  },
413
366
  },
367
+ {
368
+ "type": "function",
369
+ "function": {
370
+ "name": "set_due_date",
371
+ "description": (
372
+ "Set or update the due date for an EXISTING task by intelligently rewriting it. "
373
+ "USE CASE: Call this when user wants to add, change, or remove a due date on an existing task. "
374
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
375
+ "This preserves all existing task components (priority, projects, contexts, etc.) "
376
+ "while updating or adding the due date. Use empty string to remove the due date. "
377
+ "IMPORTANT: Use list_tasks() first "
378
+ "to find the correct task number if user doesn't specify it. "
379
+ "Use parse_date() tool to convert natural language expressions like 'tomorrow', "
380
+ "'next week', 'by Friday' to YYYY-MM-DD format."
381
+ ),
382
+ "parameters": {
383
+ "type": "object",
384
+ "properties": {
385
+ "task_number": {
386
+ "type": "integer",
387
+ "description": "The line number of the task to modify (required)",
388
+ },
389
+ "due_date": {
390
+ "type": "string",
391
+ "description": "Due date in YYYY-MM-DD format, or empty string to remove due date (required). Use parse_date() tool to convert natural language expressions.",
392
+ },
393
+ },
394
+ "required": ["task_number", "due_date"],
395
+ },
396
+ },
397
+ },
398
+ {
399
+ "type": "function",
400
+ "function": {
401
+ "name": "set_context",
402
+ "description": (
403
+ "Set or update the context for an EXISTING task by intelligently rewriting it. "
404
+ "USE CASE: Call this when user wants to add, change, or remove a context tag on an existing task. "
405
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
406
+ "This preserves all existing task components (priority, projects, due date, etc.) "
407
+ "while updating or adding the context. Use empty string to remove the context. "
408
+ "PREFERRED METHOD: Use this instead of append_to_task() when adding context tags (@context). "
409
+ "This tool properly manages context organization and prevents formatting issues. "
410
+ "IMPORTANT: Use list_tasks() first "
411
+ "to find the correct task number if user doesn't specify it."
412
+ ),
413
+ "parameters": {
414
+ "type": "object",
415
+ "properties": {
416
+ "task_number": {
417
+ "type": "integer",
418
+ "description": "The line number of the task to modify (required)",
419
+ },
420
+ "context": {
421
+ "type": "string",
422
+ "description": "Context to set for the task (required). Use empty string to remove context.",
423
+ },
424
+ },
425
+ "required": ["task_number", "context"],
426
+ },
427
+ },
428
+ },
429
+ {
430
+ "type": "function",
431
+ "function": {
432
+ "name": "set_project",
433
+ "description": (
434
+ "Set or update projects for an EXISTING task by intelligently rewriting it. "
435
+ "USE CASE: Call this when user wants to add, change, or remove project tags on an existing task. "
436
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
437
+ "This preserves all existing task components and manages projects intelligently. "
438
+ "Supports multiple projects, prevents duplicates, and groups them together. "
439
+ "Empty array or empty strings are NOOPs (no changes). "
440
+ "Use '-project' syntax to remove specific projects. "
441
+ "PREFERRED METHOD: Use this instead of append_to_task() when adding project tags (+project). "
442
+ "This tool properly manages project organization and prevents formatting issues. "
443
+ "IMPORTANT: Use list_tasks() first "
444
+ "to find the correct task number if user doesn't specify it. "
445
+ "Project names should be provided without the + symbol (e.g., 'work' not '+work')."
446
+ ),
447
+ "parameters": {
448
+ "type": "object",
449
+ "properties": {
450
+ "task_number": {
451
+ "type": "integer",
452
+ "description": "The line number of the task to modify (required)",
453
+ },
454
+ "projects": {
455
+ "type": "array",
456
+ "items": {"type": "string"},
457
+ "description": "Array of project operations. Each item can be: project name (add), '-project' (remove), or empty string (remove all) (required).",
458
+ },
459
+ },
460
+ "required": ["task_number", "projects"],
461
+ },
462
+ },
463
+ },
414
464
  {
415
465
  "type": "function",
416
466
  "function": {
@@ -427,7 +477,9 @@ class ToolCallHandler:
427
477
  "function": {
428
478
  "name": "move_task",
429
479
  "description": (
430
- "Move a task from one file to another (e.g., from todo.txt to done.txt). "
480
+ "Move an EXISTING task from one file to another (e.g., from todo.txt to done.txt). "
481
+ "USE CASE: Call this when user wants to move a task between different todo files. "
482
+ "NOT FOR: Creating new tasks, completing tasks, or any other task operations. "
431
483
  "IMPORTANT: Use list_tasks() first to find the correct task number "
432
484
  "if user doesn't specify it."
433
485
  ),
@@ -724,10 +776,12 @@ class ToolCallHandler:
724
776
  "delete_task": self.todo_manager.delete_task,
725
777
  "set_priority": self.todo_manager.set_priority,
726
778
  "remove_priority": self.todo_manager.remove_priority,
779
+ "set_due_date": self.todo_manager.set_due_date,
780
+ "set_context": self.todo_manager.set_context,
781
+ "set_project": self.todo_manager.set_project,
727
782
  "get_overview": self.todo_manager.get_overview,
728
783
  "move_task": self.todo_manager.move_task,
729
784
  "archive_tasks": self.todo_manager.archive_tasks,
730
- "deduplicate_tasks": self.todo_manager.deduplicate_tasks,
731
785
  "parse_date": self._parse_date,
732
786
  "get_calendar": self._get_calendar,
733
787
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: todo-agent
3
- Version: 0.2.8
3
+ Version: 0.3.1
4
4
  Summary: A natural language interface for todo.sh task management
5
5
  Author: codeprimate
6
6
  Maintainer: codeprimate
@@ -51,7 +51,7 @@ A natural language interface for [todo.sh](https://github.com/todotxt/todo.txt-c
51
51
 
52
52
  ## What it does
53
53
 
54
- Transform natural language into todo.sh commands:
54
+ Transform natural language into todo.sh commands with intelligent task management:
55
55
 
56
56
  ```bash
57
57
  # Use interactively
@@ -62,91 +62,43 @@ todo-agent "add buy groceries to shopping list"
62
62
  todo-agent "show my work tasks"
63
63
  ```
64
64
 
65
- ## Quick Start
66
-
67
- ### 1. Install
65
+ ## Why Todo Agent?
68
66
 
69
- #### Prerequisites
67
+ **Speak naturally** instead of memorizing commands. Todo Agent understands "add dentist appointment next Monday" and automatically sets the right date, project, and context.
70
68
 
71
- **Install todo.sh (required)**
69
+ **Get intelligent insights** beyond basic task lists. It organizes tasks strategically, suggests priorities, and recommends optimal timing based on your patterns.
72
70
 
73
- todo.sh is the underlying task management system that todo-agent interfaces with.
71
+ **Work smarter** with automatic duplicate detection, recurring task handling, and calendar-aware scheduling.
74
72
 
75
- **macOS:**
76
- ```bash
77
- # Using Homebrew
78
- brew install todo-txt
79
- # Or using MacPorts
80
- sudo port install todo-txt
81
- ```
73
+ **Choose your privacy** - use cloud AI (OpenRouter) or run locally (Ollama).
82
74
 
83
- **Linux:**
84
- ```bash
85
- # Ubuntu/Debian
86
- sudo apt-get install todo-txt-cli
87
- # CentOS/RHEL/Fedora
88
- sudo yum install todo-txt-cli
89
- # or
90
- sudo dnf install todo-txt-cli
91
- # Arch Linux
92
- sudo pacman -S todo-txt-cli
93
- ```
75
+ ## Quick Start
94
76
 
95
- **Windows:**
96
- ```bash
97
- # Using Chocolatey
98
- choco install todo-txt-cli
99
- # Using Scoop
100
- scoop install todo-txt-cli
101
- ```
77
+ ### 1. Install
102
78
 
103
- **From source:**
104
- ```bash
105
- git clone https://github.com/todotxt/todo.txt-cli.git
106
- cd todo.txt-cli
107
- make
108
- sudo make install
109
- ```
79
+ #### Install todo.sh (required)
110
80
 
111
- #### Configure todo.sh
81
+ **macOS:** `brew install todo-txt`
82
+ **Linux:** `sudo apt-get install todo-txt-cli` (Ubuntu/Debian) or `sudo pacman -S todo-txt-cli` (Arch)
83
+ **Windows:** `choco install todo-txt-cli` (Chocolatey) or `scoop install todo-txt-cli` (Scoop)
112
84
 
113
- After installing todo.sh, you need to set up your todo.txt repository:
85
+ #### Set up todo.sh
114
86
 
115
87
  ```bash
116
- # Create a directory for your todo files
117
- mkdir ~/todo
118
- cd ~/todo
119
-
120
- # Initialize todo.sh (this creates the initial todo.txt file)
88
+ # Create and initialize your todo directory
89
+ mkdir ~/todo && cd ~/todo
121
90
  todo.sh init
122
91
 
123
- # Verify installation
124
- todo.sh version
125
- ```
126
-
127
- **Important:** Set the `TODO_DIR` environment variable to point to your todo.txt repository:
128
-
129
- ```bash
92
+ # Add to your shell profile (.bashrc, .zshrc, etc.)
130
93
  export TODO_DIR="$HOME/todo"
131
94
  ```
132
95
 
133
- You can add this to your shell profile (`.bashrc`, `.zshrc`, etc.) to make it permanent.
134
-
135
96
  #### Install todo-agent
136
97
 
137
98
  ```bash
138
- # Clone and install from source
139
99
  git clone https://github.com/codeprimate/todo-agent.git
140
100
  cd todo_agent
141
-
142
- # Option 1: Install built package locally
143
101
  make install
144
-
145
- # Option 2: Install in development mode with dev dependencies
146
- make install-dev
147
-
148
- # Option 3: Install in development mode (basic)
149
- pip install -e .
150
102
  ```
151
103
 
152
104
  ### 2. Set up your LLM provider
@@ -200,6 +152,22 @@ todo-agent "show completed tasks"
200
152
  todo-agent "list my contexts"
201
153
  ```
202
154
 
155
+ ### Strategic Planning
156
+ ```bash
157
+ todo-agent "what should I do next?"
158
+ todo-agent "organize my tasks by priority"
159
+ todo-agent "show me everything due this week"
160
+ todo-agent "what tasks are blocking other work?"
161
+ ```
162
+
163
+ ### Natural Language Intelligence
164
+ ```bash
165
+ todo-agent "add dentist appointment next Monday"
166
+ todo-agent "set up recurring daily vitamin reminder"
167
+ todo-agent "move all completed tasks to archive"
168
+ todo-agent "show me tasks I can do from home"
169
+ ```
170
+
203
171
  ## Configuration
204
172
 
205
173
 
@@ -1,29 +1,29 @@
1
1
  todo_agent/__init__.py,sha256=RUowhd14r3tqB_7rl83unGV8oBjra3UOIl7jix-33fk,254
2
- todo_agent/_version.py,sha256=NCr4lkV1m1Jmisv_F-sazmV2gGdDIaVwqLyPwmjayqM,704
2
+ todo_agent/_version.py,sha256=gGLpQUQx-ty9SEy9PYw9OgJWWzJLBnCpfJOfzL7SjlI,704
3
3
  todo_agent/main.py,sha256=-ryhMm4c4sz4e4anXI8B-CYnpEh5HIkmnYcnGxcWHDk,1628
4
4
  todo_agent/core/__init__.py,sha256=QAZ4it63pXv5-DxtNcuSAmg7ZnCY5ackI5yycvKHr9I,365
5
5
  todo_agent/core/conversation_manager.py,sha256=nRFcDMqZtumVipggzVe94Hwz9HDbc2CrTssk_HImwEI,13548
6
6
  todo_agent/core/exceptions.py,sha256=cPvvkIbKdI7l51wC7cE-ZxUi54P3nf2m7x2lMNMRFYM,399
7
- todo_agent/core/todo_manager.py,sha256=ZiCXfgS4kor3tdojwEKwD2G1lX-W9XuaoYvER82PHNM,10438
7
+ todo_agent/core/todo_manager.py,sha256=wOgwXZCS5xZw7lHDnIar0L8r1pvgdUguu6kmFF9xSi8,16282
8
8
  todo_agent/infrastructure/__init__.py,sha256=SGbHXgzq6U1DMgOfWPMsWEK99zjPSF-6gzy7xqc5fsI,284
9
9
  todo_agent/infrastructure/calendar_utils.py,sha256=HmF0ykXF_6GbdoJvZLIv6fKwT6ipixoywdTMkIXmkGU,1871
10
10
  todo_agent/infrastructure/config.py,sha256=zyp6qOlg1nN_awphivlgGNBE6fL0Hf66YgvWxR8ldyQ,2117
11
- todo_agent/infrastructure/inference.py,sha256=PJouydXREgTIkZQVumdCvrwIbMdPR79baRV1W0s2TLA,11802
11
+ todo_agent/infrastructure/inference.py,sha256=T_xwSd2oB5CsPKExJoQ_RahpMB4U0PKIOUMR0vQyE5I,11883
12
12
  todo_agent/infrastructure/llm_client.py,sha256=ZoObyqaRP6i_eqGYGfJWGeWTJ-VNxpY70ay04vt2v_E,1390
13
13
  todo_agent/infrastructure/llm_client_factory.py,sha256=-tktnVOIF7B45WR7AuLoi7MKnEyuM8lgg1jjc4T1FhM,1929
14
14
  todo_agent/infrastructure/logger.py,sha256=2ykG_0lyzmEGxDF6ZRl1qiTUGDuFeQgzv4Na6vRmXcM,4110
15
15
  todo_agent/infrastructure/ollama_client.py,sha256=RVgHqX37k7q5xEaEXdhcCv2HYQiszs1QV39RxFFMIas,5902
16
- todo_agent/infrastructure/openrouter_client.py,sha256=7qusHuOH-zMKMrQw98v3MKwSWUJwL0mZsdShSjeoti0,7121
17
- todo_agent/infrastructure/todo_shell.py,sha256=z6kqUKDX-i4DfYJKoOLiPLCp8y6m1HdTDLHTvmLpzMc,5801
16
+ todo_agent/infrastructure/openrouter_client.py,sha256=2Ysf69z265dgkgDMLJR92v26-32DkuSAqKSN-ZCEX_Y,6948
17
+ todo_agent/infrastructure/todo_shell.py,sha256=0-GT_ReYMPCujy1KrB5PEQ98fbIZJm9-sVre5iCkFYE,17633
18
18
  todo_agent/infrastructure/token_counter.py,sha256=PCKheOVJbp1s89yhh_i6iKgURMt9mVoYkwjQJCc2xCE,4958
19
- todo_agent/infrastructure/prompts/system_prompt.txt,sha256=j7N8GhMbyRR7QqfkokbCJiElv6CdAhc22PVzY6vrucE,15880
19
+ todo_agent/infrastructure/prompts/system_prompt.txt,sha256=sin8wOFrDntTgKL1udlwE3iNxf_Pk1H1ZGzxGon23Wc,18931
20
20
  todo_agent/interface/__init__.py,sha256=vDD3rQu4qDkpvVwGVtkDzE1M4IiSHYzTif4GbYSFWaI,457
21
- todo_agent/interface/cli.py,sha256=C746b83dQTiyUfthcC-pngwsJlmXZAu10_hxsSOMzdM,12022
21
+ todo_agent/interface/cli.py,sha256=rSHJjSlKEV8dirCcMT1zX55i8raMOE_3IB6CUFGLgiI,12094
22
22
  todo_agent/interface/formatters.py,sha256=DiQLemndiuFWjLcBRPpu1wVnJcoYAFP8t_fJstOgaDs,18918
23
- todo_agent/interface/tools.py,sha256=_GlZwX09dYpqPB2Q-EsgGguA1PVl8_mRCdks6ucaJgU,39686
24
- todo_agent-0.2.8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
25
- todo_agent-0.2.8.dist-info/METADATA,sha256=ynVrlFUs89Qfgp6R3YnbvZGykjHD4CjNnJaLNm-oz1w,10047
26
- todo_agent-0.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- todo_agent-0.2.8.dist-info/entry_points.txt,sha256=4W7LrCib6AXP5IZDwWRht8S5gutLu5oNfTJHGbt4oHs,52
28
- todo_agent-0.2.8.dist-info/top_level.txt,sha256=a65mlPIhPZHuq2bRIi_sCMAIJsUddvXt171OBF6r6co,11
29
- todo_agent-0.2.8.dist-info/RECORD,,
23
+ todo_agent/interface/tools.py,sha256=nPO4Sx-JlRUv0-JTzg6caSdDr7tGLGagMvEqblnDJfU,44364
24
+ todo_agent-0.3.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
25
+ todo_agent-0.3.1.dist-info/METADATA,sha256=HXdjiFn4ELWARfPjhQjpLY8lx2tiHezZ7ylkvQ8EXsI,10134
26
+ todo_agent-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ todo_agent-0.3.1.dist-info/entry_points.txt,sha256=4W7LrCib6AXP5IZDwWRht8S5gutLu5oNfTJHGbt4oHs,52
28
+ todo_agent-0.3.1.dist-info/top_level.txt,sha256=a65mlPIhPZHuq2bRIi_sCMAIJsUddvXt171OBF6r6co,11
29
+ todo_agent-0.3.1.dist-info/RECORD,,