@doist/todoist-cli 1.29.4 → 1.30.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 (246) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__mocks__/chalk.d.ts +3 -0
  3. package/dist/__mocks__/chalk.d.ts.map +1 -0
  4. package/dist/__mocks__/chalk.js +8 -0
  5. package/dist/__mocks__/chalk.js.map +1 -0
  6. package/dist/commands/activity.d.ts +3 -0
  7. package/dist/commands/activity.d.ts.map +1 -0
  8. package/dist/commands/activity.js +267 -0
  9. package/dist/commands/activity.js.map +1 -0
  10. package/dist/commands/add.d.ts +3 -0
  11. package/dist/commands/add.d.ts.map +1 -0
  12. package/dist/commands/add.js +36 -0
  13. package/dist/commands/add.js.map +1 -0
  14. package/dist/commands/attachment.d.ts +3 -0
  15. package/dist/commands/attachment.d.ts.map +1 -0
  16. package/dist/commands/attachment.js +156 -0
  17. package/dist/commands/attachment.js.map +1 -0
  18. package/dist/commands/auth.d.ts +3 -0
  19. package/dist/commands/auth.d.ts.map +1 -0
  20. package/dist/commands/auth.js +124 -0
  21. package/dist/commands/auth.js.map +1 -0
  22. package/dist/commands/changelog.d.ts +8 -0
  23. package/dist/commands/changelog.d.ts.map +1 -0
  24. package/dist/commands/changelog.js +92 -0
  25. package/dist/commands/changelog.js.map +1 -0
  26. package/dist/commands/comment.d.ts +3 -0
  27. package/dist/commands/comment.d.ts.map +1 -0
  28. package/dist/commands/comment.js +301 -0
  29. package/dist/commands/comment.js.map +1 -0
  30. package/dist/commands/completed.d.ts +3 -0
  31. package/dist/commands/completed.d.ts.map +1 -0
  32. package/dist/commands/completed.js +107 -0
  33. package/dist/commands/completed.js.map +1 -0
  34. package/dist/commands/completion.d.ts +3 -0
  35. package/dist/commands/completion.d.ts.map +1 -0
  36. package/dist/commands/completion.js +107 -0
  37. package/dist/commands/completion.js.map +1 -0
  38. package/dist/commands/filter.d.ts +5 -0
  39. package/dist/commands/filter.d.ts.map +1 -0
  40. package/dist/commands/filter.js +287 -0
  41. package/dist/commands/filter.js.map +1 -0
  42. package/dist/commands/inbox.d.ts +3 -0
  43. package/dist/commands/inbox.d.ts.map +1 -0
  44. package/dist/commands/inbox.js +25 -0
  45. package/dist/commands/inbox.js.map +1 -0
  46. package/dist/commands/label.d.ts +5 -0
  47. package/dist/commands/label.d.ts.map +1 -0
  48. package/dist/commands/label.js +328 -0
  49. package/dist/commands/label.js.map +1 -0
  50. package/dist/commands/notification.d.ts +3 -0
  51. package/dist/commands/notification.d.ts.map +1 -0
  52. package/dist/commands/notification.js +274 -0
  53. package/dist/commands/notification.js.map +1 -0
  54. package/dist/commands/project.d.ts +7 -0
  55. package/dist/commands/project.d.ts.map +1 -0
  56. package/dist/commands/project.js +714 -0
  57. package/dist/commands/project.js.map +1 -0
  58. package/dist/commands/reminder.d.ts +3 -0
  59. package/dist/commands/reminder.d.ts.map +1 -0
  60. package/dist/commands/reminder.js +271 -0
  61. package/dist/commands/reminder.js.map +1 -0
  62. package/dist/commands/section.d.ts +3 -0
  63. package/dist/commands/section.d.ts.map +1 -0
  64. package/dist/commands/section.js +216 -0
  65. package/dist/commands/section.js.map +1 -0
  66. package/dist/commands/settings.d.ts +12 -0
  67. package/dist/commands/settings.d.ts.map +1 -0
  68. package/dist/commands/settings.js +312 -0
  69. package/dist/commands/settings.js.map +1 -0
  70. package/dist/commands/skill.d.ts +3 -0
  71. package/dist/commands/skill.d.ts.map +1 -0
  72. package/dist/commands/skill.js +127 -0
  73. package/dist/commands/skill.js.map +1 -0
  74. package/dist/commands/stats.d.ts +3 -0
  75. package/dist/commands/stats.d.ts.map +1 -0
  76. package/dist/commands/stats.js +151 -0
  77. package/dist/commands/stats.js.map +1 -0
  78. package/dist/commands/task.d.ts +5 -0
  79. package/dist/commands/task.d.ts.map +1 -0
  80. package/dist/commands/task.js +559 -0
  81. package/dist/commands/task.js.map +1 -0
  82. package/dist/commands/today.d.ts +18 -0
  83. package/dist/commands/today.d.ts.map +1 -0
  84. package/dist/commands/today.js +108 -0
  85. package/dist/commands/today.js.map +1 -0
  86. package/dist/commands/upcoming.d.ts +17 -0
  87. package/dist/commands/upcoming.d.ts.map +1 -0
  88. package/dist/commands/upcoming.js +129 -0
  89. package/dist/commands/upcoming.js.map +1 -0
  90. package/dist/commands/update.d.ts +6 -0
  91. package/dist/commands/update.d.ts.map +1 -0
  92. package/dist/commands/update.js +90 -0
  93. package/dist/commands/update.js.map +1 -0
  94. package/dist/commands/view.d.ts +3 -0
  95. package/dist/commands/view.d.ts.map +1 -0
  96. package/dist/commands/view.js +79 -0
  97. package/dist/commands/view.js.map +1 -0
  98. package/dist/commands/workspace.d.ts +3 -0
  99. package/dist/commands/workspace.d.ts.map +1 -0
  100. package/dist/commands/workspace.js +309 -0
  101. package/dist/commands/workspace.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +176 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/api/core.d.ts +13 -0
  107. package/dist/lib/api/core.d.ts.map +1 -0
  108. package/dist/lib/api/core.js +176 -0
  109. package/dist/lib/api/core.js.map +1 -0
  110. package/dist/lib/api/filters.d.ts +19 -0
  111. package/dist/lib/api/filters.d.ts.map +1 -0
  112. package/dist/lib/api/filters.js +60 -0
  113. package/dist/lib/api/filters.js.map +1 -0
  114. package/dist/lib/api/notifications.d.ts +33 -0
  115. package/dist/lib/api/notifications.d.ts.map +1 -0
  116. package/dist/lib/api/notifications.js +94 -0
  117. package/dist/lib/api/notifications.js.map +1 -0
  118. package/dist/lib/api/reminders.d.ts +30 -0
  119. package/dist/lib/api/reminders.d.ts.map +1 -0
  120. package/dist/lib/api/reminders.js +65 -0
  121. package/dist/lib/api/reminders.js.map +1 -0
  122. package/dist/lib/api/stats.d.ts +41 -0
  123. package/dist/lib/api/stats.d.ts.map +1 -0
  124. package/dist/lib/api/stats.js +74 -0
  125. package/dist/lib/api/stats.js.map +1 -0
  126. package/dist/lib/api/uploads.d.ts +10 -0
  127. package/dist/lib/api/uploads.d.ts.map +1 -0
  128. package/dist/lib/api/uploads.js +31 -0
  129. package/dist/lib/api/uploads.js.map +1 -0
  130. package/dist/lib/api/user-settings.d.ts +34 -0
  131. package/dist/lib/api/user-settings.d.ts.map +1 -0
  132. package/dist/lib/api/user-settings.js +58 -0
  133. package/dist/lib/api/user-settings.js.map +1 -0
  134. package/dist/lib/api/workspaces.d.ts +23 -0
  135. package/dist/lib/api/workspaces.d.ts.map +1 -0
  136. package/dist/lib/api/workspaces.js +61 -0
  137. package/dist/lib/api/workspaces.js.map +1 -0
  138. package/dist/lib/auth.d.ts +14 -0
  139. package/dist/lib/auth.d.ts.map +1 -0
  140. package/dist/lib/auth.js +182 -0
  141. package/dist/lib/auth.js.map +1 -0
  142. package/dist/lib/browser.d.ts +2 -0
  143. package/dist/lib/browser.d.ts.map +1 -0
  144. package/dist/lib/browser.js +6 -0
  145. package/dist/lib/browser.js.map +1 -0
  146. package/dist/lib/collaborators.d.ts +29 -0
  147. package/dist/lib/collaborators.d.ts.map +1 -0
  148. package/dist/lib/collaborators.js +184 -0
  149. package/dist/lib/collaborators.js.map +1 -0
  150. package/dist/lib/completion.d.ts +41 -0
  151. package/dist/lib/completion.d.ts.map +1 -0
  152. package/dist/lib/completion.js +191 -0
  153. package/dist/lib/completion.js.map +1 -0
  154. package/dist/lib/dates.d.ts +16 -0
  155. package/dist/lib/dates.d.ts.map +1 -0
  156. package/dist/lib/dates.js +45 -0
  157. package/dist/lib/dates.js.map +1 -0
  158. package/dist/lib/duration.d.ts +14 -0
  159. package/dist/lib/duration.d.ts.map +1 -0
  160. package/dist/lib/duration.js +58 -0
  161. package/dist/lib/duration.js.map +1 -0
  162. package/dist/lib/logger.d.ts +42 -0
  163. package/dist/lib/logger.d.ts.map +1 -0
  164. package/dist/lib/logger.js +227 -0
  165. package/dist/lib/logger.js.map +1 -0
  166. package/dist/lib/markdown.d.ts +3 -0
  167. package/dist/lib/markdown.d.ts.map +1 -0
  168. package/dist/lib/markdown.js +22 -0
  169. package/dist/lib/markdown.js.map +1 -0
  170. package/dist/lib/oauth-server.d.ts +6 -0
  171. package/dist/lib/oauth-server.d.ts.map +1 -0
  172. package/dist/lib/oauth-server.js +773 -0
  173. package/dist/lib/oauth-server.js.map +1 -0
  174. package/dist/lib/oauth.d.ts +3 -0
  175. package/dist/lib/oauth.d.ts.map +1 -0
  176. package/dist/lib/oauth.js +38 -0
  177. package/dist/lib/oauth.js.map +1 -0
  178. package/dist/lib/options.d.ts +16 -0
  179. package/dist/lib/options.d.ts.map +1 -0
  180. package/dist/lib/options.js +2 -0
  181. package/dist/lib/options.js.map +1 -0
  182. package/dist/lib/output.d.ts +39 -0
  183. package/dist/lib/output.d.ts.map +1 -0
  184. package/dist/lib/output.js +311 -0
  185. package/dist/lib/output.js.map +1 -0
  186. package/dist/lib/pagination.d.ts +23 -0
  187. package/dist/lib/pagination.d.ts.map +1 -0
  188. package/dist/lib/pagination.js +26 -0
  189. package/dist/lib/pagination.js.map +1 -0
  190. package/dist/lib/pkce.d.ts +4 -0
  191. package/dist/lib/pkce.d.ts.map +1 -0
  192. package/dist/lib/pkce.js +19 -0
  193. package/dist/lib/pkce.js.map +1 -0
  194. package/dist/lib/progress.d.ts +29 -0
  195. package/dist/lib/progress.d.ts.map +1 -0
  196. package/dist/lib/progress.js +101 -0
  197. package/dist/lib/progress.js.map +1 -0
  198. package/dist/lib/refs.d.ts +52 -0
  199. package/dist/lib/refs.d.ts.map +1 -0
  200. package/dist/lib/refs.js +225 -0
  201. package/dist/lib/refs.js.map +1 -0
  202. package/dist/lib/secure-store.d.ts +11 -0
  203. package/dist/lib/secure-store.d.ts.map +1 -0
  204. package/dist/lib/secure-store.js +57 -0
  205. package/dist/lib/secure-store.js.map +1 -0
  206. package/dist/lib/skills/content.d.ts +4 -0
  207. package/dist/lib/skills/content.d.ts.map +1 -0
  208. package/dist/lib/skills/content.js +429 -0
  209. package/dist/lib/skills/content.js.map +1 -0
  210. package/dist/lib/skills/create-installer.d.ts +10 -0
  211. package/dist/lib/skills/create-installer.d.ts.map +1 -0
  212. package/dist/lib/skills/create-installer.js +77 -0
  213. package/dist/lib/skills/create-installer.js.map +1 -0
  214. package/dist/lib/skills/index.d.ts +6 -0
  215. package/dist/lib/skills/index.d.ts.map +1 -0
  216. package/dist/lib/skills/index.js +40 -0
  217. package/dist/lib/skills/index.js.map +1 -0
  218. package/dist/lib/skills/types.d.ts +11 -0
  219. package/dist/lib/skills/types.d.ts.map +1 -0
  220. package/dist/lib/skills/types.js +2 -0
  221. package/dist/lib/skills/types.js.map +1 -0
  222. package/dist/lib/skills/update-installed.d.ts +7 -0
  223. package/dist/lib/skills/update-installed.d.ts.map +1 -0
  224. package/dist/lib/skills/update-installed.js +23 -0
  225. package/dist/lib/skills/update-installed.js.map +1 -0
  226. package/dist/lib/spinner.d.ts +23 -0
  227. package/dist/lib/spinner.d.ts.map +1 -0
  228. package/dist/lib/spinner.js +138 -0
  229. package/dist/lib/spinner.js.map +1 -0
  230. package/dist/lib/stdin.d.ts +2 -0
  231. package/dist/lib/stdin.d.ts.map +1 -0
  232. package/dist/lib/stdin.js +12 -0
  233. package/dist/lib/stdin.js.map +1 -0
  234. package/dist/lib/task-list.d.ts +31 -0
  235. package/dist/lib/task-list.d.ts.map +1 -0
  236. package/dist/lib/task-list.js +271 -0
  237. package/dist/lib/task-list.js.map +1 -0
  238. package/dist/lib/urls.d.ts +8 -0
  239. package/dist/lib/urls.d.ts.map +1 -0
  240. package/dist/lib/urls.js +26 -0
  241. package/dist/lib/urls.js.map +1 -0
  242. package/dist/postinstall.d.ts +2 -0
  243. package/dist/postinstall.d.ts.map +1 -0
  244. package/dist/postinstall.js +3 -0
  245. package/dist/postinstall.js.map +1 -0
  246. package/package.json +3 -2
