@todu/cli 0.1.0

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.
Files changed (45) hide show
  1. package/dist/commands/config.d.ts +3 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +61 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/habit.d.ts +4 -0
  6. package/dist/commands/habit.d.ts.map +1 -0
  7. package/dist/commands/habit.js +457 -0
  8. package/dist/commands/habit.js.map +1 -0
  9. package/dist/commands/label.d.ts +4 -0
  10. package/dist/commands/label.d.ts.map +1 -0
  11. package/dist/commands/label.js +156 -0
  12. package/dist/commands/label.js.map +1 -0
  13. package/dist/commands/note.d.ts +4 -0
  14. package/dist/commands/note.d.ts.map +1 -0
  15. package/dist/commands/note.js +190 -0
  16. package/dist/commands/note.js.map +1 -0
  17. package/dist/commands/project.d.ts +4 -0
  18. package/dist/commands/project.d.ts.map +1 -0
  19. package/dist/commands/project.js +220 -0
  20. package/dist/commands/project.js.map +1 -0
  21. package/dist/commands/recurring.d.ts +4 -0
  22. package/dist/commands/recurring.d.ts.map +1 -0
  23. package/dist/commands/recurring.js +449 -0
  24. package/dist/commands/recurring.js.map +1 -0
  25. package/dist/commands/sync.d.ts +4 -0
  26. package/dist/commands/sync.d.ts.map +1 -0
  27. package/dist/commands/sync.js +30 -0
  28. package/dist/commands/sync.js.map +1 -0
  29. package/dist/commands/task.d.ts +4 -0
  30. package/dist/commands/task.d.ts.map +1 -0
  31. package/dist/commands/task.js +387 -0
  32. package/dist/commands/task.js.map +1 -0
  33. package/dist/config.d.ts +13 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +28 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/format.d.ts +27 -0
  38. package/dist/format.d.ts.map +1 -0
  39. package/dist/format.js +97 -0
  40. package/dist/format.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +49 -0
  44. package/dist/index.js.map +1 -0
  45. package/package.json +42 -0
