@qodalis/cli-todo 0.0.6 โ†’ 2.0.0-beta.10

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.
package/public-api.js ADDED
@@ -0,0 +1,552 @@
1
+ 'use strict';
2
+
3
+ var cliCore = require('@qodalis/cli-core');
4
+
5
+ // src/lib/utilities/index.ts
6
+ var DAY_NAMES = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
7
+ var MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
8
+ function startOfDay(date) {
9
+ const d = new Date(date);
10
+ d.setHours(0, 0, 0, 0);
11
+ return d;
12
+ }
13
+ function parseDueDate(input) {
14
+ const trimmed = input.trim().toLowerCase();
15
+ const now = /* @__PURE__ */ new Date();
16
+ const today = startOfDay(now);
17
+ if (trimmed === "today") {
18
+ return today.toISOString();
19
+ }
20
+ if (trimmed === "tomorrow") {
21
+ const d = new Date(today);
22
+ d.setDate(d.getDate() + 1);
23
+ return d.toISOString();
24
+ }
25
+ if (trimmed === "yesterday") {
26
+ const d = new Date(today);
27
+ d.setDate(d.getDate() - 1);
28
+ return d.toISOString();
29
+ }
30
+ if (trimmed === "next week") {
31
+ const d = new Date(today);
32
+ d.setDate(d.getDate() + 7);
33
+ return d.toISOString();
34
+ }
35
+ if (trimmed === "next month") {
36
+ const d = new Date(today);
37
+ d.setMonth(d.getMonth() + 1);
38
+ return d.toISOString();
39
+ }
40
+ const dayIndex = DAY_NAMES.indexOf(trimmed);
41
+ if (dayIndex !== -1) {
42
+ const d = new Date(today);
43
+ const currentDay = d.getDay();
44
+ let daysUntil = dayIndex - currentDay;
45
+ if (daysUntil <= 0) daysUntil += 7;
46
+ d.setDate(d.getDate() + daysUntil);
47
+ return d.toISOString();
48
+ }
49
+ const isoMatch = trimmed.match(/^\d{4}-\d{2}-\d{2}$/);
50
+ if (isoMatch) {
51
+ const d = /* @__PURE__ */ new Date(trimmed + "T00:00:00");
52
+ if (!isNaN(d.getTime())) {
53
+ return startOfDay(d).toISOString();
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ function formatRelativeDate(isoDate) {
59
+ const target = startOfDay(new Date(isoDate));
60
+ const today = startOfDay(/* @__PURE__ */ new Date());
61
+ const diffMs = target.getTime() - today.getTime();
62
+ const diffDays = Math.round(diffMs / (1e3 * 60 * 60 * 24));
63
+ if (diffDays === 0) return "due: today";
64
+ if (diffDays === 1) return "due: tomorrow";
65
+ if (diffDays === -1) return "overdue: yesterday";
66
+ if (diffDays > 1 && diffDays <= 14) return `due: in ${diffDays} days`;
67
+ if (diffDays < -1) return `overdue: ${Math.abs(diffDays)} days ago`;
68
+ const d = new Date(isoDate);
69
+ return `due: ${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`;
70
+ }
71
+ function isOverdue(todo) {
72
+ if (todo.completed || !todo.dueDate) return false;
73
+ const target = startOfDay(new Date(todo.dueDate));
74
+ const today = startOfDay(/* @__PURE__ */ new Date());
75
+ return target.getTime() < today.getTime();
76
+ }
77
+ function migrateTodoItem(item) {
78
+ return {
79
+ id: item.id,
80
+ text: item.text,
81
+ completed: item.completed ?? false,
82
+ createdAt: item.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
83
+ completedAt: item.completedAt,
84
+ dueDate: item.dueDate
85
+ };
86
+ }
87
+ function lineThroughText(text) {
88
+ return text.split("").map((char) => char + "\u0336").join("");
89
+ }
90
+
91
+ // src/lib/version.ts
92
+ var LIBRARY_VERSION = "2.0.0-beta.10";
93
+ var API_VERSION = 2;
94
+
95
+ // src/lib/processors/cli-todo-command-processor.ts
96
+ var CliTodoCommandProcessor = class {
97
+ constructor() {
98
+ this.command = "todo";
99
+ this.description = "Manage your tasks from the terminal. Add, list, edit, complete, and remove TODO items.";
100
+ this.author = cliCore.DefaultLibraryAuthor;
101
+ this.version = LIBRARY_VERSION;
102
+ this.processors = [];
103
+ this.metadata = {
104
+ icon: "\u{1F4DD}",
105
+ requiredCoreVersion: ">=2.0.0 <3.0.0",
106
+ requiredCliVersion: ">=2.0.0 <3.0.0"
107
+ };
108
+ this.configurationOptions = [
109
+ {
110
+ key: "showCompletedFirst",
111
+ label: "Show Completed First",
112
+ description: "List completed tasks before pending ones",
113
+ type: "boolean",
114
+ defaultValue: false
115
+ },
116
+ {
117
+ key: "confirmBeforeDelete",
118
+ label: "Confirm Before Delete",
119
+ description: "Ask for confirmation before removing tasks",
120
+ type: "boolean",
121
+ defaultValue: false
122
+ }
123
+ ];
124
+ this.stateConfiguration = {
125
+ initialState: {
126
+ todos: this.loadFromOldStorage() ?? []
127
+ }
128
+ };
129
+ this.todos = [];
130
+ this.nextId = 1;
131
+ this.registerSubProcessors();
132
+ }
133
+ getTodos() {
134
+ return this.todos;
135
+ }
136
+ async processCommand(command, context) {
137
+ context.executor.showHelp(command, context);
138
+ }
139
+ writeDescription(context) {
140
+ const { writer } = context;
141
+ writer.writeln(this.description);
142
+ writer.writeln();
143
+ writer.writeln(writer.wrapInColor("Commands:", cliCore.CliForegroundColor.Yellow));
144
+ writer.writeln(` ${writer.wrapInColor("todo ls", cliCore.CliForegroundColor.Cyan)} List all tasks`);
145
+ writer.writeln(` ${writer.wrapInColor("todo ls --pending", cliCore.CliForegroundColor.Cyan)} List pending tasks only`);
146
+ writer.writeln(` ${writer.wrapInColor("todo ls --completed", cliCore.CliForegroundColor.Cyan)} List completed tasks only`);
147
+ writer.writeln(` ${writer.wrapInColor("todo ls --overdue", cliCore.CliForegroundColor.Cyan)} List overdue tasks only`);
148
+ writer.writeln(` ${writer.wrapInColor("todo add <text>", cliCore.CliForegroundColor.Cyan)} Add a new task`);
149
+ writer.writeln(` ${writer.wrapInColor("todo add <text> --due <date>", cliCore.CliForegroundColor.Cyan)} Add with due date`);
150
+ writer.writeln(` ${writer.wrapInColor("todo edit <id> <new text>", cliCore.CliForegroundColor.Cyan)} Edit a task`);
151
+ writer.writeln(` ${writer.wrapInColor("todo done <id>", cliCore.CliForegroundColor.Cyan)} Mark a task as done`);
152
+ writer.writeln(` ${writer.wrapInColor("todo toggle <id>", cliCore.CliForegroundColor.Cyan)} Toggle done/undone`);
153
+ writer.writeln(` ${writer.wrapInColor("todo rm <id>", cliCore.CliForegroundColor.Cyan)} Remove a task`);
154
+ writer.writeln(` ${writer.wrapInColor("todo rm --all", cliCore.CliForegroundColor.Cyan)} Remove all tasks`);
155
+ writer.writeln();
156
+ writer.writeln(writer.wrapInColor("Due date formats:", cliCore.CliForegroundColor.Yellow));
157
+ writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);
158
+ writer.writeln();
159
+ writer.writeln(writer.wrapInColor("Examples:", cliCore.CliForegroundColor.Yellow));
160
+ writer.writeln(` todo add Buy groceries --due tomorrow`);
161
+ writer.writeln(` todo ls --pending`);
162
+ writer.writeln(` todo edit 3 Buy organic groceries`);
163
+ writer.writeln(` todo done 1`);
164
+ writer.writeln(` todo toggle 2`);
165
+ }
166
+ async initialize(context) {
167
+ context.state.select((x) => x["todos"]).subscribe((todos) => {
168
+ this.todos = (todos || []).map(migrateTodoItem);
169
+ this.nextId = this.todos.length > 0 ? Math.max(...this.todos.map((t) => t.id)) + 1 : 1;
170
+ });
171
+ }
172
+ formatTodoLine(todo, writer) {
173
+ const check = todo.completed ? writer.wrapInColor(cliCore.CliIcon.CheckIcon, cliCore.CliForegroundColor.Green) : " ";
174
+ const text = todo.completed ? lineThroughText(todo.text) : todo.text;
175
+ let suffix = "";
176
+ if (todo.completed) {
177
+ suffix = writer.wrapInColor(" done", cliCore.CliForegroundColor.Green);
178
+ } else if (todo.dueDate) {
179
+ const rel = formatRelativeDate(todo.dueDate);
180
+ const color = isOverdue(todo) ? cliCore.CliForegroundColor.Red : cliCore.CliForegroundColor.Yellow;
181
+ suffix = " " + writer.wrapInColor(rel, color);
182
+ }
183
+ return ` [${check}] #${todo.id} - ${text}${suffix}`;
184
+ }
185
+ registerSubProcessors() {
186
+ this.processors = [
187
+ // โ”€โ”€ ls โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
188
+ {
189
+ command: "ls",
190
+ aliases: ["list"],
191
+ description: "List TODO items",
192
+ parameters: [
193
+ {
194
+ name: "pending",
195
+ description: "Show only pending tasks",
196
+ type: "boolean",
197
+ required: false
198
+ },
199
+ {
200
+ name: "completed",
201
+ description: "Show only completed tasks",
202
+ type: "boolean",
203
+ required: false
204
+ },
205
+ {
206
+ name: "overdue",
207
+ description: "Show only overdue tasks",
208
+ type: "boolean",
209
+ required: false
210
+ }
211
+ ],
212
+ processCommand: async (command, context) => {
213
+ if (this.todos.length === 0) {
214
+ context.writer.writeWarning("No tasks yet.");
215
+ context.writer.writeln('Use "todo add <text>" to create one.');
216
+ context.process.output([]);
217
+ return;
218
+ }
219
+ let filtered = [...this.todos];
220
+ const args = command.args;
221
+ if (args["pending"]) {
222
+ filtered = filtered.filter((t) => !t.completed);
223
+ } else if (args["completed"]) {
224
+ filtered = filtered.filter((t) => t.completed);
225
+ } else if (args["overdue"]) {
226
+ filtered = filtered.filter((t) => isOverdue(t));
227
+ }
228
+ const showCompletedFirst = cliCore.getPluginConfigValue(context, "todo", "showCompletedFirst", false);
229
+ if (showCompletedFirst) {
230
+ filtered.sort((a, b) => a.completed === b.completed ? 0 : a.completed ? -1 : 1);
231
+ }
232
+ const doneCount = this.todos.filter((t) => t.completed).length;
233
+ context.writer.writeln(
234
+ context.writer.wrapInColor(
235
+ `Todos (${doneCount}/${this.todos.length} done)`,
236
+ cliCore.CliForegroundColor.Cyan
237
+ )
238
+ );
239
+ if (filtered.length === 0) {
240
+ context.writer.writeln(" No matching tasks.");
241
+ } else {
242
+ filtered.forEach((todo) => {
243
+ context.writer.writeln(
244
+ this.formatTodoLine(todo, context.writer)
245
+ );
246
+ });
247
+ }
248
+ context.process.output(filtered);
249
+ }
250
+ },
251
+ // โ”€โ”€ add โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
252
+ {
253
+ command: "add",
254
+ description: "Add a new task",
255
+ acceptsRawInput: true,
256
+ valueRequired: true,
257
+ parameters: [
258
+ {
259
+ name: "due",
260
+ description: "Due date (today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD)",
261
+ type: "string",
262
+ required: false
263
+ }
264
+ ],
265
+ processCommand: async (command, context) => {
266
+ const text = command.value;
267
+ if (!text) {
268
+ context.writer.writeError("Please provide a task description.");
269
+ return;
270
+ }
271
+ let dueDate;
272
+ const dueArg = command.args["due"];
273
+ if (dueArg) {
274
+ const parsed = parseDueDate(dueArg);
275
+ if (!parsed) {
276
+ context.writer.writeError(
277
+ `Invalid due date: "${dueArg}". Use: today, tomorrow, monday..sunday, next week, next month, or YYYY-MM-DD.`
278
+ );
279
+ return;
280
+ }
281
+ dueDate = parsed;
282
+ }
283
+ const newItem = {
284
+ id: this.nextId++,
285
+ text,
286
+ completed: false,
287
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
288
+ dueDate
289
+ };
290
+ this.todos.push(newItem);
291
+ await this.saveToStorage(context);
292
+ let msg = `Added: "${text}"`;
293
+ if (dueDate) {
294
+ msg += ` (${formatRelativeDate(dueDate)})`;
295
+ }
296
+ context.writer.writeSuccess(msg);
297
+ context.process.output(newItem);
298
+ }
299
+ },
300
+ // โ”€โ”€ edit โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
301
+ {
302
+ command: "edit",
303
+ description: "Edit a task's text or due date",
304
+ acceptsRawInput: true,
305
+ valueRequired: true,
306
+ parameters: [
307
+ {
308
+ name: "due",
309
+ description: 'New due date (or "none" to remove)',
310
+ type: "string",
311
+ required: false
312
+ }
313
+ ],
314
+ processCommand: async (command, context) => {
315
+ const raw = command.value || "";
316
+ const spaceIndex = raw.indexOf(" ");
317
+ const idStr = spaceIndex === -1 ? raw : raw.substring(0, spaceIndex);
318
+ const newText = spaceIndex === -1 ? void 0 : raw.substring(spaceIndex + 1).trim();
319
+ const id = parseInt(idStr, 10);
320
+ if (isNaN(id)) {
321
+ context.writer.writeError("Usage: todo edit <id> <new text> [--due <date>]");
322
+ return;
323
+ }
324
+ const todo = this.todos.find((t) => t.id === id);
325
+ if (!todo) {
326
+ context.writer.writeError(`Task #${id} not found.`);
327
+ return;
328
+ }
329
+ const dueArg = command.args["due"];
330
+ let changed = false;
331
+ if (newText) {
332
+ todo.text = newText;
333
+ changed = true;
334
+ }
335
+ if (dueArg) {
336
+ if (dueArg === "none") {
337
+ todo.dueDate = void 0;
338
+ changed = true;
339
+ } else {
340
+ const parsed = parseDueDate(dueArg);
341
+ if (!parsed) {
342
+ context.writer.writeError(`Invalid due date: "${dueArg}".`);
343
+ return;
344
+ }
345
+ todo.dueDate = parsed;
346
+ changed = true;
347
+ }
348
+ }
349
+ if (!changed) {
350
+ context.writer.writeError("Nothing to update. Provide new text or --due.");
351
+ return;
352
+ }
353
+ await this.saveToStorage(context);
354
+ context.writer.writeSuccess(`Updated task #${id}.`);
355
+ context.process.output(todo);
356
+ }
357
+ },
358
+ // โ”€โ”€ done โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
359
+ {
360
+ command: "done",
361
+ aliases: ["complete"],
362
+ description: "Mark a task as done",
363
+ acceptsRawInput: true,
364
+ valueRequired: true,
365
+ processCommand: async (command, context) => {
366
+ const id = parseInt(command.value || "", 10);
367
+ if (isNaN(id)) {
368
+ context.writer.writeError("Please provide a valid task ID.");
369
+ return;
370
+ }
371
+ const todo = this.todos.find((t) => t.id === id);
372
+ if (!todo) {
373
+ context.writer.writeError(`Task #${id} not found.`);
374
+ return;
375
+ }
376
+ if (todo.completed) {
377
+ context.writer.writeInfo(`Task #${id} is already done.`);
378
+ return;
379
+ }
380
+ todo.completed = true;
381
+ todo.completedAt = (/* @__PURE__ */ new Date()).toISOString();
382
+ await this.saveToStorage(context);
383
+ context.writer.writeSuccess(`Done: "${todo.text}"`);
384
+ context.process.output(todo);
385
+ }
386
+ },
387
+ // โ”€โ”€ toggle โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
388
+ {
389
+ command: "toggle",
390
+ description: "Toggle a task between done and undone",
391
+ acceptsRawInput: true,
392
+ valueRequired: true,
393
+ processCommand: async (command, context) => {
394
+ const id = parseInt(command.value || "", 10);
395
+ if (isNaN(id)) {
396
+ context.writer.writeError("Please provide a valid task ID.");
397
+ return;
398
+ }
399
+ const todo = this.todos.find((t) => t.id === id);
400
+ if (!todo) {
401
+ context.writer.writeError(`Task #${id} not found.`);
402
+ return;
403
+ }
404
+ todo.completed = !todo.completed;
405
+ todo.completedAt = todo.completed ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
406
+ await this.saveToStorage(context);
407
+ const status = todo.completed ? "done" : "reopened";
408
+ context.writer.writeSuccess(`Task #${id} marked as ${status}.`);
409
+ context.process.output(todo);
410
+ }
411
+ },
412
+ // โ”€โ”€ rm โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
413
+ {
414
+ command: "rm",
415
+ aliases: ["remove"],
416
+ description: "Remove a task by ID",
417
+ acceptsRawInput: true,
418
+ parameters: [
419
+ {
420
+ name: "all",
421
+ description: "Remove all tasks",
422
+ type: "boolean",
423
+ defaultValue: false,
424
+ aliases: ["a"],
425
+ required: false
426
+ }
427
+ ],
428
+ processCommand: async (command, context) => {
429
+ if (command.args["all"] || command.args["a"]) {
430
+ if (this.todos.length === 0) {
431
+ context.writer.writeInfo("No tasks to remove.");
432
+ return;
433
+ }
434
+ const confirmed = await context.reader.readConfirm(
435
+ `Remove all ${this.todos.length} tasks?`,
436
+ false
437
+ );
438
+ if (!confirmed) {
439
+ context.writer.writeInfo("Cancelled.");
440
+ return;
441
+ }
442
+ this.todos = [];
443
+ await this.saveToStorage(context);
444
+ context.writer.writeSuccess("Removed all tasks.");
445
+ return;
446
+ }
447
+ const id = parseInt(command.value, 10);
448
+ if (isNaN(id)) {
449
+ context.writer.writeError("Please provide a valid task ID.");
450
+ return;
451
+ }
452
+ const index = this.todos.findIndex((t) => t.id === id);
453
+ if (index === -1) {
454
+ context.writer.writeError(`Task #${id} not found.`);
455
+ return;
456
+ }
457
+ const confirmBeforeDelete = cliCore.getPluginConfigValue(context, "todo", "confirmBeforeDelete", false);
458
+ if (confirmBeforeDelete) {
459
+ const confirmed = await context.reader.readConfirm(
460
+ `Remove task #${id}: "${this.todos[index].text}"?`,
461
+ false
462
+ );
463
+ if (!confirmed) {
464
+ context.writer.writeInfo("Cancelled.");
465
+ return;
466
+ }
467
+ }
468
+ const removed = this.todos.splice(index, 1)[0];
469
+ await this.saveToStorage(context);
470
+ context.writer.writeSuccess(`Removed: "${removed.text}"`);
471
+ }
472
+ }
473
+ ];
474
+ }
475
+ loadFromOldStorage() {
476
+ const data = localStorage.getItem("todo-items");
477
+ if (!data) return [];
478
+ try {
479
+ return JSON.parse(data).map(migrateTodoItem);
480
+ } catch {
481
+ return [];
482
+ }
483
+ }
484
+ async saveToStorage(context) {
485
+ context.state.updateState({ todos: this.todos });
486
+ await context.state.persist();
487
+ localStorage.removeItem("todo-items");
488
+ }
489
+ };
490
+
491
+ // src/lib/completion/cli-todo-id-completion-provider.ts
492
+ var TODO_ID_SUBCOMMANDS = /* @__PURE__ */ new Set(["rm", "done", "complete", "toggle", "edit"]);
493
+ var CliTodoIdCompletionProvider = class {
494
+ constructor(todoProcessor2) {
495
+ this.todoProcessor = todoProcessor2;
496
+ this.priority = 50;
497
+ }
498
+ getCompletions(context) {
499
+ const { tokens, tokenIndex, token } = context;
500
+ if (tokenIndex !== 2 || tokens.length < 2) {
501
+ return [];
502
+ }
503
+ const rootCommand = tokens[0].toLowerCase();
504
+ if (rootCommand !== "todo") {
505
+ return [];
506
+ }
507
+ const subCommand = tokens[1].toLowerCase();
508
+ if (!TODO_ID_SUBCOMMANDS.has(subCommand)) {
509
+ return [];
510
+ }
511
+ const todos = this.todoProcessor.getTodos();
512
+ const lowerPrefix = token.toLowerCase();
513
+ const filtered = subCommand === "done" || subCommand === "complete" ? todos.filter((t) => !t.completed) : todos;
514
+ return filtered.map((t) => String(t.id)).filter((id) => id.startsWith(lowerPrefix)).sort((a, b) => Number(a) - Number(b));
515
+ }
516
+ };
517
+ var todoProcessor = new CliTodoCommandProcessor();
518
+ var todoModule = {
519
+ apiVersion: API_VERSION,
520
+ name: "@qodalis/cli-todo",
521
+ processors: [todoProcessor],
522
+ services: [
523
+ {
524
+ provide: cliCore.ICliCompletionProvider_TOKEN,
525
+ useValue: new CliTodoIdCompletionProvider(todoProcessor),
526
+ multi: true
527
+ }
528
+ ],
529
+ translations: {
530
+ es: { "cli.todo.description": "Gestionar tus tareas desde la terminal" },
531
+ fr: { "cli.todo.description": "G\xE9rer vos t\xE2ches depuis le terminal" },
532
+ de: { "cli.todo.description": "Aufgaben \xFCber das Terminal verwalten" },
533
+ pt: { "cli.todo.description": "Gerenciar suas tarefas pelo terminal" },
534
+ it: { "cli.todo.description": "Gestire le attivit\xE0 dal terminale" },
535
+ ja: { "cli.todo.description": "\u30BF\u30FC\u30DF\u30CA\u30EB\u304B\u3089\u30BF\u30B9\u30AF\u3092\u7BA1\u7406" },
536
+ ko: { "cli.todo.description": "\uD130\uBBF8\uB110\uC5D0\uC11C \uD560 \uC77C \uAD00\uB9AC" },
537
+ zh: { "cli.todo.description": "\u4ECE\u7EC8\u7AEF\u7BA1\u7406\u4F60\u7684\u4EFB\u52A1" },
538
+ ru: { "cli.todo.description": "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0430\u043C\u0438 \u0438\u0437 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430" },
539
+ ro: { "cli.todo.description": "Gestioneaz\u0103 sarcinile tale din terminal" }
540
+ }
541
+ };
542
+
543
+ exports.CliTodoCommandProcessor = CliTodoCommandProcessor;
544
+ exports.CliTodoIdCompletionProvider = CliTodoIdCompletionProvider;
545
+ exports.formatRelativeDate = formatRelativeDate;
546
+ exports.isOverdue = isOverdue;
547
+ exports.lineThroughText = lineThroughText;
548
+ exports.migrateTodoItem = migrateTodoItem;
549
+ exports.parseDueDate = parseDueDate;
550
+ exports.todoModule = todoModule;
551
+ //# sourceMappingURL=public-api.js.map
552
+ //# sourceMappingURL=public-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/plugins/todo/src/lib/utilities/index.ts","../../packages/plugins/todo/src/lib/version.ts","../../packages/plugins/todo/src/lib/processors/cli-todo-command-processor.ts","../../packages/plugins/todo/src/lib/completion/cli-todo-id-completion-provider.ts","../../packages/plugins/todo/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliForegroundColor","CliIcon","getPluginConfigValue","todoProcessor","ICliCompletionProvider_TOKEN"],"mappings":"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","file":"public-api.js","sourcesContent":["export type TodoItem = {\n id: number;\n text: string;\n completed: boolean;\n createdAt: string;\n completedAt?: string;\n dueDate?: string;\n};\n\nconst DAY_NAMES = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction startOfDay(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\nexport function parseDueDate(input: string): string | null {\n const trimmed = input.trim().toLowerCase();\n const now = new Date();\n const today = startOfDay(now);\n\n if (trimmed === 'today') {\n return today.toISOString();\n }\n\n if (trimmed === 'tomorrow') {\n const d = new Date(today);\n d.setDate(d.getDate() + 1);\n return d.toISOString();\n }\n\n if (trimmed === 'yesterday') {\n const d = new Date(today);\n d.setDate(d.getDate() - 1);\n return d.toISOString();\n }\n\n if (trimmed === 'next week') {\n const d = new Date(today);\n d.setDate(d.getDate() + 7);\n return d.toISOString();\n }\n\n if (trimmed === 'next month') {\n const d = new Date(today);\n d.setMonth(d.getMonth() + 1);\n return d.toISOString();\n }\n\n const dayIndex = DAY_NAMES.indexOf(trimmed);\n if (dayIndex !== -1) {\n const d = new Date(today);\n const currentDay = d.getDay();\n let daysUntil = dayIndex - currentDay;\n if (daysUntil <= 0) daysUntil += 7;\n d.setDate(d.getDate() + daysUntil);\n return d.toISOString();\n }\n\n // Try ISO format YYYY-MM-DD\n const isoMatch = trimmed.match(/^\\d{4}-\\d{2}-\\d{2}$/);\n if (isoMatch) {\n const d = new Date(trimmed + 'T00:00:00');\n if (!isNaN(d.getTime())) {\n return startOfDay(d).toISOString();\n }\n }\n\n return null;\n}\n\nexport function formatRelativeDate(isoDate: string): string {\n const target = startOfDay(new Date(isoDate));\n const today = startOfDay(new Date());\n const diffMs = target.getTime() - today.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'due: today';\n if (diffDays === 1) return 'due: tomorrow';\n if (diffDays === -1) return 'overdue: yesterday';\n if (diffDays > 1 && diffDays <= 14) return `due: in ${diffDays} days`;\n if (diffDays < -1) return `overdue: ${Math.abs(diffDays)} days ago`;\n\n // Far future: show month + day\n const d = new Date(isoDate);\n return `due: ${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`;\n}\n\nexport function isOverdue(todo: TodoItem): boolean {\n if (todo.completed || !todo.dueDate) return false;\n const target = startOfDay(new Date(todo.dueDate));\n const today = startOfDay(new Date());\n return target.getTime() < today.getTime();\n}\n\nexport function migrateTodoItem(item: any): TodoItem {\n return {\n id: item.id,\n text: item.text,\n completed: item.completed ?? false,\n createdAt: item.createdAt ?? new Date().toISOString(),\n completedAt: item.completedAt,\n dueDate: item.dueDate,\n };\n}\n\nexport function lineThroughText(text: string): string {\n return text\n .split('')\n .map((char) => char + '\\u0336')\n .join('');\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.10';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliIcon,\n CliProcessCommand,\n CliProcessorMetadata,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliConfigurationOption,\n ICliExecutionContext,\n getPluginConfigValue,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n TodoItem,\n formatRelativeDate,\n isOverdue,\n lineThroughText,\n migrateTodoItem,\n parseDueDate,\n} from '../utilities';\n\nexport class CliTodoCommandProcessor implements ICliCommandProcessor {\n command = 'todo';\n\n description = 'Manage your tasks from the terminal. Add, list, edit, complete, and remove TODO items.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors?: ICliCommandProcessor[] = [];\n\n metadata?: CliProcessorMetadata = {\n icon: '๐Ÿ“',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n configurationOptions?: ICliConfigurationOption[] = [\n {\n key: 'showCompletedFirst',\n label: 'Show Completed First',\n description: 'List completed tasks before pending ones',\n type: 'boolean',\n defaultValue: false,\n },\n {\n key: 'confirmBeforeDelete',\n label: 'Confirm Before Delete',\n description: 'Ask for confirmation before removing tasks',\n type: 'boolean',\n defaultValue: false,\n },\n ];\n\n stateConfiguration?: CliStateConfiguration = {\n initialState: {\n todos: this.loadFromOldStorage() ?? [],\n },\n };\n\n private todos: TodoItem[] = [];\n\n private nextId = 1;\n\n getTodos(): TodoItem[] {\n return this.todos;\n }\n\n constructor() {\n this.registerSubProcessors();\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Commands:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('todo ls', CliForegroundColor.Cyan)} List all tasks`);\n writer.writeln(` ${writer.wrapInColor('todo ls --pending', CliForegroundColor.Cyan)} List pending tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo ls --completed', CliForegroundColor.Cyan)} List completed tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo ls --overdue', CliForegroundColor.Cyan)} List overdue tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo add <text>', CliForegroundColor.Cyan)} Add a new task`);\n writer.writeln(` ${writer.wrapInColor('todo add <text> --due <date>', CliForegroundColor.Cyan)} Add with due date`);\n writer.writeln(` ${writer.wrapInColor('todo edit <id> <new text>', CliForegroundColor.Cyan)} Edit a task`);\n writer.writeln(` ${writer.wrapInColor('todo done <id>', CliForegroundColor.Cyan)} Mark a task as done`);\n writer.writeln(` ${writer.wrapInColor('todo toggle <id>', CliForegroundColor.Cyan)} Toggle done/undone`);\n writer.writeln(` ${writer.wrapInColor('todo rm <id>', CliForegroundColor.Cyan)} Remove a task`);\n writer.writeln(` ${writer.wrapInColor('todo rm --all', CliForegroundColor.Cyan)} Remove all tasks`);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Due date formats:', CliForegroundColor.Yellow));\n writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` todo add Buy groceries --due tomorrow`);\n writer.writeln(` todo ls --pending`);\n writer.writeln(` todo edit 3 Buy organic groceries`);\n writer.writeln(` todo done 1`);\n writer.writeln(` todo toggle 2`);\n }\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n context.state\n .select<TodoItem[]>((x) => x['todos'])\n .subscribe((todos) => {\n this.todos = (todos || []).map(migrateTodoItem);\n this.nextId =\n this.todos.length > 0\n ? Math.max(...this.todos.map((t) => t.id)) + 1\n : 1;\n });\n }\n\n private formatTodoLine(todo: TodoItem, writer: any): string {\n const check = todo.completed\n ? writer.wrapInColor(CliIcon.CheckIcon, CliForegroundColor.Green)\n : ' ';\n\n const text = todo.completed ? lineThroughText(todo.text) : todo.text;\n let suffix = '';\n\n if (todo.completed) {\n suffix = writer.wrapInColor(' done', CliForegroundColor.Green);\n } else if (todo.dueDate) {\n const rel = formatRelativeDate(todo.dueDate);\n const color = isOverdue(todo) ? CliForegroundColor.Red : CliForegroundColor.Yellow;\n suffix = ' ' + writer.wrapInColor(rel, color);\n }\n\n return ` [${check}] #${todo.id} - ${text}${suffix}`;\n }\n\n private registerSubProcessors(): void {\n this.processors = [\n // โ”€โ”€ ls โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'ls',\n aliases: ['list'],\n description: 'List TODO items',\n parameters: [\n {\n name: 'pending',\n description: 'Show only pending tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'completed',\n description: 'Show only completed tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'overdue',\n description: 'Show only overdue tasks',\n type: 'boolean',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (this.todos.length === 0) {\n context.writer.writeWarning('No tasks yet.');\n context.writer.writeln('Use \"todo add <text>\" to create one.');\n context.process.output([]);\n return;\n }\n\n let filtered = [...this.todos];\n const args = command.args;\n\n if (args['pending']) {\n filtered = filtered.filter((t) => !t.completed);\n } else if (args['completed']) {\n filtered = filtered.filter((t) => t.completed);\n } else if (args['overdue']) {\n filtered = filtered.filter((t) => isOverdue(t));\n }\n\n const showCompletedFirst = getPluginConfigValue(context, 'todo', 'showCompletedFirst', false);\n if (showCompletedFirst) {\n filtered.sort((a, b) => (a.completed === b.completed ? 0 : a.completed ? -1 : 1));\n }\n\n const doneCount = this.todos.filter((t) => t.completed).length;\n context.writer.writeln(\n context.writer.wrapInColor(\n `Todos (${doneCount}/${this.todos.length} done)`,\n CliForegroundColor.Cyan,\n ),\n );\n\n if (filtered.length === 0) {\n context.writer.writeln(' No matching tasks.');\n } else {\n filtered.forEach((todo) => {\n context.writer.writeln(\n this.formatTodoLine(todo, context.writer),\n );\n });\n }\n\n context.process.output(filtered);\n },\n },\n\n // โ”€โ”€ add โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'add',\n description: 'Add a new task',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'Due date (today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const text = command.value;\n if (!text) {\n context.writer.writeError('Please provide a task description.');\n return;\n }\n\n let dueDate: string | undefined;\n const dueArg = command.args['due'];\n if (dueArg) {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(\n `Invalid due date: \"${dueArg}\". Use: today, tomorrow, monday..sunday, next week, next month, or YYYY-MM-DD.`,\n );\n return;\n }\n dueDate = parsed;\n }\n\n const newItem: TodoItem = {\n id: this.nextId++,\n text,\n completed: false,\n createdAt: new Date().toISOString(),\n dueDate,\n };\n\n this.todos.push(newItem);\n await this.saveToStorage(context);\n\n let msg = `Added: \"${text}\"`;\n if (dueDate) {\n msg += ` (${formatRelativeDate(dueDate)})`;\n }\n context.writer.writeSuccess(msg);\n context.process.output(newItem);\n },\n },\n\n // โ”€โ”€ edit โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'edit',\n description: 'Edit a task\\'s text or due date',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'New due date (or \"none\" to remove)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const raw = command.value || '';\n const spaceIndex = raw.indexOf(' ');\n\n const idStr = spaceIndex === -1 ? raw : raw.substring(0, spaceIndex);\n const newText = spaceIndex === -1 ? undefined : raw.substring(spaceIndex + 1).trim();\n\n const id = parseInt(idStr, 10);\n if (isNaN(id)) {\n context.writer.writeError('Usage: todo edit <id> <new text> [--due <date>]');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const dueArg = command.args['due'];\n let changed = false;\n\n if (newText) {\n todo.text = newText;\n changed = true;\n }\n\n if (dueArg) {\n if (dueArg === 'none') {\n todo.dueDate = undefined;\n changed = true;\n } else {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(`Invalid due date: \"${dueArg}\".`);\n return;\n }\n todo.dueDate = parsed;\n changed = true;\n }\n }\n\n if (!changed) {\n context.writer.writeError('Nothing to update. Provide new text or --due.');\n return;\n }\n\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Updated task #${id}.`);\n context.process.output(todo);\n },\n },\n\n // โ”€โ”€ done โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'done',\n aliases: ['complete'],\n description: 'Mark a task as done',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.value || '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n if (todo.completed) {\n context.writer.writeInfo(`Task #${id} is already done.`);\n return;\n }\n\n todo.completed = true;\n todo.completedAt = new Date().toISOString();\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Done: \"${todo.text}\"`);\n context.process.output(todo);\n },\n },\n\n // โ”€โ”€ toggle โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'toggle',\n description: 'Toggle a task between done and undone',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.value || '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n todo.completed = !todo.completed;\n todo.completedAt = todo.completed ? new Date().toISOString() : undefined;\n await this.saveToStorage(context);\n\n const status = todo.completed ? 'done' : 'reopened';\n context.writer.writeSuccess(`Task #${id} marked as ${status}.`);\n context.process.output(todo);\n },\n },\n\n // โ”€โ”€ rm โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n {\n command: 'rm',\n aliases: ['remove'],\n description: 'Remove a task by ID',\n acceptsRawInput: true,\n parameters: [\n {\n name: 'all',\n description: 'Remove all tasks',\n type: 'boolean',\n defaultValue: false,\n aliases: ['a'],\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (command.args['all'] || command.args['a']) {\n if (this.todos.length === 0) {\n context.writer.writeInfo('No tasks to remove.');\n return;\n }\n\n const confirmed = await context.reader.readConfirm(\n `Remove all ${this.todos.length} tasks?`,\n false,\n );\n\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n\n this.todos = [];\n await this.saveToStorage(context);\n context.writer.writeSuccess('Removed all tasks.');\n return;\n }\n\n const id = parseInt(command.value!, 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const index = this.todos.findIndex((t) => t.id === id);\n if (index === -1) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const confirmBeforeDelete = getPluginConfigValue(context, 'todo', 'confirmBeforeDelete', false);\n if (confirmBeforeDelete) {\n const confirmed = await context.reader.readConfirm(\n `Remove task #${id}: \"${this.todos[index].text}\"?`,\n false,\n );\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n }\n\n const removed = this.todos.splice(index, 1)[0];\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Removed: \"${removed.text}\"`);\n },\n },\n ];\n }\n\n private loadFromOldStorage(): TodoItem[] {\n const data = localStorage.getItem('todo-items');\n if (!data) return [];\n try {\n return (JSON.parse(data) as any[]).map(migrateTodoItem);\n } catch {\n return [];\n }\n }\n\n private async saveToStorage(context: ICliExecutionContext): Promise<void> {\n context.state.updateState({ todos: this.todos });\n await context.state.persist();\n localStorage.removeItem('todo-items');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from '../processors/cli-todo-command-processor';\n\nconst TODO_ID_SUBCOMMANDS = new Set(['rm', 'done', 'complete', 'toggle', 'edit']);\n\nexport class CliTodoIdCompletionProvider\n implements ICliCompletionProvider\n{\n priority = 50;\n\n constructor(\n private readonly todoProcessor: CliTodoCommandProcessor,\n ) {}\n\n getCompletions(context: ICliCompletionContext): string[] {\n const { tokens, tokenIndex, token } = context;\n\n if (tokenIndex !== 2 || tokens.length < 2) {\n return [];\n }\n\n const rootCommand = tokens[0].toLowerCase();\n if (rootCommand !== 'todo') {\n return [];\n }\n\n const subCommand = tokens[1].toLowerCase();\n if (!TODO_ID_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n const todos = this.todoProcessor.getTodos();\n const lowerPrefix = token.toLowerCase();\n\n // For 'done' and 'complete', only show non-completed todos\n const filtered =\n subCommand === 'done' || subCommand === 'complete'\n ? todos.filter((t) => !t.completed)\n : todos;\n\n return filtered\n .map((t) => String(t.id))\n .filter((id) => id.startsWith(lowerPrefix))\n .sort((a, b) => Number(a) - Number(b));\n }\n}\n","/*\n * Public API Surface of todo\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-todo-command-processor';\nexport * from './lib/completion/cli-todo-id-completion-provider';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from './lib/processors/cli-todo-command-processor';\nimport { CliTodoIdCompletionProvider } from './lib/completion/cli-todo-id-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst todoProcessor = new CliTodoCommandProcessor();\n\nexport const todoModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-todo',\n processors: [todoProcessor],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: new CliTodoIdCompletionProvider(todoProcessor),\n multi: true,\n },\n ],\n translations: {\n es: { 'cli.todo.description': 'Gestionar tus tareas desde la terminal' },\n fr: { 'cli.todo.description': 'Gรฉrer vos tรขches depuis le terminal' },\n de: { 'cli.todo.description': 'Aufgaben รผber das Terminal verwalten' },\n pt: { 'cli.todo.description': 'Gerenciar suas tarefas pelo terminal' },\n it: { 'cli.todo.description': 'Gestire le attivitร  dal terminale' },\n ja: { 'cli.todo.description': 'ใ‚ฟใƒผใƒŸใƒŠใƒซใ‹ใ‚‰ใ‚ฟใ‚นใ‚ฏใ‚’็ฎก็†' },\n ko: { 'cli.todo.description': 'ํ„ฐ๋ฏธ๋„์—์„œ ํ•  ์ผ ๊ด€๋ฆฌ' },\n zh: { 'cli.todo.description': 'ไปŽ็ปˆ็ซฏ็ฎก็†ไฝ ็š„ไปปๅŠก' },\n ru: { 'cli.todo.description': 'ะฃะฟั€ะฐะฒะปะตะฝะธะต ะทะฐะดะฐั‡ะฐะผะธ ะธะท ั‚ะตั€ะผะธะฝะฐะปะฐ' },\n ro: { 'cli.todo.description': 'Gestioneazฤƒ sarcinile tale din terminal' },\n },\n};\n"]}