@qodalis/cli-todo 2.0.0-beta.1 → 2.0.0-beta.11
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/package.json +4 -4
- package/public-api.d.mts +2 -1
- package/public-api.d.ts +2 -1
- package/public-api.js +32 -1
- package/public-api.js.map +1 -1
- package/public-api.mjs +33 -2
- package/public-api.mjs.map +1 -1
- package/umd/{cli-entrypoint.global.js → index.global.js} +71 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qodalis/cli-todo",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.11",
|
|
4
4
|
"description": "@qodalis/cli extension for managing TODO tasks with add, list, complete, and remove commands.",
|
|
5
5
|
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"tasks",
|
|
18
18
|
"task-management"
|
|
19
19
|
],
|
|
20
|
-
"umd": "./umd/index.js",
|
|
21
|
-
"unpkg": "./umd/index.js",
|
|
20
|
+
"umd": "./umd/index.global.js",
|
|
21
|
+
"unpkg": "./umd/index.global.js",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@qodalis/cli-core": "2.0.0-beta.
|
|
23
|
+
"@qodalis/cli-core": "2.0.0-beta.11"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"main": "./public-api.js",
|
package/public-api.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _qodalis_cli_core from '@qodalis/cli-core';
|
|
2
|
-
import { ICliCommandProcessor, CliProcessorMetadata, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
2
|
+
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
3
|
|
|
4
4
|
type TodoItem = {
|
|
5
5
|
id: number;
|
|
@@ -22,6 +22,7 @@ declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
|
22
22
|
version: string;
|
|
23
23
|
processors?: ICliCommandProcessor[];
|
|
24
24
|
metadata?: CliProcessorMetadata;
|
|
25
|
+
configurationOptions?: ICliConfigurationOption[];
|
|
25
26
|
stateConfiguration?: CliStateConfiguration;
|
|
26
27
|
private todos;
|
|
27
28
|
private nextId;
|
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _qodalis_cli_core from '@qodalis/cli-core';
|
|
2
|
-
import { ICliCommandProcessor, CliProcessorMetadata, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
2
|
+
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
3
|
|
|
4
4
|
type TodoItem = {
|
|
5
5
|
id: number;
|
|
@@ -22,6 +22,7 @@ declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
|
22
22
|
version: string;
|
|
23
23
|
processors?: ICliCommandProcessor[];
|
|
24
24
|
metadata?: CliProcessorMetadata;
|
|
25
|
+
configurationOptions?: ICliConfigurationOption[];
|
|
25
26
|
stateConfiguration?: CliStateConfiguration;
|
|
26
27
|
private todos;
|
|
27
28
|
private nextId;
|
package/public-api.js
CHANGED
|
@@ -89,7 +89,7 @@ function lineThroughText(text) {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// src/lib/version.ts
|
|
92
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
92
|
+
var LIBRARY_VERSION = "2.0.0-beta.11";
|
|
93
93
|
var API_VERSION = 2;
|
|
94
94
|
|
|
95
95
|
// src/lib/processors/cli-todo-command-processor.ts
|
|
@@ -105,6 +105,22 @@ var CliTodoCommandProcessor = class {
|
|
|
105
105
|
requiredCoreVersion: ">=2.0.0 <3.0.0",
|
|
106
106
|
requiredCliVersion: ">=2.0.0 <3.0.0"
|
|
107
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
|
+
];
|
|
108
124
|
this.stateConfiguration = {
|
|
109
125
|
initialState: {
|
|
110
126
|
todos: this.loadFromOldStorage() ?? []
|
|
@@ -209,6 +225,10 @@ var CliTodoCommandProcessor = class {
|
|
|
209
225
|
} else if (args["overdue"]) {
|
|
210
226
|
filtered = filtered.filter((t) => isOverdue(t));
|
|
211
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
|
+
}
|
|
212
232
|
const doneCount = this.todos.filter((t) => t.completed).length;
|
|
213
233
|
context.writer.writeln(
|
|
214
234
|
context.writer.wrapInColor(
|
|
@@ -434,6 +454,17 @@ var CliTodoCommandProcessor = class {
|
|
|
434
454
|
context.writer.writeError(`Task #${id} not found.`);
|
|
435
455
|
return;
|
|
436
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
|
+
}
|
|
437
468
|
const removed = this.todos.splice(index, 1)[0];
|
|
438
469
|
await this.saveToStorage(context);
|
|
439
470
|
context.writer.writeSuccess(`Removed: "${removed.text}"`);
|
package/public-api.js.map
CHANGED
|
@@ -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":["DefaultLibraryAuthor","CliForegroundColor","CliIcon","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.1';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliIcon,\n CliProcessCommand,\n CliProcessorMetadata,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\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 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 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 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":["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.11';\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"]}
|
package/public-api.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultLibraryAuthor, CliForegroundColor, CliIcon, ICliCompletionProvider_TOKEN } from '@qodalis/cli-core';
|
|
1
|
+
import { DefaultLibraryAuthor, CliForegroundColor, CliIcon, getPluginConfigValue, 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.
|
|
90
|
+
var LIBRARY_VERSION = "2.0.0-beta.11";
|
|
91
91
|
var API_VERSION = 2;
|
|
92
92
|
|
|
93
93
|
// src/lib/processors/cli-todo-command-processor.ts
|
|
@@ -103,6 +103,22 @@ var CliTodoCommandProcessor = class {
|
|
|
103
103
|
requiredCoreVersion: ">=2.0.0 <3.0.0",
|
|
104
104
|
requiredCliVersion: ">=2.0.0 <3.0.0"
|
|
105
105
|
};
|
|
106
|
+
this.configurationOptions = [
|
|
107
|
+
{
|
|
108
|
+
key: "showCompletedFirst",
|
|
109
|
+
label: "Show Completed First",
|
|
110
|
+
description: "List completed tasks before pending ones",
|
|
111
|
+
type: "boolean",
|
|
112
|
+
defaultValue: false
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
key: "confirmBeforeDelete",
|
|
116
|
+
label: "Confirm Before Delete",
|
|
117
|
+
description: "Ask for confirmation before removing tasks",
|
|
118
|
+
type: "boolean",
|
|
119
|
+
defaultValue: false
|
|
120
|
+
}
|
|
121
|
+
];
|
|
106
122
|
this.stateConfiguration = {
|
|
107
123
|
initialState: {
|
|
108
124
|
todos: this.loadFromOldStorage() ?? []
|
|
@@ -207,6 +223,10 @@ var CliTodoCommandProcessor = class {
|
|
|
207
223
|
} else if (args["overdue"]) {
|
|
208
224
|
filtered = filtered.filter((t) => isOverdue(t));
|
|
209
225
|
}
|
|
226
|
+
const showCompletedFirst = getPluginConfigValue(context, "todo", "showCompletedFirst", false);
|
|
227
|
+
if (showCompletedFirst) {
|
|
228
|
+
filtered.sort((a, b) => a.completed === b.completed ? 0 : a.completed ? -1 : 1);
|
|
229
|
+
}
|
|
210
230
|
const doneCount = this.todos.filter((t) => t.completed).length;
|
|
211
231
|
context.writer.writeln(
|
|
212
232
|
context.writer.wrapInColor(
|
|
@@ -432,6 +452,17 @@ var CliTodoCommandProcessor = class {
|
|
|
432
452
|
context.writer.writeError(`Task #${id} not found.`);
|
|
433
453
|
return;
|
|
434
454
|
}
|
|
455
|
+
const confirmBeforeDelete = getPluginConfigValue(context, "todo", "confirmBeforeDelete", false);
|
|
456
|
+
if (confirmBeforeDelete) {
|
|
457
|
+
const confirmed = await context.reader.readConfirm(
|
|
458
|
+
`Remove task #${id}: "${this.todos[index].text}"?`,
|
|
459
|
+
false
|
|
460
|
+
);
|
|
461
|
+
if (!confirmed) {
|
|
462
|
+
context.writer.writeInfo("Cancelled.");
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
435
466
|
const removed = this.todos.splice(index, 1)[0];
|
|
436
467
|
await this.saveToStorage(context);
|
|
437
468
|
context.writer.writeSuccess(`Removed: "${removed.text}"`);
|
package/public-api.mjs.map
CHANGED
|
@@ -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.1';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliIcon,\n CliProcessCommand,\n CliProcessorMetadata,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\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 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 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 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.11';\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"]}
|
|
@@ -1902,7 +1902,7 @@ var todo = (() => {
|
|
|
1902
1902
|
CliIcon2["Server"] = "\u{1F5A5}";
|
|
1903
1903
|
CliIcon2["Cloud"] = "\u2601";
|
|
1904
1904
|
CliIcon2["Network"] = "\u{1F310}";
|
|
1905
|
-
CliIcon2["Monitor"] = "\u{
|
|
1905
|
+
CliIcon2["Monitor"] = "\u{1F4FA}";
|
|
1906
1906
|
CliIcon2["Printer"] = "\u{1F5A8}";
|
|
1907
1907
|
CliIcon2["USB"] = "\u{1F50C}";
|
|
1908
1908
|
CliIcon2["Speaker"] = "\u{1F50A}";
|
|
@@ -1912,14 +1912,14 @@ var todo = (() => {
|
|
|
1912
1912
|
CliIcon2["Music"] = "\u{1F3B5}";
|
|
1913
1913
|
CliIcon2["Phone"] = "\u{1F4DE}";
|
|
1914
1914
|
CliIcon2["Package"] = "\u{1F4E6}";
|
|
1915
|
-
CliIcon2["Plugin"] = "\u{
|
|
1916
|
-
CliIcon2["Extension"] = "\u{
|
|
1917
|
-
CliIcon2["Module"] = "\u{
|
|
1915
|
+
CliIcon2["Plugin"] = "\u{1F9E9}";
|
|
1916
|
+
CliIcon2["Extension"] = "\u{1F50C}";
|
|
1917
|
+
CliIcon2["Module"] = "\u{1F9F1}";
|
|
1918
1918
|
CliIcon2["Evaluate"] = "\u{1F50D}";
|
|
1919
|
-
CliIcon2["Variable"] = "\u{
|
|
1919
|
+
CliIcon2["Variable"] = "\u{1D465}";
|
|
1920
1920
|
CliIcon2["Script"] = "\u{1F4DC}";
|
|
1921
|
-
CliIcon2["Code"] = "\u{
|
|
1922
|
-
CliIcon2["Logs"] = "\u{
|
|
1921
|
+
CliIcon2["Code"] = "\u{1F4DD}";
|
|
1922
|
+
CliIcon2["Logs"] = "\u{1F4CB}";
|
|
1923
1923
|
CliIcon2["Power"] = "\u23FB";
|
|
1924
1924
|
CliIcon2["Heart"] = "\u2764";
|
|
1925
1925
|
CliIcon2["Flame"] = "\u{1F525}";
|
|
@@ -1955,10 +1955,37 @@ var todo = (() => {
|
|
|
1955
1955
|
name: "Nicolae Lupei",
|
|
1956
1956
|
email: "nicolae.lupei@qodalis.com"
|
|
1957
1957
|
};
|
|
1958
|
+
var CLI_CONFIGURE_STORE_NAME = "configure";
|
|
1959
|
+
function getConfigValue(state, category, key, defaultValue) {
|
|
1960
|
+
try {
|
|
1961
|
+
const s = state.getState();
|
|
1962
|
+
const bucket = category === "system" ? s?.["system"] : s?.["plugins"]?.[category];
|
|
1963
|
+
if (bucket && key in bucket) {
|
|
1964
|
+
return bucket[key];
|
|
1965
|
+
}
|
|
1966
|
+
} catch {
|
|
1967
|
+
}
|
|
1968
|
+
return defaultValue;
|
|
1969
|
+
}
|
|
1970
|
+
function getPluginConfigValue(context, category, key, defaultValue) {
|
|
1971
|
+
try {
|
|
1972
|
+
const storeManager = context.services.get(
|
|
1973
|
+
"cli-state-store-manager"
|
|
1974
|
+
);
|
|
1975
|
+
if (!storeManager) return defaultValue;
|
|
1976
|
+
const store = storeManager.getStateStore(CLI_CONFIGURE_STORE_NAME);
|
|
1977
|
+
if (!store) return defaultValue;
|
|
1978
|
+
return getConfigValue(store, category, key, defaultValue);
|
|
1979
|
+
} catch {
|
|
1980
|
+
return defaultValue;
|
|
1981
|
+
}
|
|
1982
|
+
}
|
|
1958
1983
|
var semver = __toESM(require_semver2());
|
|
1984
|
+
var API_VERSION = 2;
|
|
1985
|
+
var VERSIONS_ENDPOINT = "/api/qcli/versions";
|
|
1959
1986
|
var ServerVersionNegotiator = class {
|
|
1960
1987
|
static {
|
|
1961
|
-
this.CLIENT_SUPPORTED_VERSIONS = [
|
|
1988
|
+
this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
|
|
1962
1989
|
}
|
|
1963
1990
|
/**
|
|
1964
1991
|
* Given a server's version info, pick the highest mutually compatible version.
|
|
@@ -1977,14 +2004,14 @@ var todo = (() => {
|
|
|
1977
2004
|
*/
|
|
1978
2005
|
static async discover(baseUrl) {
|
|
1979
2006
|
try {
|
|
1980
|
-
const response = await fetch(`${baseUrl}
|
|
2007
|
+
const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
|
|
1981
2008
|
if (!response.ok) return null;
|
|
1982
2009
|
const info = await response.json();
|
|
1983
2010
|
const version = this.negotiate(info);
|
|
1984
2011
|
if (version === null) return null;
|
|
1985
2012
|
return {
|
|
1986
2013
|
apiVersion: version,
|
|
1987
|
-
basePath: `${baseUrl}/api/v${version}/
|
|
2014
|
+
basePath: `${baseUrl}/api/v${version}/qcli`
|
|
1988
2015
|
};
|
|
1989
2016
|
} catch {
|
|
1990
2017
|
return null;
|
|
@@ -2809,8 +2836,8 @@ var todo = (() => {
|
|
|
2809
2836
|
};
|
|
2810
2837
|
|
|
2811
2838
|
// src/lib/version.ts
|
|
2812
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
2813
|
-
var
|
|
2839
|
+
var LIBRARY_VERSION = "2.0.0-beta.11";
|
|
2840
|
+
var API_VERSION2 = 2;
|
|
2814
2841
|
|
|
2815
2842
|
// src/lib/utilities/index.ts
|
|
2816
2843
|
var DAY_NAMES = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
|
|
@@ -2911,6 +2938,22 @@ var todo = (() => {
|
|
|
2911
2938
|
requiredCoreVersion: ">=2.0.0 <3.0.0",
|
|
2912
2939
|
requiredCliVersion: ">=2.0.0 <3.0.0"
|
|
2913
2940
|
};
|
|
2941
|
+
this.configurationOptions = [
|
|
2942
|
+
{
|
|
2943
|
+
key: "showCompletedFirst",
|
|
2944
|
+
label: "Show Completed First",
|
|
2945
|
+
description: "List completed tasks before pending ones",
|
|
2946
|
+
type: "boolean",
|
|
2947
|
+
defaultValue: false
|
|
2948
|
+
},
|
|
2949
|
+
{
|
|
2950
|
+
key: "confirmBeforeDelete",
|
|
2951
|
+
label: "Confirm Before Delete",
|
|
2952
|
+
description: "Ask for confirmation before removing tasks",
|
|
2953
|
+
type: "boolean",
|
|
2954
|
+
defaultValue: false
|
|
2955
|
+
}
|
|
2956
|
+
];
|
|
2914
2957
|
this.stateConfiguration = {
|
|
2915
2958
|
initialState: {
|
|
2916
2959
|
todos: this.loadFromOldStorage() ?? []
|
|
@@ -3015,6 +3058,10 @@ var todo = (() => {
|
|
|
3015
3058
|
} else if (args["overdue"]) {
|
|
3016
3059
|
filtered = filtered.filter((t) => isOverdue(t));
|
|
3017
3060
|
}
|
|
3061
|
+
const showCompletedFirst = getPluginConfigValue(context, "todo", "showCompletedFirst", false);
|
|
3062
|
+
if (showCompletedFirst) {
|
|
3063
|
+
filtered.sort((a, b) => a.completed === b.completed ? 0 : a.completed ? -1 : 1);
|
|
3064
|
+
}
|
|
3018
3065
|
const doneCount = this.todos.filter((t) => t.completed).length;
|
|
3019
3066
|
context.writer.writeln(
|
|
3020
3067
|
context.writer.wrapInColor(
|
|
@@ -3240,6 +3287,17 @@ var todo = (() => {
|
|
|
3240
3287
|
context.writer.writeError(`Task #${id} not found.`);
|
|
3241
3288
|
return;
|
|
3242
3289
|
}
|
|
3290
|
+
const confirmBeforeDelete = getPluginConfigValue(context, "todo", "confirmBeforeDelete", false);
|
|
3291
|
+
if (confirmBeforeDelete) {
|
|
3292
|
+
const confirmed = await context.reader.readConfirm(
|
|
3293
|
+
`Remove task #${id}: "${this.todos[index].text}"?`,
|
|
3294
|
+
false
|
|
3295
|
+
);
|
|
3296
|
+
if (!confirmed) {
|
|
3297
|
+
context.writer.writeInfo("Cancelled.");
|
|
3298
|
+
return;
|
|
3299
|
+
}
|
|
3300
|
+
}
|
|
3243
3301
|
const removed = this.todos.splice(index, 1)[0];
|
|
3244
3302
|
await this.saveToStorage(context);
|
|
3245
3303
|
context.writer.writeSuccess(`Removed: "${removed.text}"`);
|
|
@@ -3293,7 +3351,7 @@ var todo = (() => {
|
|
|
3293
3351
|
// src/cli-entrypoint.ts
|
|
3294
3352
|
var todoProcessor = new CliTodoCommandProcessor();
|
|
3295
3353
|
var module = {
|
|
3296
|
-
apiVersion:
|
|
3354
|
+
apiVersion: API_VERSION2,
|
|
3297
3355
|
name: "@qodalis/cli-todo",
|
|
3298
3356
|
processors: [todoProcessor],
|
|
3299
3357
|
services: [
|