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.
@@ -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: Extract temporal expressions and use common sense to infer appropriate due dates based on task type, "
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. Automatically inferred from natural language expressions like 'tomorrow', 'next week', 'by Friday', 'urgent', 'asap'",
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": "deduplicate_tasks",
568
+ "name": "parse_date",
439
569
  "description": (
440
- "Remove duplicate tasks from todo.txt. Use this when user wants "
441
- "to clean up duplicate entries or when you notice duplicate tasks "
442
- "in the list."
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": {"type": "object", "properties": {}, "required": []},
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
- "deduplicate_tasks": self.todo_manager.deduplicate_tasks,
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.6
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
- ## 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
 
@@ -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,,