@@ -0,0 +1,387 @@
1
+ import { createProjectId, createTaskId, isTaskPriority, isTaskSortField, isTaskStatus, } from "@todu/core";
2
+ import { colorPriority, colorStatus, formatError, formatJSON, formatTable } from "../format.js";
3
+ const TASK_COLUMNS = [
4
+ { key: "id", label: "ID" },
5
+ { key: "title", label: "Title" },
6
+ { key: "status", label: "Status", colorize: colorStatus },
7
+ { key: "priority", label: "Priority", colorize: colorPriority },
8
+ { key: "project", label: "Project" },
9
+ ];
10
+ function taskToRow(t, projectName) {
11
+ return {
12
+ id: t.id,
13
+ title: t.title,
14
+ status: t.status,
15
+ priority: t.priority,
16
+ project: projectName ?? t.projectId,
17
+ };
18
+ }
19
+ function taskDetail(t, projectName) {
20
+ const lines = [
21
+ `ID: ${t.id}`,
22
+ `Title: ${t.title}`,
23
+ `Status: ${t.status}`,
24
+ `Priority: ${t.priority}`,
25
+ `Project: ${projectName ?? t.projectId}`,
26
+ `Labels: ${t.labels.length > 0 ? t.labels.join(", ") : "(none)"}`,
27
+ `Created: ${t.createdAt}`,
28
+ `Updated: ${t.updatedAt}`,
29
+ ];
30
+ if (t.dueDate)
31
+ lines.push(`Due: ${t.dueDate}`);
32
+ if (t.scheduledDate)
33
+ lines.push(`Scheduled: ${t.scheduledDate}`);
34
+ if (t.description) {
35
+ lines.push("", "Description:", t.description);
36
+ }
37
+ return lines.join("\n");
38
+ }
39
+ /**
40
+ * Resolve a project reference to a ProjectId.
41
+ * Try as ID first, then search by name.
42
+ */
43
+ async function resolveProjectId(todu, ref) {
44
+ // Try as ID
45
+ const byId = await todu.project.get(createProjectId(ref));
46
+ if (byId.ok)
47
+ return { ok: true, id: byId.value.id, name: byId.value.name };
48
+ // Try name search
49
+ const list = await todu.project.list();
50
+ if (!list.ok)
51
+ return { ok: false, message: formatError(list.error) };
52
+ const matches = list.value.filter((p) => p.name.toLowerCase() === ref.toLowerCase());
53
+ if (matches.length === 1)
54
+ return { ok: true, id: matches[0].id, name: matches[0].name };
55
+ if (matches.length > 1) {
56
+ return { ok: false, message: `Multiple projects match "${ref}". Use the project ID instead.` };
57
+ }
58
+ return { ok: false, message: `Project not found: ${ref}` };
59
+ }
60
+ /**
61
+ * Build a map of projectId → projectName for display.
62
+ */
63
+ async function buildProjectNameMap(todu) {
64
+ const result = await todu.project.list();
65
+ if (!result.ok)
66
+ return {};
67
+ const map = {};
68
+ for (const p of result.value) {
69
+ map[p.id] = p.name;
70
+ }
71
+ return map;
72
+ }
73
+ export function registerTaskCommands(program, getTodu) {
74
+ const task = program.command("task").description("Manage tasks");
75
+ // create
76
+ task
77
+ .command("create")
78
+ .description("Create a new task")
79
+ .requiredOption("--title <title>", "task title")
80
+ .requiredOption("--project <project>", "project (ID or name)")
81
+ .option("--priority <priority>", "priority (low, medium, high)", "medium")
82
+ .option("--description <desc>", "task description")
83
+ .option("--label <labels...>", "labels")
84
+ .option("--due <date>", "due date (ISO format)")
85
+ .option("--scheduled <date>", "scheduled date (ISO format)")
86
+ .action(async (opts) => {
87
+ const todu = await getTodu();
88
+ try {
89
+ const project = await resolveProjectId(todu, opts.project);
90
+ if (!project.ok) {
91
+ console.error(project.message);
92
+ process.exitCode = 1;
93
+ return;
94
+ }
95
+ const result = await todu.task.create({
96
+ title: opts.title,
97
+ projectId: project.id,
98
+ priority: opts.priority,
99
+ description: opts.description,
100
+ labels: opts.label,
101
+ dueDate: opts.due,
102
+ scheduledDate: opts.scheduled,
103
+ });
104
+ if (!result.ok) {
105
+ console.error(formatError(result.error));
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ const format = program.opts().format;
110
+ if (format === "json") {
111
+ console.log(formatJSON(result.value));
112
+ }
113
+ else {
114
+ console.log("Task created:");
115
+ console.log(taskDetail(result.value, project.name));
116
+ }
117
+ }
118
+ finally {
119
+ await todu.close();
120
+ }
121
+ });
122
+ // list
123
+ task
124
+ .command("list")
125
+ .description("List tasks")
126
+ .option("--project <project>", "filter by project (ID or name)")
127
+ .option("--status <statuses>", "filter by status (comma-separated)")
128
+ .option("--priority <priority>", "filter by priority")
129
+ .option("--label <label>", "filter by label")
130
+ .option("--overdue", "show overdue tasks only")
131
+ .option("--today", "show tasks due or scheduled today")
132
+ .option("--sort <field>", "sort by field (priority, dueDate, createdAt, updatedAt, title)")
133
+ .option("--asc", "sort ascending (default: descending)")
134
+ .action(async (opts) => {
135
+ const todu = await getTodu();
136
+ try {
137
+ let projectId;
138
+ if (opts.project) {
139
+ const project = await resolveProjectId(todu, opts.project);
140
+ if (!project.ok) {
141
+ console.error(project.message);
142
+ process.exitCode = 1;
143
+ return;
144
+ }
145
+ projectId = project.id;
146
+ }
147
+ // Parse multi-status: --status active,inprogress
148
+ let status;
149
+ if (opts.status) {
150
+ const parts = opts.status.split(",").map((s) => s.trim());
151
+ for (const s of parts) {
152
+ if (!isTaskStatus(s)) {
153
+ console.error(`Error: invalid status: ${s}`);
154
+ process.exitCode = 1;
155
+ return;
156
+ }
157
+ }
158
+ status = parts.length === 1 ? parts[0] : parts;
159
+ }
160
+ if (opts.priority && !isTaskPriority(opts.priority)) {
161
+ console.error(`Error: invalid priority: ${opts.priority}`);
162
+ process.exitCode = 1;
163
+ return;
164
+ }
165
+ // Parse sort
166
+ let sort;
167
+ if (opts.sort) {
168
+ if (!isTaskSortField(opts.sort)) {
169
+ console.error(`Error: invalid sort field: ${opts.sort}`);
170
+ process.exitCode = 1;
171
+ return;
172
+ }
173
+ sort = { field: opts.sort, direction: opts.asc ? "asc" : "desc" };
174
+ }
175
+ const result = await todu.task.list({
176
+ projectId,
177
+ status,
178
+ priority: opts.priority,
179
+ label: opts.label,
180
+ overdue: opts.overdue,
181
+ today: opts.today,
182
+ }, sort);
183
+ if (!result.ok) {
184
+ console.error(formatError(result.error));
185
+ process.exitCode = 1;
186
+ return;
187
+ }
188
+ const format = program.opts().format;
189
+ if (format === "json") {
190
+ console.log(formatJSON(result.value));
191
+ }
192
+ else {
193
+ const nameMap = await buildProjectNameMap(todu);
194
+ const rows = result.value.map((t) => taskToRow(t, nameMap[t.projectId]));
195
+ console.log(formatTable(rows, TASK_COLUMNS));
196
+ }
197
+ }
198
+ finally {
199
+ await todu.close();
200
+ }
201
+ });
202
+ // show
203
+ task
204
+ .command("show <id>")
205
+ .description("Show task details")
206
+ .action(async (id) => {
207
+ const todu = await getTodu();
208
+ try {
209
+ const result = await todu.task.get(createTaskId(id));
210
+ if (!result.ok) {
211
+ console.error(formatError(result.error));
212
+ process.exitCode = 1;
213
+ return;
214
+ }
215
+ const nameMap = await buildProjectNameMap(todu);
216
+ const format = program.opts().format;
217
+ if (format === "json") {
218
+ console.log(formatJSON(result.value));
219
+ }
220
+ else {
221
+ console.log(taskDetail(result.value, nameMap[result.value.projectId]));
222
+ }
223
+ }
224
+ finally {
225
+ await todu.close();
226
+ }
227
+ });
228
+ // update
229
+ task
230
+ .command("update <id>")
231
+ .description("Update a task")
232
+ .option("--title <title>", "new title")
233
+ .option("--status <status>", "new status")
234
+ .option("--priority <priority>", "new priority")
235
+ .option("--description <desc>", "new description")
236
+ .option("--label <labels...>", "replace labels")
237
+ .option("--due <date>", "new due date")
238
+ .option("--scheduled <date>", "new scheduled date")
239
+ .action(async (id, opts) => {
240
+ const todu = await getTodu();
241
+ try {
242
+ const result = await todu.task.update(createTaskId(id), {
243
+ title: opts.title,
244
+ status: opts.status,
245
+ priority: opts.priority,
246
+ description: opts.description,
247
+ labels: opts.label,
248
+ dueDate: opts.due,
249
+ scheduledDate: opts.scheduled,
250
+ });
251
+ if (!result.ok) {
252
+ console.error(formatError(result.error));
253
+ process.exitCode = 1;
254
+ return;
255
+ }
256
+ const nameMap = await buildProjectNameMap(todu);
257
+ const format = program.opts().format;
258
+ if (format === "json") {
259
+ console.log(formatJSON(result.value));
260
+ }
261
+ else {
262
+ console.log("Task updated:");
263
+ console.log(taskDetail(result.value, nameMap[result.value.projectId]));
264
+ }
265
+ }
266
+ finally {
267
+ await todu.close();
268
+ }
269
+ });
270
+ // delete
271
+ task
272
+ .command("delete <id>")
273
+ .description("Delete a task")
274
+ .action(async (id) => {
275
+ const todu = await getTodu();
276
+ try {
277
+ const result = await todu.task.delete(createTaskId(id));
278
+ if (!result.ok) {
279
+ console.error(formatError(result.error));
280
+ process.exitCode = 1;
281
+ return;
282
+ }
283
+ const format = program.opts().format;
284
+ if (format === "json") {
285
+ console.log(formatJSON({ deleted: id }));
286
+ }
287
+ else {
288
+ console.log(`Deleted task: ${id}`);
289
+ }
290
+ }
291
+ finally {
292
+ await todu.close();
293
+ }
294
+ });
295
+ // move
296
+ task
297
+ .command("move <id> <project>")
298
+ .description("Move a task to another project")
299
+ .action(async (id, projectRef) => {
300
+ const todu = await getTodu();
301
+ try {
302
+ const project = await resolveProjectId(todu, projectRef);
303
+ if (!project.ok) {
304
+ console.error(project.message);
305
+ process.exitCode = 1;
306
+ return;
307
+ }
308
+ const result = await todu.task.move(createTaskId(id), project.id);
309
+ if (!result.ok) {
310
+ console.error(formatError(result.error));
311
+ process.exitCode = 1;
312
+ return;
313
+ }
314
+ const format = program.opts().format;
315
+ if (format === "json") {
316
+ console.log(formatJSON(result.value));
317
+ }
318
+ else {
319
+ console.log(`Moved task to ${project.name}:`);
320
+ console.log(taskDetail(result.value, project.name));
321
+ }
322
+ }
323
+ finally {
324
+ await todu.close();
325
+ }
326
+ });
327
+ // search
328
+ task
329
+ .command("search <query>")
330
+ .description("Search tasks by title")
331
+ .action(async (query) => {
332
+ const todu = await getTodu();
333
+ try {
334
+ const result = await todu.task.search(query);
335
+ if (!result.ok) {
336
+ console.error(formatError(result.error));
337
+ process.exitCode = 1;
338
+ return;
339
+ }
340
+ const format = program.opts().format;
341
+ if (format === "json") {
342
+ console.log(formatJSON(result.value));
343
+ }
344
+ else {
345
+ const nameMap = await buildProjectNameMap(todu);
346
+ const rows = result.value.map((t) => taskToRow(t, nameMap[t.projectId]));
347
+ console.log(formatTable(rows, TASK_COLUMNS));
348
+ }
349
+ }
350
+ finally {
351
+ await todu.close();
352
+ }
353
+ });
354
+ // Status shortcut helper
355
+ function statusShortcut(name, description, targetStatus) {
356
+ task
357
+ .command(`${name} <id>`)
358
+ .description(description)
359
+ .action(async (id) => {
360
+ const todu = await getTodu();
361
+ try {
362
+ const result = await todu.task.update(createTaskId(id), { status: targetStatus });
363
+ if (!result.ok) {
364
+ console.error(formatError(result.error));
365
+ process.exitCode = 1;
366
+ return;
367
+ }
368
+ const nameMap = await buildProjectNameMap(todu);
369
+ const format = program.opts().format;
370
+ if (format === "json") {
371
+ console.log(formatJSON(result.value));
372
+ }
373
+ else {
374
+ console.log(`Task ${targetStatus}:`);
375
+ console.log(taskDetail(result.value, nameMap[result.value.projectId]));
376
+ }
377
+ }
378
+ finally {
379
+ await todu.close();
380
+ }
381
+ });
382
+ }
383
+ statusShortcut("start", "Start a task (set status to inprogress)", "inprogress");
384
+ statusShortcut("done", "Complete a task (set status to done)", "done");
385
+ statusShortcut("cancel", "Cancel a task (set status to canceled)", "canceled");
386
+ }
387
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ToduFileConfig } from "@todu/core";
2
+ export type { ToduFileConfig as ToduConfig } from "@todu/core";
3
+ export { resolveConfigPath as getConfigPath, resolveConfigSources, resolveDataDir, } from "@todu/core";
4
+ /**
5
+ * Load config from YAML file. Returns empty config if file doesn't exist.
6
+ * Throws on malformed YAML so users know their config is broken.
7
+ */
8
+ export declare function loadConfig(configPath: string): ToduFileConfig;
9
+ /**
10
+ * Save config to YAML file. Creates directory if needed.
11
+ */
12
+ export declare function saveConfig(config: ToduFileConfig, configPath: string): void;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWjD,YAAY,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,iBAAiB,IAAI,aAAa,EAClC,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAS7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAI3E"}
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { parse, stringify } from "yaml";
4
+ export { resolveConfigPath as getConfigPath, resolveConfigSources, resolveDataDir, } from "@todu/core";
5
+ /**
6
+ * Load config from YAML file. Returns empty config if file doesn't exist.
7
+ * Throws on malformed YAML so users know their config is broken.
8
+ */
9
+ export function loadConfig(configPath) {
10
+ let content;
11
+ try {
12
+ content = fs.readFileSync(configPath, "utf-8");
13
+ }
14
+ catch {
15
+ return {}; // File not found — that's fine
16
+ }
17
+ // Let YAML parse errors surface
18
+ return parse(content) ?? {};
19
+ }
20
+ /**
21
+ * Save config to YAML file. Creates directory if needed.
22
+ */
23
+ export function saveConfig(config, configPath) {
24
+ const dir = path.dirname(configPath);
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ fs.writeFileSync(configPath, stringify(config), "utf-8");
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAWxC,OAAO,EACL,iBAAiB,IAAI,aAAa,EAClC,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAkB;IAC7D,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,iCAA+B;IAC5C,CAAC;IACD,gCAAgC;IAChC,OAAQ,KAAK,CAAC,OAAO,CAAoB,IAAI,EAAE,CAAC;AAAA,CACjD;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAsB,EAAE,UAAkB,EAAQ;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AAAA,CAC1D"}
@@ -0,0 +1,27 @@
1
+ import type { ToduError } from "@todu/core";
2
+ export declare function setColorEnabled(enabled: boolean): void;
3
+ export declare function isColorEnabled(): boolean;
4
+ /** Colorize a priority value */
5
+ export declare function colorPriority(priority: string): string;
6
+ /** Colorize a status value */
7
+ export declare function colorStatus(status: string): string;
8
+ /**
9
+ * Format data as a table for terminal output.
10
+ * Columns auto-size to content width.
11
+ * Optional colorizers transform cell values for display while keeping
12
+ * width calculations based on the raw value.
13
+ */
14
+ export declare function formatTable(rows: Record<string, string>[], columns: {
15
+ key: string;
16
+ label: string;
17
+ colorize?: (value: string) => string;
18
+ }[]): string;
19
+ /**
20
+ * Format data as JSON.
21
+ */
22
+ export declare function formatJSON(data: unknown): string;
23
+ /**
24
+ * Format a ToduError for display.
25
+ */
26
+ export declare function formatError(error: ToduError): string;
27
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAU5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAOD,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAalD;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC9B,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,EAAE,GAC9E,MAAM,CA6BR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CASpD"}
package/dist/format.js ADDED
@@ -0,0 +1,97 @@
1
+ import pc from "picocolors";
2
+ // ============================================================================
3
+ // Color support
4
+ // ============================================================================
5
+ /** Whether color output is enabled (TTY + not explicitly disabled) */
6
+ let colorEnabled = process.stdout.isTTY === true && !process.env.NO_COLOR;
7
+ export function setColorEnabled(enabled) {
8
+ colorEnabled = enabled;
9
+ }
10
+ export function isColorEnabled() {
11
+ return colorEnabled;
12
+ }
13
+ /** Apply color only when enabled */
14
+ function color(fn, text) {
15
+ return colorEnabled ? fn(text) : text;
16
+ }
17
+ /** Colorize a priority value */
18
+ export function colorPriority(priority) {
19
+ switch (priority) {
20
+ case "high":
21
+ return color(pc.red, priority);
22
+ case "medium":
23
+ return color(pc.yellow, priority);
24
+ case "low":
25
+ return color(pc.green, priority);
26
+ default:
27
+ return priority;
28
+ }
29
+ }
30
+ /** Colorize a status value */
31
+ export function colorStatus(status) {
32
+ switch (status) {
33
+ case "done":
34
+ return color(pc.green, status);
35
+ case "canceled":
36
+ return color(pc.dim, status);
37
+ case "inprogress":
38
+ return color(pc.cyan, status);
39
+ case "waiting":
40
+ return color(pc.yellow, status);
41
+ default:
42
+ return status;
43
+ }
44
+ }
45
+ // ============================================================================
46
+ // Output formatting
47
+ // ============================================================================
48
+ /**
49
+ * Format data as a table for terminal output.
50
+ * Columns auto-size to content width.
51
+ * Optional colorizers transform cell values for display while keeping
52
+ * width calculations based on the raw value.
53
+ */
54
+ export function formatTable(rows, columns) {
55
+ if (rows.length === 0) {
56
+ return "No results.";
57
+ }
58
+ // Calculate column widths based on raw (uncolored) values
59
+ const widths = columns.map((col) => {
60
+ const values = rows.map((row) => (row[col.key] ?? "").length);
61
+ return Math.max(col.label.length, ...values);
62
+ });
63
+ // Header
64
+ const header = columns.map((col, i) => color(pc.bold, col.label.padEnd(widths[i]))).join(" ");
65
+ const separator = color(pc.dim, widths.map((w) => "─".repeat(w)).join("──"));
66
+ // Rows
67
+ const body = rows
68
+ .map((row) => columns
69
+ .map((col, i) => {
70
+ const raw = row[col.key] ?? "";
71
+ const padded = raw.padEnd(widths[i]);
72
+ return col.colorize ? col.colorize(raw) + " ".repeat(widths[i] - raw.length) : padded;
73
+ })
74
+ .join(" "))
75
+ .join("\n");
76
+ return `${header}\n${separator}\n${body}`;
77
+ }
78
+ /**
79
+ * Format data as JSON.
80
+ */
81
+ export function formatJSON(data) {
82
+ return JSON.stringify(data, null, 2);
83
+ }
84
+ /**
85
+ * Format a ToduError for display.
86
+ */
87
+ export function formatError(error) {
88
+ switch (error.type) {
89
+ case "not-found":
90
+ return `Error: ${error.entity} not found: ${error.id}`;
91
+ case "validation":
92
+ return `Error: ${error.field}: ${error.message}`;
93
+ case "storage":
94
+ return `Error: ${error.message}`;
95
+ }
96
+ }
97
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ import { createTodu, isSyncServerAvailable } from "@todu/engine";
3
+ import { Command } from "commander";
4
+ import { registerConfigCommands } from "./commands/config.js";
5
+ import { registerHabitCommands } from "./commands/habit.js";
6
+ import { registerLabelCommands } from "./commands/label.js";
7
+ import { registerNoteCommands } from "./commands/note.js";
8
+ import { registerProjectCommands } from "./commands/project.js";
9
+ import { registerRecurringCommands } from "./commands/recurring.js";
10
+ import { registerSyncCommands } from "./commands/sync.js";
11
+ import { registerTaskCommands } from "./commands/task.js";
12
+ import { getConfigPath, loadConfig, resolveDataDir } from "./config.js";
13
+ import { setColorEnabled } from "./format.js";
14
+ const program = new Command();
15
+ program
16
+ .name("todu")
17
+ .description("Local-first task management")
18
+ .version("0.0.1")
19
+ .option("--format <type>", "output format (text or json)", "text")
20
+ .option("--config <path>", "path to config file")
21
+ .option("--no-color", "disable color output")
22
+ .hook("preAction", () => {
23
+ if (!program.opts().color) {
24
+ setColorEnabled(false);
25
+ }
26
+ });
27
+ // Lazy initialization — resolve config, then create Todu instance.
28
+ // Tries to connect to a running sync server (Electron) first so
29
+ // both share the same Automerge data in real-time.
30
+ const getTodu = async () => {
31
+ const opts = program.opts();
32
+ const configPath = getConfigPath(opts.config);
33
+ const config = loadConfig(configPath);
34
+ const storagePath = resolveDataDir(configPath, config);
35
+ // Skip sync detection when TODU_NO_SYNC is set (used by tests to force standalone mode)
36
+ const syncClient = process.env.TODU_NO_SYNC ? false : await isSyncServerAvailable();
37
+ return createTodu({ storagePath, syncClient });
38
+ };
39
+ // Register command groups
40
+ registerProjectCommands(program, getTodu);
41
+ registerTaskCommands(program, getTodu);
42
+ registerLabelCommands(program, getTodu);
43
+ registerNoteCommands(program, getTodu);
44
+ registerRecurringCommands(program, getTodu);
45
+ registerHabitCommands(program, getTodu);
46
+ registerSyncCommands(program, getTodu);
47
+ registerConfigCommands(program);
48
+ program.parse();
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,6BAA6B,CAAC;KAC1C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,EAAE,MAAM,CAAC;KACjE,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,sBAAsB,CAAC;KAC5C,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QAC1B,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AAAA,CACF,CAAC,CAAC;AAEL,qEAAmE;AACnE,gEAAgE;AAChE,mDAAmD;AACnD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,wFAAwF;IACxF,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC;IACpF,OAAO,UAAU,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAAA,CAChD,CAAC;AAEF,0BAA0B;AAC1B,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,yBAAyB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}