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