todo-agent 0.2.6__py3-none-any.whl → 0.2.9__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/conversation_manager.py +57 -6
- todo_agent/core/todo_manager.py +139 -0
- todo_agent/infrastructure/inference.py +23 -1
- todo_agent/infrastructure/ollama_client.py +2 -2
- todo_agent/infrastructure/openrouter_client.py +26 -20
- todo_agent/infrastructure/prompts/system_prompt.txt +413 -160
- todo_agent/infrastructure/todo_shell.py +332 -9
- todo_agent/interface/cli.py +8 -8
- todo_agent/interface/formatters.py +3 -9
- todo_agent/interface/tools.py +265 -9
- {todo_agent-0.2.6.dist-info → todo_agent-0.2.9.dist-info}/METADATA +33 -65
- todo_agent-0.2.9.dist-info/RECORD +29 -0
- todo_agent-0.2.6.dist-info/RECORD +0 -29
- {todo_agent-0.2.6.dist-info → todo_agent-0.2.9.dist-info}/WHEEL +0 -0
- {todo_agent-0.2.6.dist-info → todo_agent-0.2.9.dist-info}/entry_points.txt +0 -0
- {todo_agent-0.2.6.dist-info → todo_agent-0.2.9.dist-info}/licenses/LICENSE +0 -0
- {todo_agent-0.2.6.dist-info → todo_agent-0.2.9.dist-info}/top_level.txt +0 -0
todo_agent/interface/tools.py
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
"""
|
2
2
|
Tool definitions and schemas for LLM function calling.
|
3
|
+
|
4
|
+
AVAILABLE TOOLS:
|
5
|
+
|
6
|
+
Discovery Tools (Call FIRST):
|
7
|
+
- list_projects() - Get all available projects from todo.txt
|
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
|
11
|
+
|
12
|
+
Task Management Tools:
|
13
|
+
- add_task(description, priority?, project?, context?, due?, recurring?) - Add new task to todo.txt
|
14
|
+
- complete_task(task_number) - Mark task as complete by line number
|
15
|
+
- replace_task(task_number, new_description) - Replace entire task content
|
16
|
+
- append_to_task(task_number, text) - Add text to end of existing task
|
17
|
+
- prepend_to_task(task_number, text) - Add text to beginning of existing task
|
18
|
+
- delete_task(task_number, term?) - Delete entire task or remove specific term
|
19
|
+
|
20
|
+
Priority Management Tools:
|
21
|
+
- set_priority(task_number, priority) - Set or change task priority (A-Z)
|
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)
|
26
|
+
|
27
|
+
Utility Tools:
|
28
|
+
- get_overview() - Show task statistics and summary
|
29
|
+
- move_task(task_number, destination, source?) - Move task between files
|
30
|
+
- archive_tasks() - Archive completed tasks from todo.txt to done.txt
|
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
|
3
33
|
"""
|
4
34
|
|
5
35
|
import subprocess
|
@@ -173,7 +203,8 @@ class ToolCallHandler:
|
|
173
203
|
"ask the user if they want to add a new task or modify an existing one. "
|
174
204
|
"AUTOMATIC INFERENCE: When project, context, or due date is not specified, automatically infer appropriate tags "
|
175
205
|
"and due dates based on the task content, natural language expressions, task nature, calendar context, and existing patterns. "
|
176
|
-
"DUE DATE INFERENCE:
|
206
|
+
"DUE DATE INFERENCE: Use parse_date() tool to convert any temporal expressions to YYYY-MM-DD format. "
|
207
|
+
"Extract temporal expressions and use common sense to infer appropriate due dates based on task type, "
|
177
208
|
"work patterns, personal schedules, and existing task due date patterns. Only ask for clarification when genuinely ambiguous. "
|
178
209
|
"Always provide a complete, natural response to the user. "
|
179
210
|
"STRATEGIC CONTEXT: This is a modification tool - call this LAST after using "
|
@@ -201,7 +232,11 @@ class ToolCallHandler:
|
|
201
232
|
},
|
202
233
|
"due": {
|
203
234
|
"type": "string",
|
204
|
-
"description": "Optional due date in YYYY-MM-DD format.
|
235
|
+
"description": "Optional due date in YYYY-MM-DD format. Use parse_date() tool to convert natural language expressions like 'tomorrow', 'next week', 'by Friday' to YYYY-MM-DD format",
|
236
|
+
},
|
237
|
+
"recurring": {
|
238
|
+
"type": "string",
|
239
|
+
"description": "Optional recurring pattern in rec:frequency[:interval] format (e.g., 'rec:daily', 'rec:weekly:2', 'rec:monthly'). Use for tasks that repeat automatically.",
|
205
240
|
},
|
206
241
|
},
|
207
242
|
"required": ["description"],
|
@@ -265,7 +300,11 @@ class ToolCallHandler:
|
|
265
300
|
"name": "append_to_task",
|
266
301
|
"description": (
|
267
302
|
"Add text to the end of an existing task. Use this when user wants "
|
268
|
-
"to add additional information to a task without replacing it entirely."
|
303
|
+
"to add additional information to a task without replacing it entirely. "
|
304
|
+
"CRITICAL: DO NOT use this for adding project tags (+project) or context tags (@context) - "
|
305
|
+
"use set_project() or set_context() instead. "
|
306
|
+
"DO NOT use this for adding due dates - use set_due_date() instead. "
|
307
|
+
"This tool is for adding descriptive text, notes, or comments to tasks."
|
269
308
|
),
|
270
309
|
"parameters": {
|
271
310
|
"type": "object",
|
@@ -380,6 +419,97 @@ class ToolCallHandler:
|
|
380
419
|
},
|
381
420
|
},
|
382
421
|
},
|
422
|
+
{
|
423
|
+
"type": "function",
|
424
|
+
"function": {
|
425
|
+
"name": "set_due_date",
|
426
|
+
"description": (
|
427
|
+
"Set or update the due date for a task by intelligently rewriting it. "
|
428
|
+
"This preserves all existing task components (priority, projects, contexts, etc.) "
|
429
|
+
"while updating or adding the due date. Use empty string to remove the due date. "
|
430
|
+
"IMPORTANT: Use list_tasks() first "
|
431
|
+
"to find the correct task number if user doesn't specify it. "
|
432
|
+
"Use parse_date() tool to convert natural language expressions like 'tomorrow', "
|
433
|
+
"'next week', 'by Friday' to YYYY-MM-DD format."
|
434
|
+
),
|
435
|
+
"parameters": {
|
436
|
+
"type": "object",
|
437
|
+
"properties": {
|
438
|
+
"task_number": {
|
439
|
+
"type": "integer",
|
440
|
+
"description": "The line number of the task to modify (required)",
|
441
|
+
},
|
442
|
+
"due_date": {
|
443
|
+
"type": "string",
|
444
|
+
"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.",
|
445
|
+
},
|
446
|
+
},
|
447
|
+
"required": ["task_number", "due_date"],
|
448
|
+
},
|
449
|
+
},
|
450
|
+
},
|
451
|
+
{
|
452
|
+
"type": "function",
|
453
|
+
"function": {
|
454
|
+
"name": "set_context",
|
455
|
+
"description": (
|
456
|
+
"Set or update the context for a task by intelligently rewriting it. "
|
457
|
+
"This preserves all existing task components (priority, projects, due date, etc.) "
|
458
|
+
"while updating or adding the context. Use empty string to remove the context. "
|
459
|
+
"PREFERRED METHOD: Use this instead of append_to_task() when adding context tags (@context). "
|
460
|
+
"This tool properly manages context organization and prevents formatting issues. "
|
461
|
+
"IMPORTANT: Use list_tasks() first "
|
462
|
+
"to find the correct task number if user doesn't specify it."
|
463
|
+
),
|
464
|
+
"parameters": {
|
465
|
+
"type": "object",
|
466
|
+
"properties": {
|
467
|
+
"task_number": {
|
468
|
+
"type": "integer",
|
469
|
+
"description": "The line number of the task to modify (required)",
|
470
|
+
},
|
471
|
+
"context": {
|
472
|
+
"type": "string",
|
473
|
+
"description": "Context to set for the task (required). Use empty string to remove context.",
|
474
|
+
},
|
475
|
+
},
|
476
|
+
"required": ["task_number", "context"],
|
477
|
+
},
|
478
|
+
},
|
479
|
+
},
|
480
|
+
{
|
481
|
+
"type": "function",
|
482
|
+
"function": {
|
483
|
+
"name": "set_project",
|
484
|
+
"description": (
|
485
|
+
"Set or update projects for a task by intelligently rewriting it. "
|
486
|
+
"This preserves all existing task components and manages projects intelligently. "
|
487
|
+
"Supports multiple projects, prevents duplicates, and groups them together. "
|
488
|
+
"Empty array or empty strings are NOOPs (no changes). "
|
489
|
+
"Use '-project' syntax to remove specific projects. "
|
490
|
+
"PREFERRED METHOD: Use this instead of append_to_task() when adding project tags (+project). "
|
491
|
+
"This tool properly manages project organization and prevents formatting issues. "
|
492
|
+
"IMPORTANT: Use list_tasks() first "
|
493
|
+
"to find the correct task number if user doesn't specify it. "
|
494
|
+
"Project names should be provided without the + symbol (e.g., 'work' not '+work')."
|
495
|
+
),
|
496
|
+
"parameters": {
|
497
|
+
"type": "object",
|
498
|
+
"properties": {
|
499
|
+
"task_number": {
|
500
|
+
"type": "integer",
|
501
|
+
"description": "The line number of the task to modify (required)",
|
502
|
+
},
|
503
|
+
"projects": {
|
504
|
+
"type": "array",
|
505
|
+
"items": {"type": "string"},
|
506
|
+
"description": "Array of project operations. Each item can be: project name (add), '-project' (remove), or empty string (remove all) (required).",
|
507
|
+
},
|
508
|
+
},
|
509
|
+
"required": ["task_number", "projects"],
|
510
|
+
},
|
511
|
+
},
|
512
|
+
},
|
383
513
|
{
|
384
514
|
"type": "function",
|
385
515
|
"function": {
|
@@ -435,13 +565,27 @@ class ToolCallHandler:
|
|
435
565
|
{
|
436
566
|
"type": "function",
|
437
567
|
"function": {
|
438
|
-
"name": "
|
568
|
+
"name": "parse_date",
|
439
569
|
"description": (
|
440
|
-
"
|
441
|
-
"
|
442
|
-
"
|
570
|
+
"Convert natural language date expressions to YYYY-MM-DD format. "
|
571
|
+
"Use this when: "
|
572
|
+
"1) User mentions weekdays like 'due on Monday', 'by Friday', 'next Tuesday', "
|
573
|
+
"2) User uses relative dates like 'tomorrow', 'next week', 'in 3 days', "
|
574
|
+
"3) User says 'this Monday' vs 'next Monday' and you need the exact date, "
|
575
|
+
"4) You need to convert any temporal expression to a specific calendar date. "
|
576
|
+
"This tool handles all date parsing to ensure accuracy and consistency. "
|
577
|
+
"CRITICAL: Use this tool whenever you need to convert any date expression to YYYY-MM-DD format."
|
443
578
|
),
|
444
|
-
"parameters": {
|
579
|
+
"parameters": {
|
580
|
+
"type": "object",
|
581
|
+
"properties": {
|
582
|
+
"date_expression": {
|
583
|
+
"type": "string",
|
584
|
+
"description": "The natural language date expression to parse (e.g., 'next Monday', 'tomorrow', 'by Friday', 'in 3 days')",
|
585
|
+
},
|
586
|
+
},
|
587
|
+
"required": ["date_expression"],
|
588
|
+
},
|
445
589
|
},
|
446
590
|
},
|
447
591
|
{
|
@@ -507,6 +651,115 @@ class ToolCallHandler:
|
|
507
651
|
|
508
652
|
return calendar.month(year, month).strip()
|
509
653
|
|
654
|
+
def _parse_date(self, date_expression: str) -> str:
|
655
|
+
"""
|
656
|
+
Parse natural language date expressions to YYYY-MM-DD format.
|
657
|
+
|
658
|
+
Args:
|
659
|
+
date_expression: Natural language date expression
|
660
|
+
|
661
|
+
Returns:
|
662
|
+
Date in YYYY-MM-DD format
|
663
|
+
"""
|
664
|
+
try:
|
665
|
+
# Use the date command to parse natural language expressions
|
666
|
+
result = subprocess.run(
|
667
|
+
["date", "-d", date_expression, "+%Y-%m-%d"],
|
668
|
+
capture_output=True,
|
669
|
+
text=True,
|
670
|
+
check=True,
|
671
|
+
)
|
672
|
+
return result.stdout.strip()
|
673
|
+
except (subprocess.SubprocessError, FileNotFoundError):
|
674
|
+
# Fallback to Python date parsing
|
675
|
+
import re
|
676
|
+
from datetime import datetime, timedelta
|
677
|
+
|
678
|
+
today = datetime.now()
|
679
|
+
date_expr = date_expression.lower().strip()
|
680
|
+
|
681
|
+
# Handle "next [weekday]" patterns
|
682
|
+
next_match = re.match(
|
683
|
+
r"next\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)",
|
684
|
+
date_expr,
|
685
|
+
)
|
686
|
+
if next_match:
|
687
|
+
weekday_name = next_match.group(1)
|
688
|
+
weekday_map = {
|
689
|
+
"monday": 0,
|
690
|
+
"tuesday": 1,
|
691
|
+
"wednesday": 2,
|
692
|
+
"thursday": 3,
|
693
|
+
"friday": 4,
|
694
|
+
"saturday": 5,
|
695
|
+
"sunday": 6,
|
696
|
+
}
|
697
|
+
target_weekday = weekday_map[weekday_name]
|
698
|
+
days_ahead = target_weekday - today.weekday()
|
699
|
+
if days_ahead <= 0: # Target day already happened this week
|
700
|
+
days_ahead += 7
|
701
|
+
target_date = today + timedelta(days=days_ahead)
|
702
|
+
return target_date.strftime("%Y-%m-%d")
|
703
|
+
|
704
|
+
# Handle "this [weekday]" patterns
|
705
|
+
this_match = re.match(
|
706
|
+
r"this\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)",
|
707
|
+
date_expr,
|
708
|
+
)
|
709
|
+
if this_match:
|
710
|
+
weekday_name = this_match.group(1)
|
711
|
+
weekday_map = {
|
712
|
+
"monday": 0,
|
713
|
+
"tuesday": 1,
|
714
|
+
"wednesday": 2,
|
715
|
+
"thursday": 3,
|
716
|
+
"friday": 4,
|
717
|
+
"saturday": 5,
|
718
|
+
"sunday": 6,
|
719
|
+
}
|
720
|
+
target_weekday = weekday_map[weekday_name]
|
721
|
+
days_ahead = target_weekday - today.weekday()
|
722
|
+
if days_ahead < 0: # Target day already happened this week
|
723
|
+
days_ahead += 7
|
724
|
+
target_date = today + timedelta(days=days_ahead)
|
725
|
+
return target_date.strftime("%Y-%m-%d")
|
726
|
+
|
727
|
+
# Handle "tomorrow"
|
728
|
+
if date_expr == "tomorrow":
|
729
|
+
return (today + timedelta(days=1)).strftime("%Y-%m-%d")
|
730
|
+
|
731
|
+
# Handle "in X days"
|
732
|
+
days_match = re.match(r"in\s+(\d+)\s+days?", date_expr)
|
733
|
+
if days_match:
|
734
|
+
days = int(days_match.group(1))
|
735
|
+
return (today + timedelta(days=days)).strftime("%Y-%m-%d")
|
736
|
+
|
737
|
+
# Handle "by [weekday]" - same as "next [weekday]"
|
738
|
+
by_match = re.match(
|
739
|
+
r"by\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)",
|
740
|
+
date_expr,
|
741
|
+
)
|
742
|
+
if by_match:
|
743
|
+
weekday_name = by_match.group(1)
|
744
|
+
weekday_map = {
|
745
|
+
"monday": 0,
|
746
|
+
"tuesday": 1,
|
747
|
+
"wednesday": 2,
|
748
|
+
"thursday": 3,
|
749
|
+
"friday": 4,
|
750
|
+
"saturday": 5,
|
751
|
+
"sunday": 6,
|
752
|
+
}
|
753
|
+
target_weekday = weekday_map[weekday_name]
|
754
|
+
days_ahead = target_weekday - today.weekday()
|
755
|
+
if days_ahead <= 0: # Target day already happened this week
|
756
|
+
days_ahead += 7
|
757
|
+
target_date = today + timedelta(days=days_ahead)
|
758
|
+
return target_date.strftime("%Y-%m-%d")
|
759
|
+
|
760
|
+
# If we can't parse it, return today's date as fallback
|
761
|
+
return today.strftime("%Y-%m-%d")
|
762
|
+
|
510
763
|
def _format_tool_signature(self, tool_name: str, arguments: Dict[str, Any]) -> str:
|
511
764
|
"""Format tool signature with parameters for logging."""
|
512
765
|
if not arguments:
|
@@ -570,10 +823,13 @@ class ToolCallHandler:
|
|
570
823
|
"delete_task": self.todo_manager.delete_task,
|
571
824
|
"set_priority": self.todo_manager.set_priority,
|
572
825
|
"remove_priority": self.todo_manager.remove_priority,
|
826
|
+
"set_due_date": self.todo_manager.set_due_date,
|
827
|
+
"set_context": self.todo_manager.set_context,
|
828
|
+
"set_project": self.todo_manager.set_project,
|
573
829
|
"get_overview": self.todo_manager.get_overview,
|
574
830
|
"move_task": self.todo_manager.move_task,
|
575
831
|
"archive_tasks": self.todo_manager.archive_tasks,
|
576
|
-
"
|
832
|
+
"parse_date": self._parse_date,
|
577
833
|
"get_calendar": self._get_calendar,
|
578
834
|
}
|
579
835
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: todo-agent
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.9
|
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
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
todo_agent/__init__.py,sha256=RUowhd14r3tqB_7rl83unGV8oBjra3UOIl7jix-33fk,254
|
2
|
+
todo_agent/_version.py,sha256=051on7ZmwGNyKvbO1AXKoElw7RjLuRmeJqVOApytNd4,704
|
3
|
+
todo_agent/main.py,sha256=-ryhMm4c4sz4e4anXI8B-CYnpEh5HIkmnYcnGxcWHDk,1628
|
4
|
+
todo_agent/core/__init__.py,sha256=QAZ4it63pXv5-DxtNcuSAmg7ZnCY5ackI5yycvKHr9I,365
|
5
|
+
todo_agent/core/conversation_manager.py,sha256=nRFcDMqZtumVipggzVe94Hwz9HDbc2CrTssk_HImwEI,13548
|
6
|
+
todo_agent/core/exceptions.py,sha256=cPvvkIbKdI7l51wC7cE-ZxUi54P3nf2m7x2lMNMRFYM,399
|
7
|
+
todo_agent/core/todo_manager.py,sha256=wT82Wpwby6LR9VacLXhdDiGiMNoQbovXmU9943e5X2M,14908
|
8
|
+
todo_agent/infrastructure/__init__.py,sha256=SGbHXgzq6U1DMgOfWPMsWEK99zjPSF-6gzy7xqc5fsI,284
|
9
|
+
todo_agent/infrastructure/calendar_utils.py,sha256=HmF0ykXF_6GbdoJvZLIv6fKwT6ipixoywdTMkIXmkGU,1871
|
10
|
+
todo_agent/infrastructure/config.py,sha256=zyp6qOlg1nN_awphivlgGNBE6fL0Hf66YgvWxR8ldyQ,2117
|
11
|
+
todo_agent/infrastructure/inference.py,sha256=PJouydXREgTIkZQVumdCvrwIbMdPR79baRV1W0s2TLA,11802
|
12
|
+
todo_agent/infrastructure/llm_client.py,sha256=ZoObyqaRP6i_eqGYGfJWGeWTJ-VNxpY70ay04vt2v_E,1390
|
13
|
+
todo_agent/infrastructure/llm_client_factory.py,sha256=-tktnVOIF7B45WR7AuLoi7MKnEyuM8lgg1jjc4T1FhM,1929
|
14
|
+
todo_agent/infrastructure/logger.py,sha256=2ykG_0lyzmEGxDF6ZRl1qiTUGDuFeQgzv4Na6vRmXcM,4110
|
15
|
+
todo_agent/infrastructure/ollama_client.py,sha256=RVgHqX37k7q5xEaEXdhcCv2HYQiszs1QV39RxFFMIas,5902
|
16
|
+
todo_agent/infrastructure/openrouter_client.py,sha256=FV240sQxoJ8j_Umh0qc6IorHkwk3LAFTSekGHKxuFwk,7000
|
17
|
+
todo_agent/infrastructure/todo_shell.py,sha256=kYS0UwDZU1OpUVpWMkVsnsxnHINoWliRqzDRD8VTXJQ,17375
|
18
|
+
todo_agent/infrastructure/token_counter.py,sha256=PCKheOVJbp1s89yhh_i6iKgURMt9mVoYkwjQJCc2xCE,4958
|
19
|
+
todo_agent/infrastructure/prompts/system_prompt.txt,sha256=HTv7Yl2oQi-AbQgdBzZKNKnmAMdOuOVRlbi75L-w-5g,19962
|
20
|
+
todo_agent/interface/__init__.py,sha256=vDD3rQu4qDkpvVwGVtkDzE1M4IiSHYzTif4GbYSFWaI,457
|
21
|
+
todo_agent/interface/cli.py,sha256=9DUKTrxTwKx5Go0cA8nNCKDuM6QDmAG8jzK4_v_1WS8,12096
|
22
|
+
todo_agent/interface/formatters.py,sha256=DiQLemndiuFWjLcBRPpu1wVnJcoYAFP8t_fJstOgaDs,18918
|
23
|
+
todo_agent/interface/tools.py,sha256=OE9qOwWo7itqmNc85tZSCqWHCvValMa4fQE-EygnNNQ,45929
|
24
|
+
todo_agent-0.2.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
25
|
+
todo_agent-0.2.9.dist-info/METADATA,sha256=OPm-ho33qlhnZqrnNlqRR2p4tLqlXzkNk-fgcY73Dg0,10134
|
26
|
+
todo_agent-0.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
27
|
+
todo_agent-0.2.9.dist-info/entry_points.txt,sha256=4W7LrCib6AXP5IZDwWRht8S5gutLu5oNfTJHGbt4oHs,52
|
28
|
+
todo_agent-0.2.9.dist-info/top_level.txt,sha256=a65mlPIhPZHuq2bRIi_sCMAIJsUddvXt171OBF6r6co,11
|
29
|
+
todo_agent-0.2.9.dist-info/RECORD,,
|
@@ -1,29 +0,0 @@
|
|
1
|
-
todo_agent/__init__.py,sha256=RUowhd14r3tqB_7rl83unGV8oBjra3UOIl7jix-33fk,254
|
2
|
-
todo_agent/_version.py,sha256=2Q6v117QPuRsVsIEaHT3nJJVx7xxa47FYOkmuhVbGAI,704
|
3
|
-
todo_agent/main.py,sha256=-ryhMm4c4sz4e4anXI8B-CYnpEh5HIkmnYcnGxcWHDk,1628
|
4
|
-
todo_agent/core/__init__.py,sha256=QAZ4it63pXv5-DxtNcuSAmg7ZnCY5ackI5yycvKHr9I,365
|
5
|
-
todo_agent/core/conversation_manager.py,sha256=gSCcX356UJ0T3FCTS1q0fOud0ytFKXptf9RyKjzpTYI,11640
|
6
|
-
todo_agent/core/exceptions.py,sha256=cPvvkIbKdI7l51wC7cE-ZxUi54P3nf2m7x2lMNMRFYM,399
|
7
|
-
todo_agent/core/todo_manager.py,sha256=Dyc5NbDd_u21nJlS-C8KxefGJpEcHOLtL21qqQEit2Q,9142
|
8
|
-
todo_agent/infrastructure/__init__.py,sha256=SGbHXgzq6U1DMgOfWPMsWEK99zjPSF-6gzy7xqc5fsI,284
|
9
|
-
todo_agent/infrastructure/calendar_utils.py,sha256=HmF0ykXF_6GbdoJvZLIv6fKwT6ipixoywdTMkIXmkGU,1871
|
10
|
-
todo_agent/infrastructure/config.py,sha256=zyp6qOlg1nN_awphivlgGNBE6fL0Hf66YgvWxR8ldyQ,2117
|
11
|
-
todo_agent/infrastructure/inference.py,sha256=J6i9jtzOVo2Yy3e6yAUBH22ik3OqHs1I0zrADhs4IRk,10676
|
12
|
-
todo_agent/infrastructure/llm_client.py,sha256=ZoObyqaRP6i_eqGYGfJWGeWTJ-VNxpY70ay04vt2v_E,1390
|
13
|
-
todo_agent/infrastructure/llm_client_factory.py,sha256=-tktnVOIF7B45WR7AuLoi7MKnEyuM8lgg1jjc4T1FhM,1929
|
14
|
-
todo_agent/infrastructure/logger.py,sha256=2ykG_0lyzmEGxDF6ZRl1qiTUGDuFeQgzv4Na6vRmXcM,4110
|
15
|
-
todo_agent/infrastructure/ollama_client.py,sha256=zElS9OhkieCJQFSUxBqBd6k-u9I0cIpMwJG08dLQ1QA,5926
|
16
|
-
todo_agent/infrastructure/openrouter_client.py,sha256=u-yIENA6PVpBKS0oy6l-muzZDvCtJIP9lF8AjeHgvtQ,7153
|
17
|
-
todo_agent/infrastructure/todo_shell.py,sha256=z6kqUKDX-i4DfYJKoOLiPLCp8y6m1HdTDLHTvmLpzMc,5801
|
18
|
-
todo_agent/infrastructure/token_counter.py,sha256=PCKheOVJbp1s89yhh_i6iKgURMt9mVoYkwjQJCc2xCE,4958
|
19
|
-
todo_agent/infrastructure/prompts/system_prompt.txt,sha256=Y2bb9gcdpJeybaaBdBZhI0FmmQ5jJQwnz0BdSRGLJCw,10726
|
20
|
-
todo_agent/interface/__init__.py,sha256=vDD3rQu4qDkpvVwGVtkDzE1M4IiSHYzTif4GbYSFWaI,457
|
21
|
-
todo_agent/interface/cli.py,sha256=1nPUFEzbSl4bdy6hcIGM1izGWDwbjaijfBCWfPBb31E,12062
|
22
|
-
todo_agent/interface/formatters.py,sha256=Oc7ynL7vpb4i8f-XQM38gJlqTOVZfzyTBwWceeMHV_Y,18912
|
23
|
-
todo_agent/interface/tools.py,sha256=RkxsyqYbp0QYwtnJMXixBf727Atcp8DY6dm6949DTMY,32739
|
24
|
-
todo_agent-0.2.6.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
25
|
-
todo_agent-0.2.6.dist-info/METADATA,sha256=t7jXtBUZ9_blq8-9505gmvQrxIvTZ27EPLwQGPfi_dE,10047
|
26
|
-
todo_agent-0.2.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
27
|
-
todo_agent-0.2.6.dist-info/entry_points.txt,sha256=4W7LrCib6AXP5IZDwWRht8S5gutLu5oNfTJHGbt4oHs,52
|
28
|
-
todo_agent-0.2.6.dist-info/top_level.txt,sha256=a65mlPIhPZHuq2bRIi_sCMAIJsUddvXt171OBF6r6co,11
|
29
|
-
todo_agent-0.2.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|