@qodalis/cli-todo 2.0.0-beta.17 → 2.0.0-beta.19

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.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { DefaultLibraryAuthor, CliForegroundColor, CliIcon, getPluginConfigValue, ICliCompletionProvider_TOKEN } from '@qodalis/cli-core';
1
+ import { DefaultLibraryAuthor, CliForegroundColor, CliIcon, getPluginConfigValue, joinShellWords, ICliCompletionProvider_TOKEN } from '@qodalis/cli-core';
2
2
 
3
3
  // src/lib/utilities/index.ts
4
4
  var DAY_NAMES = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
@@ -87,7 +87,7 @@ function lineThroughText(text) {
87
87
  }
88
88
 
89
89
  // src/lib/version.ts
90
- var LIBRARY_VERSION = "2.0.0-beta.17";
90
+ var LIBRARY_VERSION = "2.0.0-beta.19";
91
91
  var API_VERSION = 2;
92
92
 
93
93
  // src/lib/processors/cli-todo-command-processor.ts
@@ -125,7 +125,6 @@ var CliTodoCommandProcessor = class {
125
125
  }
126
126
  };
127
127
  this.todos = [];
128
- this.nextId = 1;
129
128
  this.registerSubProcessors();
130
129
  }
131
130
  getTodos() {
@@ -135,26 +134,26 @@ var CliTodoCommandProcessor = class {
135
134
  context.executor.showHelp(command, context);
136
135
  }
137
136
  writeDescription(context) {
138
- const { writer } = context;
139
- writer.writeln(this.description);
137
+ const { writer, translator: t } = context;
138
+ writer.writeln(t.t("cli.todo.description", this.description));
140
139
  writer.writeln();
141
- writer.writeln(writer.wrapInColor("Commands:", CliForegroundColor.Yellow));
142
- writer.writeln(` ${writer.wrapInColor("todo ls", CliForegroundColor.Cyan)} List all tasks`);
143
- writer.writeln(` ${writer.wrapInColor("todo ls --pending", CliForegroundColor.Cyan)} List pending tasks only`);
144
- writer.writeln(` ${writer.wrapInColor("todo ls --completed", CliForegroundColor.Cyan)} List completed tasks only`);
145
- writer.writeln(` ${writer.wrapInColor("todo ls --overdue", CliForegroundColor.Cyan)} List overdue tasks only`);
146
- writer.writeln(` ${writer.wrapInColor("todo add <text>", CliForegroundColor.Cyan)} Add a new task`);
147
- writer.writeln(` ${writer.wrapInColor("todo add <text> --due <date>", CliForegroundColor.Cyan)} Add with due date`);
148
- writer.writeln(` ${writer.wrapInColor("todo edit <id> <new text>", CliForegroundColor.Cyan)} Edit a task`);
149
- writer.writeln(` ${writer.wrapInColor("todo done <id>", CliForegroundColor.Cyan)} Mark a task as done`);
150
- writer.writeln(` ${writer.wrapInColor("todo toggle <id>", CliForegroundColor.Cyan)} Toggle done/undone`);
151
- writer.writeln(` ${writer.wrapInColor("todo rm <id>", CliForegroundColor.Cyan)} Remove a task`);
152
- writer.writeln(` ${writer.wrapInColor("todo rm --all", CliForegroundColor.Cyan)} Remove all tasks`);
140
+ writer.writeln(writer.wrapInColor(t.t("cli.todo.help.commands", "Commands:"), CliForegroundColor.Yellow));
141
+ writer.writeln(` ${writer.wrapInColor("todo ls", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_all", "List all tasks")}`);
142
+ writer.writeln(` ${writer.wrapInColor("todo ls --pending", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_pending", "List pending tasks only")}`);
143
+ writer.writeln(` ${writer.wrapInColor("todo ls --completed", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_completed", "List completed tasks only")}`);
144
+ writer.writeln(` ${writer.wrapInColor("todo ls --overdue", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_overdue", "List overdue tasks only")}`);
145
+ writer.writeln(` ${writer.wrapInColor("todo add <text>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.add", "Add a new task")}`);
146
+ writer.writeln(` ${writer.wrapInColor("todo add <text> --due <date>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.add_due", "Add with due date")}`);
147
+ writer.writeln(` ${writer.wrapInColor("todo edit <id> <new text>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.edit", "Edit a task")}`);
148
+ writer.writeln(` ${writer.wrapInColor("todo done <id>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.done", "Mark a task as done")}`);
149
+ writer.writeln(` ${writer.wrapInColor("todo toggle <id>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.toggle", "Toggle done/undone")}`);
150
+ writer.writeln(` ${writer.wrapInColor("todo rm <id>", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.remove", "Remove a task")}`);
151
+ writer.writeln(` ${writer.wrapInColor("todo rm --all", CliForegroundColor.Cyan)} ${t.t("cli.todo.help.remove_all", "Remove all tasks")}`);
153
152
  writer.writeln();
154
- writer.writeln(writer.wrapInColor("Due date formats:", CliForegroundColor.Yellow));
153
+ writer.writeln(writer.wrapInColor(t.t("cli.todo.help.due_formats", "Due date formats:"), CliForegroundColor.Yellow));
155
154
  writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);
156
155
  writer.writeln();
157
- writer.writeln(writer.wrapInColor("Examples:", CliForegroundColor.Yellow));
156
+ writer.writeln(writer.wrapInColor(t.t("cli.common.examples", "Examples:"), CliForegroundColor.Yellow));
158
157
  writer.writeln(` todo add Buy groceries --due tomorrow`);
159
158
  writer.writeln(` todo ls --pending`);
160
159
  writer.writeln(` todo edit 3 Buy organic groceries`);
@@ -164,7 +163,6 @@ var CliTodoCommandProcessor = class {
164
163
  async initialize(context) {
165
164
  context.state.select((x) => x["todos"]).subscribe((todos) => {
166
165
  this.todos = (todos || []).map(migrateTodoItem);
167
- this.nextId = this.todos.length > 0 ? Math.max(...this.todos.map((t) => t.id)) + 1 : 1;
168
166
  });
169
167
  }
170
168
  formatTodoLine(todo, writer) {
@@ -261,7 +259,7 @@ var CliTodoCommandProcessor = class {
261
259
  }
262
260
  ],
263
261
  processCommand: async (command, context) => {
264
- const text = command.value;
262
+ const text = joinShellWords(command.value ?? "");
265
263
  if (!text) {
266
264
  context.writer.writeError("Please provide a task description.");
267
265
  return;
@@ -278,15 +276,17 @@ var CliTodoCommandProcessor = class {
278
276
  }
279
277
  dueDate = parsed;
280
278
  }
281
- const newItem = {
282
- id: this.nextId++,
283
- text,
284
- completed: false,
285
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
286
- dueDate
287
- };
288
- this.todos.push(newItem);
289
- await this.saveToStorage(context);
279
+ let newItem;
280
+ await this.changeTodos(context, (todos) => {
281
+ newItem = {
282
+ id: nextIdOf(todos),
283
+ text,
284
+ completed: false,
285
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
286
+ dueDate
287
+ };
288
+ todos.push(newItem);
289
+ });
290
290
  let msg = `Added: "${text}"`;
291
291
  if (dueDate) {
292
292
  msg += ` (${formatRelativeDate(dueDate)})`;
@@ -310,10 +310,8 @@ var CliTodoCommandProcessor = class {
310
310
  }
311
311
  ],
312
312
  processCommand: async (command, context) => {
313
- const raw = command.value || "";
314
- const spaceIndex = raw.indexOf(" ");
315
- const idStr = spaceIndex === -1 ? raw : raw.substring(0, spaceIndex);
316
- const newText = spaceIndex === -1 ? void 0 : raw.substring(spaceIndex + 1).trim();
313
+ const [idStr = "", ...words] = command.positionals ?? [];
314
+ const newText = words.length ? words.join(" ") : void 0;
317
315
  const id = parseInt(idStr, 10);
318
316
  if (isNaN(id)) {
319
317
  context.writer.writeError("Usage: todo edit <id> <new text> [--due <date>]");
@@ -325,32 +323,33 @@ var CliTodoCommandProcessor = class {
325
323
  return;
326
324
  }
327
325
  const dueArg = command.args["due"];
328
- let changed = false;
326
+ const edit = {};
329
327
  if (newText) {
330
- todo.text = newText;
331
- changed = true;
328
+ edit.text = newText;
332
329
  }
333
330
  if (dueArg) {
334
331
  if (dueArg === "none") {
335
- todo.dueDate = void 0;
336
- changed = true;
332
+ edit.dueDate = void 0;
337
333
  } else {
338
334
  const parsed = parseDueDate(dueArg);
339
335
  if (!parsed) {
340
336
  context.writer.writeError(`Invalid due date: "${dueArg}".`);
341
337
  return;
342
338
  }
343
- todo.dueDate = parsed;
344
- changed = true;
339
+ edit.dueDate = parsed;
345
340
  }
346
341
  }
347
- if (!changed) {
342
+ if (Object.keys(edit).length === 0) {
348
343
  context.writer.writeError("Nothing to update. Provide new text or --due.");
349
344
  return;
350
345
  }
351
- await this.saveToStorage(context);
346
+ let updated;
347
+ await this.changeTodos(context, (todos) => {
348
+ const item = todos.find((t) => t.id === id);
349
+ if (item) updated = Object.assign(item, edit);
350
+ });
352
351
  context.writer.writeSuccess(`Updated task #${id}.`);
353
- context.process.output(todo);
352
+ context.process.output(updated ?? { ...todo, ...edit });
354
353
  }
355
354
  },
356
355
  // ── done ────────────────────────────────────────────
@@ -361,7 +360,7 @@ var CliTodoCommandProcessor = class {
361
360
  acceptsRawInput: true,
362
361
  valueRequired: true,
363
362
  processCommand: async (command, context) => {
364
- const id = parseInt(command.value || "", 10);
363
+ const id = parseInt(command.positionals?.[0] ?? "", 10);
365
364
  if (isNaN(id)) {
366
365
  context.writer.writeError("Please provide a valid task ID.");
367
366
  return;
@@ -375,11 +374,16 @@ var CliTodoCommandProcessor = class {
375
374
  context.writer.writeInfo(`Task #${id} is already done.`);
376
375
  return;
377
376
  }
378
- todo.completed = true;
379
- todo.completedAt = (/* @__PURE__ */ new Date()).toISOString();
380
- await this.saveToStorage(context);
377
+ const completedAt = (/* @__PURE__ */ new Date()).toISOString();
378
+ await this.changeTodos(context, (todos) => {
379
+ const item = todos.find((t) => t.id === id);
380
+ if (item) {
381
+ item.completed = true;
382
+ item.completedAt = completedAt;
383
+ }
384
+ });
381
385
  context.writer.writeSuccess(`Done: "${todo.text}"`);
382
- context.process.output(todo);
386
+ context.process.output({ ...todo, completed: true, completedAt });
383
387
  }
384
388
  },
385
389
  // ── toggle ──────────────────────────────────────────
@@ -389,7 +393,7 @@ var CliTodoCommandProcessor = class {
389
393
  acceptsRawInput: true,
390
394
  valueRequired: true,
391
395
  processCommand: async (command, context) => {
392
- const id = parseInt(command.value || "", 10);
396
+ const id = parseInt(command.positionals?.[0] ?? "", 10);
393
397
  if (isNaN(id)) {
394
398
  context.writer.writeError("Please provide a valid task ID.");
395
399
  return;
@@ -399,12 +403,18 @@ var CliTodoCommandProcessor = class {
399
403
  context.writer.writeError(`Task #${id} not found.`);
400
404
  return;
401
405
  }
402
- todo.completed = !todo.completed;
403
- todo.completedAt = todo.completed ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
404
- await this.saveToStorage(context);
405
- const status = todo.completed ? "done" : "reopened";
406
+ const completed = !todo.completed;
407
+ const completedAt = completed ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
408
+ await this.changeTodos(context, (todos) => {
409
+ const item = todos.find((t) => t.id === id);
410
+ if (item) {
411
+ item.completed = completed;
412
+ item.completedAt = completedAt;
413
+ }
414
+ });
415
+ const status = completed ? "done" : "reopened";
406
416
  context.writer.writeSuccess(`Task #${id} marked as ${status}.`);
407
- context.process.output(todo);
417
+ context.process.output({ ...todo, completed, completedAt });
408
418
  }
409
419
  },
410
420
  // ── rm ──────────────────────────────────────────────
@@ -437,12 +447,11 @@ var CliTodoCommandProcessor = class {
437
447
  context.writer.writeInfo("Cancelled.");
438
448
  return;
439
449
  }
440
- this.todos = [];
441
- await this.saveToStorage(context);
450
+ await this.changeTodos(context, () => []);
442
451
  context.writer.writeSuccess("Removed all tasks.");
443
452
  return;
444
453
  }
445
- const id = parseInt(command.value, 10);
454
+ const id = parseInt(command.positionals?.[0] ?? "", 10);
446
455
  if (isNaN(id)) {
447
456
  context.writer.writeError("Please provide a valid task ID.");
448
457
  return;
@@ -463,8 +472,11 @@ var CliTodoCommandProcessor = class {
463
472
  return;
464
473
  }
465
474
  }
466
- const removed = this.todos.splice(index, 1)[0];
467
- await this.saveToStorage(context);
475
+ const removed = this.todos[index];
476
+ await this.changeTodos(
477
+ context,
478
+ (todos) => todos.filter((t) => t.id !== id)
479
+ );
468
480
  context.writer.writeSuccess(`Removed: "${removed.text}"`);
469
481
  }
470
482
  }
@@ -479,12 +491,24 @@ var CliTodoCommandProcessor = class {
479
491
  return [];
480
492
  }
481
493
  }
482
- async saveToStorage(context) {
483
- context.state.updateState({ todos: this.todos });
484
- await context.state.persist();
494
+ /**
495
+ * Change the list and save it, atomically: `change` gets the latest saved
496
+ * list (another tab may have changed it) to edit in place, or returns a
497
+ * new one.
498
+ */
499
+ async changeTodos(context, change) {
500
+ await context.state.update((state) => {
501
+ const todos = (state["todos"] ?? []).map(
502
+ (t) => ({ ...migrateTodoItem(t) })
503
+ );
504
+ return { todos: change(todos) ?? todos };
505
+ });
485
506
  localStorage.removeItem("todo-items");
486
507
  }
487
508
  };
509
+ function nextIdOf(todos) {
510
+ return todos.length > 0 ? Math.max(...todos.map((t) => t.id)) + 1 : 1;
511
+ }
488
512
 
489
513
  // src/lib/completion/cli-todo-id-completion-provider.ts
490
514
  var TODO_ID_SUBCOMMANDS = /* @__PURE__ */ new Set(["rm", "done", "complete", "toggle", "edit"]);
@@ -1 +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":["todoProcessor"],"mappings":"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","file":"public-api.mjs","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.17';\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"]}
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":["todoProcessor"],"mappings":"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","file":"public-api.mjs","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.19';\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 joinShellWords,\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 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, translator: t } = context;\n writer.writeln(t.t('cli.todo.description', this.description!));\n writer.writeln();\n writer.writeln(writer.wrapInColor(t.t('cli.todo.help.commands', 'Commands:'), CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('todo ls', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_all', 'List all tasks')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --pending', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_pending', 'List pending tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --completed', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_completed', 'List completed tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --overdue', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_overdue', 'List overdue tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo add <text>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.add', 'Add a new task')}`);\n writer.writeln(` ${writer.wrapInColor('todo add <text> --due <date>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.add_due', 'Add with due date')}`);\n writer.writeln(` ${writer.wrapInColor('todo edit <id> <new text>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.edit', 'Edit a task')}`);\n writer.writeln(` ${writer.wrapInColor('todo done <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.done', 'Mark a task as done')}`);\n writer.writeln(` ${writer.wrapInColor('todo toggle <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.toggle', 'Toggle done/undone')}`);\n writer.writeln(` ${writer.wrapInColor('todo rm <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.remove', 'Remove a task')}`);\n writer.writeln(` ${writer.wrapInColor('todo rm --all', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.remove_all', 'Remove all tasks')}`);\n writer.writeln();\n writer.writeln(writer.wrapInColor(t.t('cli.todo.help.due_formats', '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(t.t('cli.common.examples', '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 });\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 = joinShellWords(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 // The id comes from the latest saved list: two tabs\n // adding at once never get the same id\n let newItem!: TodoItem;\n await this.changeTodos(context, (todos) => {\n newItem = {\n id: nextIdOf(todos),\n text,\n completed: false,\n createdAt: new Date().toISOString(),\n dueDate,\n };\n todos.push(newItem);\n });\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 [idStr = '', ...words] = command.positionals ?? [];\n const newText = words.length ? words.join(' ') : undefined;\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 const edit: Partial<TodoItem> = {};\n\n if (newText) {\n edit.text = newText;\n }\n\n if (dueArg) {\n if (dueArg === 'none') {\n edit.dueDate = undefined;\n } else {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(`Invalid due date: \"${dueArg}\".`);\n return;\n }\n edit.dueDate = parsed;\n }\n }\n\n if (Object.keys(edit).length === 0) {\n context.writer.writeError('Nothing to update. Provide new text or --due.');\n return;\n }\n\n let updated: TodoItem | undefined;\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) updated = Object.assign(item, edit);\n });\n context.writer.writeSuccess(`Updated task #${id}.`);\n context.process.output(updated ?? { ...todo, ...edit });\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.positionals?.[0] ?? '', 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 const completedAt = new Date().toISOString();\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) {\n item.completed = true;\n item.completedAt = completedAt;\n }\n });\n context.writer.writeSuccess(`Done: \"${todo.text}\"`);\n context.process.output({ ...todo, completed: true, completedAt });\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.positionals?.[0] ?? '', 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 const completed = !todo.completed;\n const completedAt = completed ? new Date().toISOString() : undefined;\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) {\n item.completed = completed;\n item.completedAt = completedAt;\n }\n });\n\n const status = completed ? 'done' : 'reopened';\n context.writer.writeSuccess(`Task #${id} marked as ${status}.`);\n context.process.output({ ...todo, completed, completedAt });\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 await this.changeTodos(context, () => []);\n context.writer.writeSuccess('Removed all tasks.');\n return;\n }\n\n const id = parseInt(command.positionals?.[0] ?? '', 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[index];\n await this.changeTodos(context, (todos) =>\n todos.filter((t) => t.id !== id),\n );\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 /**\n * Change the list and save it, atomically: `change` gets the latest saved\n * list (another tab may have changed it) to edit in place, or returns a\n * new one.\n */\n private async changeTodos(\n context: ICliExecutionContext,\n change: (todos: TodoItem[]) => TodoItem[] | void,\n ): Promise<void> {\n await context.state.update((state) => {\n const todos = ((state['todos'] as TodoItem[] | undefined) ?? []).map(\n (t) => ({ ...migrateTodoItem(t) }),\n );\n return { todos: change(todos) ?? todos };\n });\n localStorage.removeItem('todo-items');\n }\n}\n\n/** The id for a new task: one more than the highest. */\nfunction nextIdOf(todos: TodoItem[]): number {\n return todos.length > 0 ? Math.max(...todos.map((t) => t.id)) + 1 : 1;\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"]}