@@ -0,0 +1,108 @@
1
+ import chalk from 'chalk';
2
+ import { getApi } from '../lib/api/core.js';
3
+ import { CollaboratorCache, formatAssignee } from '../lib/collaborators.js';
4
+ import { getLocalDate, isDueBefore, isDueOnDate } from '../lib/dates.js';
5
+ import { formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, formatTaskRow, } from '../lib/output.js';
6
+ import { LIMITS, paginate } from '../lib/pagination.js';
7
+ import { fetchProjects, filterByWorkspaceOrPersonal } from '../lib/task-list.js';
8
+ export async function showToday(options) {
9
+ const api = await getApi();
10
+ const targetLimit = options.all
11
+ ? Number.MAX_SAFE_INTEGER
12
+ : options.limit
13
+ ? parseInt(options.limit, 10)
14
+ : LIMITS.tasks;
15
+ const baseQuery = 'today | overdue';
16
+ const query = options.anyAssignee ? baseQuery : `(${baseQuery}) & (assigned to: me | !assigned)`;
17
+ const needsProjects = Boolean(options.workspace || options.personal || (!options.json && !options.ndjson));
18
+ const [{ results: tasks, nextCursor }, projects] = await Promise.all([
19
+ paginate((cursor, limit) => api.getTasksByFilter({
20
+ query,
21
+ cursor: cursor ?? undefined,
22
+ limit,
23
+ }), { limit: targetLimit, startCursor: options.cursor }),
24
+ needsProjects ? fetchProjects(api) : Promise.resolve(new Map()),
25
+ ]);
26
+ const today = getLocalDate(0);
27
+ const filterResult = await filterByWorkspaceOrPersonal({
28
+ api,
29
+ tasks,
30
+ workspace: options.workspace,
31
+ personal: options.personal,
32
+ prefetchedProjects: projects,
33
+ });
34
+ const filteredTasks = filterResult.tasks;
35
+ const overdue = filteredTasks.filter((t) => t.due && isDueBefore(t.due.date, today));
36
+ const dueToday = filteredTasks.filter((t) => t.due && isDueOnDate(t.due.date, today));
37
+ const allTodayTasks = [...overdue, ...dueToday];
38
+ if (options.json) {
39
+ console.log(formatPaginatedJson({ results: allTodayTasks, nextCursor }, 'task', options.full, options.showUrls));
40
+ return;
41
+ }
42
+ if (options.ndjson) {
43
+ console.log(formatPaginatedNdjson({ results: allTodayTasks, nextCursor }, 'task', options.full, options.showUrls));
44
+ return;
45
+ }
46
+ const collaboratorCache = new CollaboratorCache();
47
+ await collaboratorCache.preload(api, allTodayTasks, filterResult.projects);
48
+ if (overdue.length === 0 && dueToday.length === 0) {
49
+ console.log('No tasks due today.');
50
+ console.log(formatNextCursorFooter(nextCursor));
51
+ return;
52
+ }
53
+ if (overdue.length > 0) {
54
+ console.log(chalk.red.bold(`Overdue (${overdue.length})`));
55
+ for (const task of overdue) {
56
+ const assignee = formatAssignee({
57
+ userId: task.responsibleUid,
58
+ projectId: task.projectId,
59
+ projects,
60
+ cache: collaboratorCache,
61
+ });
62
+ console.log(formatTaskRow({
63
+ task,
64
+ projectName: projects.get(task.projectId)?.name,
65
+ assignee: assignee ?? undefined,
66
+ raw: options.raw,
67
+ showUrl: options.showUrls,
68
+ }));
69
+ console.log('');
70
+ }
71
+ }
72
+ console.log(chalk.bold(`Today (${dueToday.length})`));
73
+ for (const task of dueToday) {
74
+ const assignee = formatAssignee({
75
+ userId: task.responsibleUid,
76
+ projectId: task.projectId,
77
+ projects,
78
+ cache: collaboratorCache,
79
+ });
80
+ console.log(formatTaskRow({
81
+ task,
82
+ projectName: projects.get(task.projectId)?.name,
83
+ assignee: assignee ?? undefined,
84
+ raw: options.raw,
85
+ showUrl: options.showUrls,
86
+ }));
87
+ console.log('');
88
+ }
89
+ console.log(formatNextCursorFooter(nextCursor));
90
+ }
91
+ export function registerTodayCommand(program) {
92
+ program
93
+ .command('today')
94
+ .description('Show tasks due today and overdue')
95
+ .option('--limit <n>', 'Limit number of results (default: 300)')
96
+ .option('--cursor <cursor>', 'Continue from cursor')
97
+ .option('--all', 'Fetch all results (no limit)')
98
+ .option('--any-assignee', 'Show tasks assigned to anyone (default: only me/unassigned)')
99
+ .option('--workspace <name>', 'Filter to tasks in workspace')
100
+ .option('--personal', 'Filter to tasks in personal projects')
101
+ .option('--json', 'Output as JSON')
102
+ .option('--ndjson', 'Output as newline-delimited JSON')
103
+ .option('--full', 'Include all fields in JSON output')
104
+ .option('--raw', 'Disable markdown rendering')
105
+ .option('--show-urls', 'Show web app URLs for each task')
106
+ .action(showToday);
107
+ }
108
+ //# sourceMappingURL=today.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/commands/today.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from 'commander';
2
+ interface UpcomingOptions {
3
+ limit?: string;
4
+ cursor?: string;
5
+ all?: boolean;
6
+ anyAssignee?: boolean;
7
+ workspace?: string;
8
+ personal?: boolean;
9
+ json?: boolean;
10
+ ndjson?: boolean;
11
+ full?: boolean;
12
+ showUrls?: boolean;
13
+ }
14
+ export declare function showUpcoming(daysArg: string | undefined, options: UpcomingOptions): Promise<void>;
15
+ export declare function registerUpcomingCommand(program: Command): void;
16
+ export {};
17
+ //# sourceMappingURL=upcoming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upcoming.d.ts","sourceRoot":"","sources":["../../src/commands/upcoming.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAanC,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAsB,YAAY,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CA2If;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe9D"}
@@ -0,0 +1,129 @@
1
+ import chalk from 'chalk';
2
+ import { getApi } from '../lib/api/core.js';
3
+ import { CollaboratorCache, formatAssignee } from '../lib/collaborators.js';
4
+ import { formatDateHeader, getLocalDate, isDueBefore } from '../lib/dates.js';
5
+ import { formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, formatTaskRow, } from '../lib/output.js';
6
+ import { LIMITS, paginate } from '../lib/pagination.js';
7
+ import { fetchProjects, filterByWorkspaceOrPersonal } from '../lib/task-list.js';
8
+ export async function showUpcoming(daysArg, options) {
9
+ const days = daysArg ? parseInt(daysArg, 10) : 7;
10
+ if (Number.isNaN(days) || days < 1) {
11
+ console.error('Days must be a positive number');
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ const api = await getApi();
16
+ const targetLimit = options.all
17
+ ? Number.MAX_SAFE_INTEGER
18
+ : options.limit
19
+ ? parseInt(options.limit, 10)
20
+ : LIMITS.tasks;
21
+ const today = getLocalDate(0);
22
+ const baseQuery = `due before: ${days} days`;
23
+ const query = options.anyAssignee ? baseQuery : `(${baseQuery}) & (assigned to: me | !assigned)`;
24
+ const [{ results: tasks, nextCursor }, projects] = await Promise.all([
25
+ paginate((cursor, limit) => api.getTasksByFilter({
26
+ query,
27
+ cursor: cursor ?? undefined,
28
+ limit,
29
+ }), { limit: targetLimit, startCursor: options.cursor }),
30
+ fetchProjects(api),
31
+ ]);
32
+ const filterResult = await filterByWorkspaceOrPersonal({
33
+ api,
34
+ tasks,
35
+ workspace: options.workspace,
36
+ personal: options.personal,
37
+ prefetchedProjects: projects,
38
+ });
39
+ const relevantTasks = filterResult.tasks;
40
+ if (options.json) {
41
+ console.log(formatPaginatedJson({ results: relevantTasks, nextCursor }, 'task', options.full, options.showUrls));
42
+ return;
43
+ }
44
+ if (options.ndjson) {
45
+ console.log(formatPaginatedNdjson({ results: relevantTasks, nextCursor }, 'task', options.full, options.showUrls));
46
+ return;
47
+ }
48
+ const collaboratorCache = new CollaboratorCache();
49
+ await collaboratorCache.preload(api, relevantTasks, filterResult.projects);
50
+ if (relevantTasks.length === 0) {
51
+ console.log(`No tasks due in the next ${days} day${days === 1 ? '' : 's'}.`);
52
+ console.log(formatNextCursorFooter(nextCursor));
53
+ return;
54
+ }
55
+ const overdue = [];
56
+ const byDate = new Map();
57
+ for (const task of relevantTasks) {
58
+ const dueDate = task.due?.date;
59
+ if (!dueDate)
60
+ continue; // Skip tasks without due dates
61
+ if (isDueBefore(dueDate, today)) {
62
+ overdue.push(task);
63
+ }
64
+ else {
65
+ const list = byDate.get(dueDate) || [];
66
+ list.push(task);
67
+ byDate.set(dueDate, list);
68
+ }
69
+ }
70
+ if (overdue.length > 0) {
71
+ console.log(chalk.red.bold(`Overdue (${overdue.length})`));
72
+ for (const task of overdue) {
73
+ const assignee = formatAssignee({
74
+ userId: task.responsibleUid,
75
+ projectId: task.projectId,
76
+ projects,
77
+ cache: collaboratorCache,
78
+ });
79
+ console.log(formatTaskRow({
80
+ task,
81
+ projectName: projects.get(task.projectId)?.name,
82
+ assignee: assignee ?? undefined,
83
+ showUrl: options.showUrls,
84
+ }));
85
+ console.log('');
86
+ }
87
+ }
88
+ const sortedDates = Array.from(byDate.keys()).sort();
89
+ for (const date of sortedDates) {
90
+ const dateTasks = byDate.get(date);
91
+ if (!dateTasks)
92
+ continue; // Should not happen since date comes from keys()
93
+ const header = formatDateHeader(date, today);
94
+ console.log(chalk.bold(`${header} (${dateTasks.length})`));
95
+ for (const task of dateTasks) {
96
+ const assignee = formatAssignee({
97
+ userId: task.responsibleUid,
98
+ projectId: task.projectId,
99
+ projects,
100
+ cache: collaboratorCache,
101
+ });
102
+ console.log(formatTaskRow({
103
+ task,
104
+ projectName: projects.get(task.projectId)?.name,
105
+ assignee: assignee ?? undefined,
106
+ showUrl: options.showUrls,
107
+ }));
108
+ console.log('');
109
+ }
110
+ }
111
+ console.log(formatNextCursorFooter(nextCursor));
112
+ }
113
+ export function registerUpcomingCommand(program) {
114
+ program
115
+ .command('upcoming [days]')
116
+ .description('Show tasks due in the next N days (default: 7)')
117
+ .option('--limit <n>', 'Limit number of results (default: 300)')
118
+ .option('--cursor <cursor>', 'Continue from cursor')
119
+ .option('--all', 'Fetch all results (no limit)')
120
+ .option('--any-assignee', 'Show tasks assigned to anyone (default: only me/unassigned)')
121
+ .option('--workspace <name>', 'Filter to tasks in workspace')
122
+ .option('--personal', 'Filter to tasks in personal projects')
123
+ .option('--json', 'Output as JSON')
124
+ .option('--ndjson', 'Output as newline-delimited JSON')
125
+ .option('--full', 'Include all fields in JSON output')
126
+ .option('--show-urls', 'Show web app URLs for each task')
127
+ .action(showUpcoming);
128
+ }
129
+ //# sourceMappingURL=upcoming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upcoming.js","sourceRoot":"","sources":["../../src/commands/upcoming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ export declare function updateAction(options: {
3
+ check?: boolean;
4
+ }): Promise<void>;
5
+ export declare function registerUpdateCommand(program: Command): void;
6
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2CnC,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE9E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAM5D"}
@@ -0,0 +1,90 @@
1
+ import { spawn } from 'node:child_process';
2
+ import chalk from 'chalk';
3
+ import packageJson from '../../package.json' with { type: 'json' };
4
+ import { withSpinner } from '../lib/spinner.js';
5
+ const PACKAGE_NAME = '@doist/todoist-cli';
6
+ const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
7
+ async function fetchLatestVersion() {
8
+ const response = await fetch(REGISTRY_URL);
9
+ if (!response.ok) {
10
+ throw new Error(`Registry request failed (HTTP ${response.status})`);
11
+ }
12
+ const data = (await response.json());
13
+ return data.version;
14
+ }
15
+ function detectPackageManager() {
16
+ const execPath = process.env.npm_execpath ?? '';
17
+ if (execPath.includes('pnpm'))
18
+ return 'pnpm';
19
+ return 'npm';
20
+ }
21
+ function runInstall(pm) {
22
+ const command = pm === 'pnpm' ? 'add' : 'install';
23
+ return new Promise((resolve, reject) => {
24
+ const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@latest`], {
25
+ stdio: 'pipe',
26
+ });
27
+ let stderr = '';
28
+ child.stderr?.on('data', (data) => {
29
+ stderr += data.toString();
30
+ });
31
+ child.on('error', reject);
32
+ child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
33
+ });
34
+ }
35
+ export async function updateAction(options) {
36
+ const currentVersion = packageJson.version;
37
+ let latestVersion;
38
+ try {
39
+ latestVersion = await withSpinner({ text: 'Checking for updates...', color: 'blue' }, fetchLatestVersion);
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ console.error(chalk.red('Error:'), `Failed to check for updates: ${message}`);
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ if (currentVersion === latestVersion) {
48
+ console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
49
+ return;
50
+ }
51
+ console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
52
+ if (options.check) {
53
+ return;
54
+ }
55
+ const pm = detectPackageManager();
56
+ let result;
57
+ try {
58
+ result = await withSpinner({ text: `Updating to v${latestVersion}...`, color: 'blue' }, () => runInstall(pm));
59
+ }
60
+ catch (error) {
61
+ if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
62
+ console.error(chalk.red('Error:'), 'Permission denied. Try running with sudo:');
63
+ console.error(chalk.dim(` sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@latest`));
64
+ }
65
+ else {
66
+ const message = error instanceof Error ? error.message : String(error);
67
+ console.error(chalk.red('Error:'), `Install failed: ${message}`);
68
+ }
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ if (result.exitCode !== 0) {
73
+ console.error(chalk.red('Error:'), `${pm} exited with code ${result.exitCode}`);
74
+ if (result.stderr) {
75
+ console.error(chalk.dim(result.stderr.trim()));
76
+ }
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ console.log(chalk.green('✓'), `Updated to v${latestVersion}`);
81
+ console.log(chalk.dim(' Run'), chalk.cyan('td changelog'), chalk.dim('to see what changed'));
82
+ }
83
+ export function registerUpdateCommand(program) {
84
+ program
85
+ .command('update')
86
+ .description('Update the CLI to the latest version')
87
+ .option('--check', 'Check for updates without installing')
88
+ .action(updateAction);
89
+ }
90
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerViewCommand(program: Command): void;
3
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8CnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqE1D"}
@@ -0,0 +1,79 @@
1
+ import { Command } from 'commander';
2
+ import { formatError } from '../lib/output.js';
3
+ import { classifyTodoistUrl } from '../lib/refs.js';
4
+ function looksLikeTodoistAppUrl(token) {
5
+ return /^https?:\/\/app\.todoist\.com\/app\/\S+/.test(token);
6
+ }
7
+ function extractViewInvocation(command, parsedUrl, parsedArgs) {
8
+ const parent = command.parent;
9
+ const rawArgs = parent?.rawArgs;
10
+ if (!rawArgs)
11
+ return { url: parsedUrl, passthroughArgs: parsedArgs };
12
+ const viewIndex = rawArgs.findIndex((token, index) => index >= 2 && token === command.name());
13
+ if (viewIndex === -1)
14
+ return { url: parsedUrl, passthroughArgs: parsedArgs };
15
+ const tokensAfterView = rawArgs.slice(viewIndex + 1);
16
+ const urlIndex = tokensAfterView.findIndex((token) => looksLikeTodoistAppUrl(token));
17
+ if (urlIndex === -1)
18
+ return { url: parsedUrl, passthroughArgs: parsedArgs };
19
+ return {
20
+ url: tokensAfterView[urlIndex],
21
+ passthroughArgs: [
22
+ ...tokensAfterView.slice(0, urlIndex),
23
+ ...tokensAfterView.slice(urlIndex + 1),
24
+ ],
25
+ };
26
+ }
27
+ async function runRoutedCommand(loadRegister, argv) {
28
+ const proxy = new Command();
29
+ proxy.exitOverride();
30
+ const register = await loadRegister();
31
+ register(proxy);
32
+ await proxy.parseAsync(['node', 'td', ...argv]);
33
+ }
34
+ export function registerViewCommand(program) {
35
+ program
36
+ .command('view <url> [args...]')
37
+ .description('View a Todoist entity or page by URL')
38
+ .allowUnknownOption(true)
39
+ .addHelpText('after', `
40
+ Route mapping:
41
+ /app/task/... -> td task view <ref>
42
+ /app/project/... -> td project view <ref>
43
+ /app/label/... -> td label view <ref>
44
+ /app/filter/... -> td filter show <ref>
45
+ /app/today -> td today
46
+ /app/upcoming -> td upcoming
47
+
48
+ Examples:
49
+ td view https://app.todoist.com/app/task/buy-milk-abc123
50
+ td view https://app.todoist.com/app/filter/work-tasks-def456 --json
51
+ td view https://app.todoist.com/app/filter/work-tasks-def456 --limit 25 --ndjson`)
52
+ .action(async (url, args, _options, command) => {
53
+ const invocation = extractViewInvocation(command, url, args);
54
+ const route = classifyTodoistUrl(invocation.url);
55
+ if (!route) {
56
+ throw new Error(formatError('INVALID_URL', `Not a recognized Todoist URL: ${invocation.url}`));
57
+ }
58
+ if (route.kind === 'view') {
59
+ switch (route.view) {
60
+ case 'today':
61
+ return runRoutedCommand(async () => (await import('./today.js')).registerTodayCommand, ['today', ...invocation.passthroughArgs]);
62
+ case 'upcoming':
63
+ return runRoutedCommand(async () => (await import('./upcoming.js')).registerUpcomingCommand, ['upcoming', ...invocation.passthroughArgs]);
64
+ }
65
+ }
66
+ const ref = `id:${route.id}`;
67
+ switch (route.entityType) {
68
+ case 'task':
69
+ return runRoutedCommand(async () => (await import('./task.js')).registerTaskCommand, ['task', 'view', ref, ...invocation.passthroughArgs]);
70
+ case 'project':
71
+ return runRoutedCommand(async () => (await import('./project.js')).registerProjectCommand, ['project', 'view', ref, ...invocation.passthroughArgs]);
72
+ case 'label':
73
+ return runRoutedCommand(async () => (await import('./label.js')).registerLabelCommand, ['label', 'view', ref, ...invocation.passthroughArgs]);
74
+ case 'filter':
75
+ return runRoutedCommand(async () => (await import('./filter.js')).registerFilterCommand, ['filter', 'show', ref, ...invocation.passthroughArgs]);
76
+ }
77
+ });
78
+ }
79
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerWorkspaceCommand(program: Command): void;
3
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AA2S3C,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF/D"}