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.
- todo_agent/_version.py +2 -2
- todo_agent/core/todo_manager.py +144 -2
- todo_agent/infrastructure/inference.py +4 -3
- todo_agent/infrastructure/openrouter_client.py +26 -20
- todo_agent/infrastructure/prompts/system_prompt.txt +389 -324
- todo_agent/infrastructure/todo_shell.py +347 -10
- todo_agent/interface/cli.py +4 -2
- todo_agent/interface/tools.py +170 -116
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/METADATA +33 -65
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/RECORD +14 -14
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/WHEEL +0 -0
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/entry_points.txt +0 -0
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/licenses/LICENSE +0 -0
- {todo_agent-0.2.8.dist-info → todo_agent-0.3.1.dist-info}/top_level.txt +0 -0
todo_agent/interface/tools.py
CHANGED
@@ -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(
|
10
|
-
- list_completed_tasks(
|
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
|
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
|
91
|
-
"3) You need to
|
92
|
-
"4)
|
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
|
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
|
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
|
-
"
|
131
|
-
"
|
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
|
197
|
-
"
|
198
|
-
"
|
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
|
-
"
|
201
|
-
"
|
202
|
-
"
|
203
|
-
"
|
204
|
-
"work patterns, personal schedules, and existing
|
205
|
-
"
|
206
|
-
"
|
207
|
-
"
|
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
|
248
|
-
"
|
249
|
-
"
|
250
|
-
"
|
251
|
-
"
|
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
|
274
|
-
"
|
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
|
299
|
-
"to add additional
|
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
|
323
|
-
"wants to add a prefix or modifier to
|
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
|
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
|
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
|
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
|
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.
|
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
|
-
##
|
66
|
-
|
67
|
-
### 1. Install
|
65
|
+
## Why Todo Agent?
|
68
66
|
|
69
|
-
|
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
|
-
**
|
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
|
-
|
71
|
+
**Work smarter** with automatic duplicate detection, recurring task handling, and calendar-aware scheduling.
|
74
72
|
|
75
|
-
**
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
85
|
+
#### Set up todo.sh
|
114
86
|
|
115
87
|
```bash
|
116
|
-
# Create
|
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
|
-
#
|
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=
|
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=
|
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=
|
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=
|
17
|
-
todo_agent/infrastructure/todo_shell.py,sha256=
|
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=
|
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=
|
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=
|
24
|
-
todo_agent-0.
|
25
|
-
todo_agent-0.
|
26
|
-
todo_agent-0.
|
27
|
-
todo_agent-0.
|
28
|
-
todo_agent-0.
|
29
|
-
todo_agent-0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|