yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
todo_commands.cc
Go to the documentation of this file.
2
3#include <iostream>
4
5#include "absl/strings/str_cat.h"
6#include "absl/strings/str_format.h"
7#include "absl/strings/str_join.h"
8#include "absl/strings/str_split.h"
10
11namespace yaze {
12namespace cli {
13namespace handlers {
14
15namespace {
16
17using agent::TodoItem;
19
20// Global TODO manager instance
22 static TodoManager manager;
23 static bool initialized = false;
24 if (!initialized) {
25 auto status = manager.Initialize();
26 if (!status.ok()) {
27 std::cerr << "Warning: Failed to initialize TODO manager: "
28 << status.message() << std::endl;
29 }
30 initialized = true;
31 }
32 return manager;
33}
34
35void PrintTodo(const TodoItem& item, bool detailed = false) {
36 std::string status_emoji;
37 switch (item.status) {
38 case TodoItem::Status::PENDING: status_emoji = "⏳"; break;
39 case TodoItem::Status::IN_PROGRESS: status_emoji = "🔄"; break;
40 case TodoItem::Status::COMPLETED: status_emoji = "✅"; break;
41 case TodoItem::Status::BLOCKED: status_emoji = "🚫"; break;
42 case TodoItem::Status::CANCELLED: status_emoji = "❌"; break;
43 }
44
45 std::cout << absl::StreamFormat("[%s] %s %s",
46 item.id,
47 status_emoji,
48 item.description);
49
50 if (!item.category.empty()) {
51 std::cout << absl::StreamFormat(" [%s]", item.category);
52 }
53
54 if (item.priority > 0) {
55 std::cout << absl::StreamFormat(" (priority: %d)", item.priority);
56 }
57
58 std::cout << std::endl;
59
60 if (detailed) {
61 std::cout << " Status: " << item.StatusToString() << std::endl;
62 std::cout << " Created: " << item.created_at << std::endl;
63 std::cout << " Updated: " << item.updated_at << std::endl;
64
65 if (!item.dependencies.empty()) {
66 std::cout << " Dependencies: " << absl::StrJoin(item.dependencies, ", ") << std::endl;
67 }
68
69 if (!item.tools_needed.empty()) {
70 std::cout << " Tools needed: " << absl::StrJoin(item.tools_needed, ", ") << std::endl;
71 }
72
73 if (!item.notes.empty()) {
74 std::cout << " Notes: " << item.notes << std::endl;
75 }
76 }
77}
78
79absl::Status HandleTodoCreate(const std::vector<std::string>& args) {
80 if (args.empty()) {
81 return absl::InvalidArgumentError("Usage: agent todo create <description> [--category=<cat>] [--priority=<n>]");
82 }
83
84 std::string description = args[0];
85 std::string category;
86 int priority = 0;
87
88 for (size_t i = 1; i < args.size(); ++i) {
89 if (args[i].find("--category=") == 0) {
90 category = args[i].substr(11);
91 } else if (args[i].find("--priority=") == 0) {
92 priority = std::stoi(args[i].substr(11));
93 }
94 }
95
96 auto& manager = GetTodoManager();
97 auto result = manager.CreateTodo(description, category, priority);
98
99 if (!result.ok()) {
100 return result.status();
101 }
102
103 std::cout << "Created TODO:" << std::endl;
104 PrintTodo(*result, true);
105
106 return absl::OkStatus();
107}
108
109absl::Status HandleTodoList(const std::vector<std::string>& args) {
110 std::string status_filter;
111 std::string category_filter;
112
113 for (const auto& arg : args) {
114 if (arg.find("--status=") == 0) {
115 status_filter = arg.substr(9);
116 } else if (arg.find("--category=") == 0) {
117 category_filter = arg.substr(11);
118 }
119 }
120
121 auto& manager = GetTodoManager();
122 std::vector<TodoItem> todos;
123
124 if (!status_filter.empty()) {
125 auto status = TodoItem::StringToStatus(status_filter);
126 todos = manager.GetTodosByStatus(status);
127 } else if (!category_filter.empty()) {
128 todos = manager.GetTodosByCategory(category_filter);
129 } else {
130 todos = manager.GetAllTodos();
131 }
132
133 if (todos.empty()) {
134 std::cout << "No TODOs found." << std::endl;
135 return absl::OkStatus();
136 }
137
138 std::cout << "TODOs (" << todos.size() << "):" << std::endl;
139 for (const auto& item : todos) {
140 PrintTodo(item);
141 }
142
143 return absl::OkStatus();
144}
145
146absl::Status HandleTodoUpdate(const std::vector<std::string>& args) {
147 if (args.size() < 2) {
148 return absl::InvalidArgumentError("Usage: agent todo update <id> --status=<status>");
149 }
150
151 std::string id = args[0];
152 std::string new_status_str;
153
154 for (size_t i = 1; i < args.size(); ++i) {
155 if (args[i].find("--status=") == 0) {
156 new_status_str = args[i].substr(9);
157 }
158 }
159
160 if (new_status_str.empty()) {
161 return absl::InvalidArgumentError("--status parameter is required");
162 }
163
164 auto new_status = TodoItem::StringToStatus(new_status_str);
165 auto& manager = GetTodoManager();
166 auto status = manager.UpdateStatus(id, new_status);
167
168 if (!status.ok()) {
169 return status;
170 }
171
172 std::cout << "Updated TODO " << id << " to status: " << new_status_str << std::endl;
173 return absl::OkStatus();
174}
175
176absl::Status HandleTodoShow(const std::vector<std::string>& args) {
177 if (args.empty()) {
178 return absl::InvalidArgumentError("Usage: agent todo show <id>");
179 }
180
181 std::string id = args[0];
182 auto& manager = GetTodoManager();
183 auto result = manager.GetTodo(id);
184
185 if (!result.ok()) {
186 return result.status();
187 }
188
189 PrintTodo(*result, true);
190 return absl::OkStatus();
191}
192
193absl::Status HandleTodoDelete(const std::vector<std::string>& args) {
194 if (args.empty()) {
195 return absl::InvalidArgumentError("Usage: agent todo delete <id>");
196 }
197
198 std::string id = args[0];
199 auto& manager = GetTodoManager();
200 auto status = manager.DeleteTodo(id);
201
202 if (!status.ok()) {
203 return status;
204 }
205
206 std::cout << "Deleted TODO " << id << std::endl;
207 return absl::OkStatus();
208}
209
210absl::Status HandleTodoClearCompleted(const std::vector<std::string>& args) {
211 auto& manager = GetTodoManager();
212 auto status = manager.ClearCompleted();
213
214 if (!status.ok()) {
215 return status;
216 }
217
218 std::cout << "Cleared all completed TODOs" << std::endl;
219 return absl::OkStatus();
220}
221
222absl::Status HandleTodoNext(const std::vector<std::string>& args) {
223 auto& manager = GetTodoManager();
224 auto result = manager.GetNextActionableTodo();
225
226 if (!result.ok()) {
227 return result.status();
228 }
229
230 std::cout << "Next actionable TODO:" << std::endl;
231 PrintTodo(*result, true);
232
233 return absl::OkStatus();
234}
235
236absl::Status HandleTodoPlan(const std::vector<std::string>& args) {
237 auto& manager = GetTodoManager();
238 auto result = manager.GenerateExecutionPlan();
239
240 if (!result.ok()) {
241 return result.status();
242 }
243
244 auto& plan = *result;
245 if (plan.empty()) {
246 std::cout << "No pending TODOs." << std::endl;
247 return absl::OkStatus();
248 }
249
250 std::cout << "Execution Plan (" << plan.size() << " tasks):" << std::endl;
251 for (size_t i = 0; i < plan.size(); ++i) {
252 std::cout << absl::StreamFormat("%2d. ", i + 1);
253 PrintTodo(plan[i]);
254 }
255
256 return absl::OkStatus();
257}
258
259} // namespace
260
261absl::Status HandleTodoCommand(const std::vector<std::string>& args) {
262 if (args.empty()) {
263 std::cerr << "Usage: agent todo <command> [options]" << std::endl;
264 std::cerr << "Commands:" << std::endl;
265 std::cerr << " create - Create a new TODO" << std::endl;
266 std::cerr << " list - List all TODOs" << std::endl;
267 std::cerr << " update - Update TODO status" << std::endl;
268 std::cerr << " show - Show TODO details" << std::endl;
269 std::cerr << " delete - Delete a TODO" << std::endl;
270 std::cerr << " clear-completed - Clear completed TODOs" << std::endl;
271 std::cerr << " next - Get next actionable TODO" << std::endl;
272 std::cerr << " plan - Generate execution plan" << std::endl;
273 return absl::InvalidArgumentError("No command specified");
274 }
275
276 std::string subcommand = args[0];
277 std::vector<std::string> subargs(args.begin() + 1, args.end());
278
279 if (subcommand == "create") {
280 return HandleTodoCreate(subargs);
281 } else if (subcommand == "list") {
282 return HandleTodoList(subargs);
283 } else if (subcommand == "update") {
284 return HandleTodoUpdate(subargs);
285 } else if (subcommand == "show") {
286 return HandleTodoShow(subargs);
287 } else if (subcommand == "delete") {
288 return HandleTodoDelete(subargs);
289 } else if (subcommand == "clear-completed") {
290 return HandleTodoClearCompleted(subargs);
291 } else if (subcommand == "next") {
292 return HandleTodoNext(subargs);
293 } else if (subcommand == "plan") {
294 return HandleTodoPlan(subargs);
295 } else {
296 return absl::InvalidArgumentError(
297 absl::StrFormat("Unknown todo command: %s", subcommand));
298 }
299}
300
301} // namespace handlers
302} // namespace cli
303} // namespace yaze
Manages TODO lists for z3ed agent task execution.
absl::Status Initialize()
Initialize the TODO manager and load persisted data.
absl::Status HandleTodoShow(const std::vector< std::string > &args)
absl::Status HandleTodoPlan(const std::vector< std::string > &args)
absl::Status HandleTodoUpdate(const std::vector< std::string > &args)
void PrintTodo(const TodoItem &item, bool detailed=false)
absl::Status HandleTodoNext(const std::vector< std::string > &args)
absl::Status HandleTodoClearCompleted(const std::vector< std::string > &args)
absl::Status HandleTodoCreate(const std::vector< std::string > &args)
absl::Status HandleTodoList(const std::vector< std::string > &args)
absl::Status HandleTodoDelete(const std::vector< std::string > &args)
absl::Status HandleTodoCommand(const std::vector< std::string > &args)
Handle z3ed agent todo commands.
Main namespace for the application.
Definition controller.cc:20
Represents a single TODO item for task management.
enum yaze::cli::agent::TodoItem::Status status
std::vector< std::string > dependencies
std::vector< std::string > tools_needed
std::string StatusToString() const