@doist/todoist-cli 1.29.4 → 1.29.5

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 +6 -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 +5 -0
  55. package/dist/commands/project.d.ts.map +1 -0
  56. package/dist/commands/project.js +528 -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 +172 -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 +170 -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 +418 -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,107 @@
1
+ import chalk from 'chalk';
2
+ import { getApi } from '../lib/api/core.js';
3
+ import { CollaboratorCache, formatAssignee } from '../lib/collaborators.js';
4
+ import { formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, formatTaskRow, } from '../lib/output.js';
5
+ import { LIMITS, paginate } from '../lib/pagination.js';
6
+ import { resolveProjectId } from '../lib/refs.js';
7
+ function getLocalDate(daysOffset = 0) {
8
+ const date = new Date();
9
+ date.setDate(date.getDate() + daysOffset);
10
+ return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
11
+ }
12
+ export function registerCompletedCommand(program) {
13
+ program
14
+ .command('completed')
15
+ .description('Show completed tasks')
16
+ .option('--since <date>', 'Start date (YYYY-MM-DD), default: today')
17
+ .option('--until <date>', 'End date (YYYY-MM-DD), default: tomorrow')
18
+ .option('--project <name>', 'Filter by project')
19
+ .option('--limit <n>', 'Limit number of results (default: 300)')
20
+ .option('--cursor <cursor>', 'Continue from cursor')
21
+ .option('--all', 'Fetch all results (no limit)')
22
+ .option('--json', 'Output as JSON')
23
+ .option('--ndjson', 'Output as newline-delimited JSON')
24
+ .option('--full', 'Include all fields in JSON output')
25
+ .option('--show-urls', 'Show web app URLs for each task')
26
+ .action(async (options) => {
27
+ const api = await getApi();
28
+ const since = options.since ?? getLocalDate(0);
29
+ const until = options.until ?? getLocalDate(1);
30
+ let projectId;
31
+ if (options.project) {
32
+ projectId = await resolveProjectId(api, options.project);
33
+ }
34
+ const targetLimit = options.all
35
+ ? Number.MAX_SAFE_INTEGER
36
+ : options.limit
37
+ ? parseInt(options.limit, 10)
38
+ : LIMITS.tasks;
39
+ const { results: tasks, nextCursor } = await paginate(async (cursor, limit) => {
40
+ const resp = await api.getCompletedTasksByCompletionDate({
41
+ since,
42
+ until,
43
+ projectId,
44
+ cursor: cursor ?? undefined,
45
+ limit,
46
+ });
47
+ return { results: resp.items, nextCursor: resp.nextCursor };
48
+ }, { limit: targetLimit, startCursor: options.cursor });
49
+ if (tasks.length === 0) {
50
+ if (options.json) {
51
+ console.log(formatPaginatedJson({ results: [], nextCursor }, 'task', options.full, options.showUrls));
52
+ }
53
+ else if (options.ndjson) {
54
+ console.log(formatPaginatedNdjson({ results: [], nextCursor }, 'task', options.full, options.showUrls));
55
+ }
56
+ else {
57
+ console.log('No completed tasks in this period.');
58
+ console.log(formatNextCursorFooter(nextCursor));
59
+ }
60
+ return;
61
+ }
62
+ const { results: allProjects } = await api.getProjects();
63
+ const projects = new Map(allProjects.map((p) => [p.id, p]));
64
+ const collaboratorCache = new CollaboratorCache();
65
+ await collaboratorCache.preload(api, tasks, projects);
66
+ // Helper to get assignee name for a task
67
+ const getAssigneeName = (task) => {
68
+ return formatAssignee({
69
+ userId: task.responsibleUid,
70
+ projectId: task.projectId,
71
+ projects,
72
+ cache: collaboratorCache,
73
+ });
74
+ };
75
+ if (options.json) {
76
+ const tasksWithAssignee = tasks.map((task) => ({
77
+ ...task,
78
+ responsibleName: getAssigneeName(task),
79
+ }));
80
+ console.log(formatPaginatedJson({ results: tasksWithAssignee, nextCursor }, 'task', options.full, options.showUrls));
81
+ return;
82
+ }
83
+ if (options.ndjson) {
84
+ const tasksWithAssignee = tasks.map((task) => ({
85
+ ...task,
86
+ responsibleName: getAssigneeName(task),
87
+ }));
88
+ console.log(formatPaginatedNdjson({ results: tasksWithAssignee, nextCursor }, 'task', options.full, options.showUrls));
89
+ return;
90
+ }
91
+ const dateRange = since === until ? since : `${since} to ${until}`;
92
+ console.log(chalk.bold(`Completed (${tasks.length}) - ${dateRange}`));
93
+ console.log('');
94
+ for (const task of tasks) {
95
+ const projectName = projects.get(task.projectId)?.name;
96
+ console.log(formatTaskRow({
97
+ task,
98
+ projectName,
99
+ assignee: getAssigneeName(task) ?? undefined,
100
+ showUrl: options.showUrls,
101
+ }));
102
+ console.log('');
103
+ }
104
+ console.log(formatNextCursorFooter(nextCursor));
105
+ });
106
+ }
107
+ //# sourceMappingURL=completed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completed.js","sourceRoot":"","sources":["../../src/commands/completed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCompletionCommand(program: Command): void;
3
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+FhE"}
@@ -0,0 +1,107 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { getCompletions, parseCompLine } from '../lib/completion.js';
5
+ // pwsh is included because tabtab supports it — installedShells() needs to
6
+ // detect and clean up pwsh completion files even though we don't advertise it.
7
+ const COMPLETION_EXTENSIONS = {
8
+ bash: 'bash',
9
+ zsh: 'zsh',
10
+ fish: 'fish',
11
+ pwsh: 'ps1',
12
+ };
13
+ /**
14
+ * Find which shells have td completions installed by checking for the
15
+ * completion script files that tabtab creates.
16
+ *
17
+ * FIXME: Workaround for https://github.com/pnpm/tabtab/issues/34 —
18
+ * tabtab.uninstall() without a shell tries all shells and throws ENOENT
19
+ * for ones that were never installed. We detect which shells are actually
20
+ * installed and uninstall only those. Remove once the upstream issue is fixed.
21
+ */
22
+ function installedShells() {
23
+ return Object.entries(COMPLETION_EXTENSIONS)
24
+ .filter(([shell, ext]) => existsSync(join(homedir(), '.config', 'tabtab', shell, `td.${ext}`)))
25
+ .map(([shell]) => shell);
26
+ }
27
+ export function registerCompletionCommand(program) {
28
+ const completion = program.command('completion').description('Manage shell completions');
29
+ completion
30
+ .command('install [shell]')
31
+ .description('Install shell completions (bash, zsh, fish)')
32
+ .action(async (shell) => {
33
+ const tabtab = await import('@pnpm/tabtab');
34
+ if (shell && !tabtab.isShellSupported(shell)) {
35
+ console.error(`Unsupported shell: ${shell}. Supported: ${tabtab.SUPPORTED_SHELLS.join(', ')}`);
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ await tabtab.install({
40
+ name: 'td',
41
+ completer: 'td',
42
+ shell: shell,
43
+ });
44
+ console.log('Shell completions installed successfully.');
45
+ console.log('Restart your shell or source your shell config to activate.');
46
+ });
47
+ completion
48
+ .command('uninstall')
49
+ .description('Remove shell completions')
50
+ .action(async () => {
51
+ // FIXME: Replace with plain tabtab.uninstall({ name: 'td' }) once
52
+ // https://github.com/pnpm/tabtab/issues/34 is fixed.
53
+ const shells = installedShells();
54
+ if (shells.length === 0) {
55
+ console.log('No shell completions installed.');
56
+ return;
57
+ }
58
+ const tabtab = await import('@pnpm/tabtab');
59
+ for (const shell of shells) {
60
+ await tabtab.uninstall({
61
+ name: 'td',
62
+ shell,
63
+ });
64
+ }
65
+ console.log('Shell completions removed.');
66
+ });
67
+ // Hidden command invoked by the shell completion script at TAB time
68
+ program
69
+ .command('completion-server', { hidden: true })
70
+ .description('Completion server (internal)')
71
+ .allowUnknownOption()
72
+ .allowExcessArguments()
73
+ .action(async () => {
74
+ const tabtab = await import('@pnpm/tabtab');
75
+ const env = tabtab.parseEnv(process.env);
76
+ if (!env.complete) {
77
+ return;
78
+ }
79
+ const shell = tabtab.getShellFromEnv(process.env);
80
+ const words = parseCompLine(env.line);
81
+ let current = env.last;
82
+ // The fish/zsh completion templates always append a trailing space
83
+ // to COMP_LINE, making env.last empty even when the cursor is right
84
+ // after '--flag='. Use env.lastPartial (cursor-position-aware) to
85
+ // detect this case and restore the actual word being completed.
86
+ if (current === '' && env.lastPartial.includes('=')) {
87
+ if (words.at(-1) === '')
88
+ words.pop();
89
+ current = env.lastPartial;
90
+ }
91
+ const completions = getCompletions(program, words, current);
92
+ // Bash treats '=' as a word break (COMP_WORDBREAKS), so readline
93
+ // replaces only the part after '=' with COMPREPLY values. If we
94
+ // return '--flag=value', bash produces '--flag=--flag=value'.
95
+ // Strip the flag prefix so bash gets just the value part.
96
+ if (shell === 'bash' && current.includes('=')) {
97
+ const prefix = current.slice(0, current.indexOf('=') + 1);
98
+ const values = completions
99
+ .map((c) => (c.name.startsWith(prefix) ? c.name.slice(prefix.length) : c.name))
100
+ .filter(Boolean);
101
+ console.log(values.join('\n'));
102
+ return;
103
+ }
104
+ tabtab.log(completions, shell);
105
+ });
106
+ }
107
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ import type { PaginatedViewOptions } from '../lib/options.js';
3
+ export declare function showFilter(nameOrId: string, options: PaginatedViewOptions): Promise<void>;
4
+ export declare function registerFilterCommand(program: Command): void;
5
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/commands/filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AA4L7D,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG/F;AAOD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF5D"}
@@ -0,0 +1,287 @@
1
+ import chalk from 'chalk';
2
+ import { getApi } from '../lib/api/core.js';
3
+ import { addFilter, deleteFilter, fetchFilters, updateFilter, } from '../lib/api/filters.js';
4
+ import { openInBrowser } from '../lib/browser.js';
5
+ import { CollaboratorCache, formatAssignee } from '../lib/collaborators.js';
6
+ import { formatError, formatJson, formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, formatTaskRow, isAccessible, printDryRun, } from '../lib/output.js';
7
+ import { LIMITS, paginate } from '../lib/pagination.js';
8
+ import { isIdRef, lenientIdRef, looksLikeRawId, parseTodoistUrl } from '../lib/refs.js';
9
+ import { filterUrl } from '../lib/urls.js';
10
+ async function listFilters(options) {
11
+ const filters = await fetchFilters();
12
+ if (options.json) {
13
+ console.log(formatPaginatedJson({ results: filters, nextCursor: null }, 'filter', options.full, options.showUrls));
14
+ return;
15
+ }
16
+ if (options.ndjson) {
17
+ console.log(formatPaginatedNdjson({ results: filters, nextCursor: null }, 'filter', options.full, options.showUrls));
18
+ return;
19
+ }
20
+ if (filters.length === 0) {
21
+ console.log('No filters found.');
22
+ return;
23
+ }
24
+ for (const filter of filters) {
25
+ const id = chalk.dim(`id:${filter.id}`);
26
+ const name = filter.isFavorite
27
+ ? chalk.yellow(`${filter.name}${isAccessible() ? ' ★' : ''}`)
28
+ : filter.name;
29
+ const query = chalk.dim(`"${filter.query}"`);
30
+ console.log(`${id} ${name} ${query}`);
31
+ if (options.showUrls) {
32
+ console.log(` ${chalk.dim(filterUrl(filter.id))}`);
33
+ }
34
+ }
35
+ }
36
+ async function createFilter(options) {
37
+ if (options.dryRun) {
38
+ printDryRun('create filter', {
39
+ Name: options.name,
40
+ Query: options.query,
41
+ Color: options.color,
42
+ Favorite: options.favorite ? 'yes' : undefined,
43
+ });
44
+ return;
45
+ }
46
+ const filter = await addFilter({
47
+ name: options.name,
48
+ query: options.query,
49
+ color: options.color,
50
+ isFavorite: options.favorite,
51
+ });
52
+ if (options.json) {
53
+ console.log(formatJson(filter, 'filter'));
54
+ return;
55
+ }
56
+ console.log(`Created: ${filter.name}`);
57
+ console.log(chalk.dim(`ID: id:${filter.id}`));
58
+ console.log(chalk.dim(`Query: ${filter.query}`));
59
+ }
60
+ async function resolveFilterRef(nameOrId) {
61
+ const filters = await fetchFilters();
62
+ if (parseTodoistUrl(nameOrId) || isIdRef(nameOrId)) {
63
+ const id = lenientIdRef(nameOrId, 'filter');
64
+ const filter = filters.find((f) => f.id === id);
65
+ if (!filter)
66
+ throw new Error(formatError('FILTER_NOT_FOUND', 'Filter not found.'));
67
+ return filter;
68
+ }
69
+ const lower = nameOrId.toLowerCase();
70
+ const exact = filters.find((f) => f.name.toLowerCase() === lower);
71
+ if (exact)
72
+ return exact;
73
+ const partial = filters.filter((f) => f.name.toLowerCase().includes(lower));
74
+ if (partial.length === 1)
75
+ return partial[0];
76
+ if (partial.length > 1) {
77
+ throw new Error(formatError('AMBIGUOUS_FILTER', `Multiple filters match "${nameOrId}".`, [
78
+ 'Use id:xxx to specify exactly',
79
+ ...partial.slice(0, 5).map((f) => `${f.name} (id:${f.id})`),
80
+ ]));
81
+ }
82
+ if (looksLikeRawId(nameOrId)) {
83
+ const byId = filters.find((f) => f.id === nameOrId);
84
+ if (byId)
85
+ return byId;
86
+ }
87
+ throw new Error(formatError('FILTER_NOT_FOUND', `Filter "${nameOrId}" not found.`));
88
+ }
89
+ async function deleteFilterCmd(nameOrId, options) {
90
+ const filter = await resolveFilterRef(nameOrId);
91
+ if (options.dryRun) {
92
+ printDryRun('delete filter', { Filter: filter.name, Query: filter.query });
93
+ return;
94
+ }
95
+ if (!options.yes) {
96
+ console.log(`Would delete: ${filter.name}`);
97
+ console.log(chalk.dim(`Query: ${filter.query}`));
98
+ console.log('Use --yes to confirm.');
99
+ return;
100
+ }
101
+ await deleteFilter(filter.id);
102
+ console.log(`Deleted: ${filter.name}`);
103
+ }
104
+ async function updateFilterCmd(nameOrId, options) {
105
+ const filter = await resolveFilterRef(nameOrId);
106
+ const args = {};
107
+ if (options.name)
108
+ args.name = options.name;
109
+ if (options.query)
110
+ args.query = options.query;
111
+ if (options.color)
112
+ args.color = options.color;
113
+ if (options.favorite !== undefined)
114
+ args.isFavorite = options.favorite;
115
+ if (Object.keys(args).length === 0) {
116
+ throw new Error(formatError('NO_CHANGES', 'No changes specified.'));
117
+ }
118
+ if (options.dryRun) {
119
+ printDryRun('update filter', {
120
+ Filter: filter.name,
121
+ Name: args.name,
122
+ Query: args.query,
123
+ Color: args.color,
124
+ Favorite: args.isFavorite !== undefined ? String(args.isFavorite) : undefined,
125
+ });
126
+ return;
127
+ }
128
+ await updateFilter(filter.id, args);
129
+ console.log(`Updated: ${filter.name}${options.name ? ` -> ${options.name}` : ''}`);
130
+ }
131
+ export async function showFilter(nameOrId, options) {
132
+ const filter = await resolveFilterRef(nameOrId);
133
+ const api = await getApi();
134
+ const targetLimit = options.all
135
+ ? Number.MAX_SAFE_INTEGER
136
+ : options.limit
137
+ ? parseInt(options.limit, 10)
138
+ : LIMITS.tasks;
139
+ let tasks;
140
+ let nextCursor;
141
+ try {
142
+ const result = await paginate((cursor, limit) => api.getTasksByFilter({
143
+ query: filter.query,
144
+ cursor: cursor ?? undefined,
145
+ limit,
146
+ }), { limit: targetLimit, startCursor: options.cursor });
147
+ tasks = result.results;
148
+ nextCursor = result.nextCursor;
149
+ }
150
+ catch (err) {
151
+ const message = err instanceof Error ? err.message : String(err);
152
+ if (message.includes('400')) {
153
+ throw new Error(formatError('INVALID_FILTER_QUERY', `Filter query "${filter.query}" is invalid.`, [
154
+ 'Check the Todoist filter syntax',
155
+ ]));
156
+ }
157
+ throw err;
158
+ }
159
+ if (options.json) {
160
+ console.log(formatPaginatedJson({ results: tasks, nextCursor }, 'task', options.full, options.showUrls));
161
+ return;
162
+ }
163
+ if (options.ndjson) {
164
+ console.log(formatPaginatedNdjson({ results: tasks, nextCursor }, 'task', options.full, options.showUrls));
165
+ return;
166
+ }
167
+ console.log(chalk.bold(`${filter.name}`));
168
+ console.log(chalk.dim(`Query: ${filter.query}`));
169
+ console.log(chalk.dim(`URL: ${filterUrl(filter.id)}`));
170
+ console.log('');
171
+ if (tasks.length === 0) {
172
+ console.log('No tasks match this filter.');
173
+ console.log(formatNextCursorFooter(nextCursor));
174
+ return;
175
+ }
176
+ const { results: projects } = await api.getProjects();
177
+ const projectMap = new Map();
178
+ for (const p of projects) {
179
+ projectMap.set(p.id, p);
180
+ }
181
+ const collaboratorCache = new CollaboratorCache();
182
+ await collaboratorCache.preload(api, tasks, projectMap);
183
+ for (const task of tasks) {
184
+ const assignee = formatAssignee({
185
+ userId: task.responsibleUid,
186
+ projectId: task.projectId,
187
+ projects: projectMap,
188
+ cache: collaboratorCache,
189
+ });
190
+ console.log(formatTaskRow({
191
+ task,
192
+ projectName: projectMap.get(task.projectId)?.name,
193
+ assignee: assignee ?? undefined,
194
+ showUrl: options.showUrls,
195
+ }));
196
+ console.log('');
197
+ }
198
+ console.log(formatNextCursorFooter(nextCursor));
199
+ }
200
+ async function browseFilter(nameOrId) {
201
+ const filter = await resolveFilterRef(nameOrId);
202
+ await openInBrowser(filterUrl(filter.id));
203
+ }
204
+ export function registerFilterCommand(program) {
205
+ const filter = program.command('filter').description('Manage filters');
206
+ filter
207
+ .command('list')
208
+ .description('List all filters')
209
+ .option('--json', 'Output as JSON')
210
+ .option('--ndjson', 'Output as newline-delimited JSON')
211
+ .option('--full', 'Include all fields in JSON output')
212
+ .option('--show-urls', 'Show web app URLs for each filter')
213
+ .action(listFilters);
214
+ const createCmd = filter
215
+ .command('create')
216
+ .description('Create a filter')
217
+ .option('--name <name>', 'Filter name (required)')
218
+ .option('--query <query>', 'Filter query (required, e.g., "today | overdue")')
219
+ .option('--color <color>', 'Filter color')
220
+ .option('--favorite', 'Mark as favorite')
221
+ .option('--json', 'Output the created filter as JSON')
222
+ .option('--dry-run', 'Preview what would happen without executing')
223
+ .action((options) => {
224
+ if (!options.name || !options.query) {
225
+ createCmd.help();
226
+ return;
227
+ }
228
+ return createFilter(options);
229
+ });
230
+ const deleteCmd = filter
231
+ .command('delete [ref]')
232
+ .description('Delete a filter')
233
+ .option('--yes', 'Confirm deletion')
234
+ .option('--dry-run', 'Preview what would happen without executing')
235
+ .action((ref, options) => {
236
+ if (!ref) {
237
+ deleteCmd.help();
238
+ return;
239
+ }
240
+ return deleteFilterCmd(ref, options);
241
+ });
242
+ const updateCmd = filter
243
+ .command('update [ref]')
244
+ .description('Update a filter')
245
+ .option('--name <name>', 'New name')
246
+ .option('--query <query>', 'New query')
247
+ .option('--color <color>', 'New color')
248
+ .option('--favorite', 'Mark as favorite')
249
+ .option('--no-favorite', 'Remove from favorites')
250
+ .option('--dry-run', 'Preview what would happen without executing')
251
+ .action((ref, options) => {
252
+ if (!ref) {
253
+ updateCmd.help();
254
+ return;
255
+ }
256
+ return updateFilterCmd(ref, options);
257
+ });
258
+ filter
259
+ .command('view [ref]', { isDefault: true })
260
+ .alias('show')
261
+ .description('Show tasks matching a filter')
262
+ .option('--limit <n>', 'Limit number of results (default: 300)')
263
+ .option('--cursor <cursor>', 'Continue from cursor')
264
+ .option('--all', 'Fetch all results (no limit)')
265
+ .option('--json', 'Output as JSON')
266
+ .option('--ndjson', 'Output as newline-delimited JSON')
267
+ .option('--full', 'Include all fields in JSON output')
268
+ .option('--show-urls', 'Show web app URLs for each task')
269
+ .action((ref, options) => {
270
+ if (!ref) {
271
+ filter.help();
272
+ return;
273
+ }
274
+ return showFilter(ref, options);
275
+ });
276
+ const browseCmd = filter
277
+ .command('browse [ref]')
278
+ .description('Open filter in browser')
279
+ .action((ref) => {
280
+ if (!ref) {
281
+ browseCmd.help();
282
+ return;
283
+ }
284
+ return browseFilter(ref);
285
+ });
286
+ }
287
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/commands/filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInboxCommand(program: Command): void;
3
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAK3C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB3D"}
@@ -0,0 +1,25 @@
1
+ import { Option } from 'commander';
2
+ import { getApi } from '../lib/api/core.js';
3
+ import { withCaseInsensitiveChoices } from '../lib/completion.js';
4
+ import { listTasksForProject, PRIORITY_CHOICES } from '../lib/task-list.js';
5
+ export function registerInboxCommand(program) {
6
+ program
7
+ .command('inbox')
8
+ .description('List tasks in Inbox')
9
+ .addOption(withCaseInsensitiveChoices(new Option('--priority <p1-p4>', 'Filter by priority'), PRIORITY_CHOICES))
10
+ .option('--due <date>', 'Filter by due date (today, overdue, or YYYY-MM-DD)')
11
+ .option('--limit <n>', 'Limit number of results (default: 300)')
12
+ .option('--cursor <cursor>', 'Continue from cursor')
13
+ .option('--all', 'Fetch all results (no limit)')
14
+ .option('--json', 'Output as JSON')
15
+ .option('--ndjson', 'Output as newline-delimited JSON')
16
+ .option('--full', 'Include all fields in JSON output')
17
+ .option('--raw', 'Disable markdown rendering')
18
+ .option('--show-urls', 'Show web app URLs for each task')
19
+ .action(async (options) => {
20
+ const api = await getApi();
21
+ const user = await api.getUser();
22
+ await listTasksForProject(user.inboxProjectId, options);
23
+ });
24
+ }
25
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAA;AAEjG,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACjD,OAAO;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qBAAqB,CAAC;SAClC,SAAS,CACN,0BAA0B,CACtB,IAAI,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EACtD,gBAAgB,CACnB,CACJ;SACA,MAAM,CAAC,cAAc,EAAE,oDAAoD,CAAC;SAC5E,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,OAAO,EAAE,8BAA8B,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC;SAC7C,MAAM,CAAC,aAAa,EAAE,iCAAiC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;QAChC,MAAM,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ import type { PaginatedViewOptions } from '../lib/options.js';
3
+ export declare function viewLabel(nameOrId: string, options: PaginatedViewOptions): Promise<void>;
4
+ export declare function registerLabelCommand(program: Command): void;
5
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/commands/label.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAyQ7D,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwF9F;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF3D"}