@doist/todoist-cli 1.62.1 → 1.63.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 (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/auth/index.d.ts +1 -1
  3. package/dist/commands/auth/index.d.ts.map +1 -1
  4. package/dist/commands/auth/index.js +2 -13
  5. package/dist/commands/auth/index.js.map +1 -1
  6. package/dist/commands/auth/login.d.ts +13 -4
  7. package/dist/commands/auth/login.d.ts.map +1 -1
  8. package/dist/commands/auth/login.js +75 -48
  9. package/dist/commands/auth/login.js.map +1 -1
  10. package/dist/commands/folder/index.d.ts.map +1 -1
  11. package/dist/commands/folder/index.js +1 -9
  12. package/dist/commands/folder/index.js.map +1 -1
  13. package/dist/commands/project/create.d.ts +1 -1
  14. package/dist/commands/project/create.d.ts.map +1 -1
  15. package/dist/commands/project/create.js +2 -7
  16. package/dist/commands/project/create.js.map +1 -1
  17. package/dist/commands/project/helpers.d.ts +27 -1
  18. package/dist/commands/project/helpers.d.ts.map +1 -1
  19. package/dist/commands/project/helpers.js +77 -0
  20. package/dist/commands/project/helpers.js.map +1 -1
  21. package/dist/commands/project/index.d.ts.map +1 -1
  22. package/dist/commands/project/index.js +24 -0
  23. package/dist/commands/project/index.js.map +1 -1
  24. package/dist/commands/project/reorder.d.ts +9 -0
  25. package/dist/commands/project/reorder.d.ts.map +1 -0
  26. package/dist/commands/project/reorder.js +80 -0
  27. package/dist/commands/project/reorder.js.map +1 -0
  28. package/dist/commands/project/update.d.ts +1 -0
  29. package/dist/commands/project/update.d.ts.map +1 -1
  30. package/dist/commands/project/update.js +58 -5
  31. package/dist/commands/project/update.js.map +1 -1
  32. package/dist/commands/task/index.d.ts.map +1 -1
  33. package/dist/commands/task/index.js +1 -0
  34. package/dist/commands/task/index.js.map +1 -1
  35. package/dist/commands/task/update.d.ts +1 -1
  36. package/dist/commands/task/update.d.ts.map +1 -1
  37. package/dist/commands/task/update.js +6 -2
  38. package/dist/commands/task/update.js.map +1 -1
  39. package/dist/commands/update/index.d.ts +1 -1
  40. package/dist/commands/update/index.d.ts.map +1 -1
  41. package/dist/commands/update/index.js +11 -14
  42. package/dist/commands/update/index.js.map +1 -1
  43. package/dist/lib/api/projects-sync.d.ts +6 -0
  44. package/dist/lib/api/projects-sync.d.ts.map +1 -0
  45. package/dist/lib/api/projects-sync.js +15 -0
  46. package/dist/lib/api/projects-sync.js.map +1 -0
  47. package/dist/lib/auth-html.d.ts +11 -0
  48. package/dist/lib/auth-html.d.ts.map +1 -0
  49. package/dist/lib/{oauth-server.js → auth-html.js} +13 -97
  50. package/dist/lib/auth-html.js.map +1 -0
  51. package/dist/lib/auth-provider.d.ts +16 -0
  52. package/dist/lib/auth-provider.d.ts.map +1 -0
  53. package/dist/lib/auth-provider.js +59 -0
  54. package/dist/lib/auth-provider.js.map +1 -0
  55. package/dist/lib/auth-store.d.ts +48 -0
  56. package/dist/lib/auth-store.d.ts.map +1 -0
  57. package/dist/lib/auth-store.js +91 -0
  58. package/dist/lib/auth-store.js.map +1 -0
  59. package/dist/lib/auth.d.ts +4 -0
  60. package/dist/lib/auth.d.ts.map +1 -1
  61. package/dist/lib/auth.js +1 -1
  62. package/dist/lib/auth.js.map +1 -1
  63. package/dist/lib/errors.d.ts +1 -1
  64. package/dist/lib/errors.d.ts.map +1 -1
  65. package/dist/lib/errors.js.map +1 -1
  66. package/dist/lib/oauth-scopes.d.ts +21 -0
  67. package/dist/lib/oauth-scopes.d.ts.map +1 -1
  68. package/dist/lib/oauth-scopes.js +28 -0
  69. package/dist/lib/oauth-scopes.js.map +1 -1
  70. package/dist/lib/order.d.ts +2 -0
  71. package/dist/lib/order.d.ts.map +1 -0
  72. package/dist/lib/order.js +11 -0
  73. package/dist/lib/order.js.map +1 -0
  74. package/dist/lib/skills/content.d.ts +1 -1
  75. package/dist/lib/skills/content.d.ts.map +1 -1
  76. package/dist/lib/skills/content.js +18 -3
  77. package/dist/lib/skills/content.js.map +1 -1
  78. package/dist/lib/update.d.ts +7 -13
  79. package/dist/lib/update.d.ts.map +1 -1
  80. package/dist/lib/update.js +10 -36
  81. package/dist/lib/update.js.map +1 -1
  82. package/package.json +4 -4
  83. package/dist/commands/update/action.d.ts +0 -5
  84. package/dist/commands/update/action.d.ts.map +0 -1
  85. package/dist/commands/update/action.js +0 -112
  86. package/dist/commands/update/action.js.map +0 -1
  87. package/dist/commands/update/switch.d.ts +0 -5
  88. package/dist/commands/update/switch.d.ts.map +0 -1
  89. package/dist/commands/update/switch.js +0 -31
  90. package/dist/commands/update/switch.js.map +0 -1
  91. package/dist/lib/oauth-server.d.ts +0 -8
  92. package/dist/lib/oauth-server.d.ts.map +0 -1
  93. package/dist/lib/oauth-server.js.map +0 -1
  94. package/dist/lib/oauth.d.ts +0 -13
  95. package/dist/lib/oauth.d.ts.map +0 -1
  96. package/dist/lib/oauth.js +0 -51
  97. package/dist/lib/oauth.js.map +0 -1
  98. package/dist/lib/pkce.d.ts +0 -4
  99. package/dist/lib/pkce.d.ts.map +0 -1
  100. package/dist/lib/pkce.js +0 -19
  101. package/dist/lib/pkce.js.map +0 -1
@@ -33,6 +33,9 @@ td auth login --read-only --additional-scopes=app-management
33
33
  td auth login --additional-scopes=backups
34
34
  td auth login --read-only --additional-scopes=backups
35
35
  td auth login --additional-scopes=app-management,backups
36
+ td auth login --callback-port 9000 # override the OAuth callback port
37
+ td auth login --json # emit the new account record as JSON
38
+ td auth login --ndjson # one-line newline-delimited JSON
36
39
  td auth token
37
40
  td auth status
38
41
  TOKEN=$(td auth token view)
@@ -40,6 +43,8 @@ TOKEN=$(td auth token view --user you@example.com)
40
43
  td auth logout
41
44
  \`\`\`
42
45
 
46
+ \`td auth login\` accepts \`--callback-port <n>\` (default \`8765\`, with a small fallback range when the port is busy) and the standard \`--json\` / \`--ndjson\` machine-output flags. Use \`--json\` / \`--ndjson\` to capture the newly stored account record (id, email, auth metadata) for scripts; warnings about keyring fallback are written to stderr so stdout stays parseable.
47
+
43
48
  Opt-in OAuth scopes are requested via \`--additional-scopes=<list>\` (comma-separated). Run \`td auth login --help\` for the full list. Currently supported:
44
49
 
45
50
  - \`app-management\` — adds the \`dev:app_console\` scope (manage your registered Todoist apps — rotate secrets, edit webhooks, etc.). Required by \`td apps list\` and \`td apps view\`.
@@ -72,7 +77,7 @@ Resolution order: \`--user <ref>\` > \`user.defaultUser\` from config > the only
72
77
 
73
78
  - Daily views: \`td today\`, \`td inbox\`, \`td upcoming\`, \`td completed\`, \`td activity\`
74
79
  - Task lifecycle: \`td task list/view/add/quickadd/update/reschedule/move/complete/uncomplete/delete/browse\` (alias: \`td task qa\` for \`quickadd\`)
75
- - Projects: \`td project list/view/create/update/archive/unarchive/archived/delete/move/join/browse/collaborators/permissions\`
80
+ - Projects: \`td project list/view/create/update/archive/unarchive/archived/delete/move/reorder/join/browse/collaborators/permissions\`
76
81
  - Project analytics: \`td project progress/health/health-context/activity-stats/analyze-health\`
77
82
  - Organization: \`td label ...\`, \`td filter ...\`, \`td section ...\`, \`td folder ...\`, \`td workspace ...\`
78
83
  - Collaboration: \`td comment ...\`, \`td notification ...\`, \`td reminder ...\`
@@ -131,7 +136,7 @@ Choosing between \`task add\` and \`task quickadd\`:
131
136
  Useful task flags:
132
137
  - \`--stdin\` on \`task add\` reads the task description from stdin; on \`task quickadd\` (and the top-level \`td add\`) it reads the full natural-language text from stdin.
133
138
  - \`--parent\`, \`--section\`, \`--project\`, \`--workspace\`, \`--assignee\`, \`--labels\`, \`--due\`, \`--deadline\`, \`--duration\`, and \`--priority\` cover most task workflows.
134
- - \`td task complete --forever\` stops recurrence; \`td task update --no-due\` clears the due date and \`--no-deadline\` clears deadlines; \`td task move --no-parent\` and \`--no-section\` detach from hierarchy.
139
+ - \`td task complete --forever\` stops recurrence; \`td task update --no-due\` clears the due date, \`--no-deadline\` clears deadlines, and \`--no-labels\` removes all labels; \`td task move --no-parent\` and \`--no-section\` detach from hierarchy.
135
140
 
136
141
  ### Projects And Workspaces
137
142
  \`\`\`bash
@@ -144,6 +149,15 @@ td project create --name "New Project" --color blue
144
149
  td project update "Roadmap" --favorite
145
150
  td project update "Roadmap" --folder "Engineering"
146
151
  td project update "Roadmap" --no-folder
152
+ td project update "Roadmap" --parent "Engineering"
153
+ td project update "Roadmap" --no-parent
154
+ td project update "Roadmap" --parent "Engineering" --json
155
+ td project update "Roadmap" --parent "Engineering" --dry-run
156
+ td project reorder "Roadmap" --before "Marketing"
157
+ td project reorder "Roadmap" --after "Marketing"
158
+ td project reorder "Roadmap" --position 0
159
+ td project reorder "Roadmap" --position 2 --json
160
+ td project reorder "Roadmap" --before "Marketing" --dry-run
147
161
  td project archive "Roadmap"
148
162
  td project unarchive "Roadmap"
149
163
  td project move "Roadmap" --to-workspace "Acme" --folder "Engineering" --visibility team --yes
@@ -317,9 +331,10 @@ td doctor --offline
317
331
  td doctor --json
318
332
 
319
333
  td update --check
334
+ td update --check --json
320
335
  td update --channel
321
336
  td update switch --stable
322
- td update switch --pre-release
337
+ td update switch --pre-release --json
323
338
 
324
339
  td changelog --count 10
325
340
  \`\`\`
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAC1B,iRAAiR,CAAA;AACrR,MAAM,CAAC,MAAM,mBAAmB,GAC5B,iGAAiG,CAAA;AAErG,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkU5B,CAAA"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAC1B,iRAAiR,CAAA;AACrR,MAAM,CAAC,MAAM,mBAAmB,GAC5B,iGAAiG,CAAA;AAErG,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiV5B,CAAA"}
@@ -1,17 +1,11 @@
1
1
  import { type UpdateChannel } from './config.js';
2
- export declare const PACKAGE_NAME = "@doist/todoist-cli";
3
- interface ParsedVersion {
4
- major: number;
5
- minor: number;
6
- patch: number;
7
- prerelease: string | undefined;
8
- }
9
- export declare function getInstallTag(channel: UpdateChannel): string;
10
- export declare function parseVersion(version: string): ParsedVersion;
11
- export declare function compareVersions(a: string, b: string): number;
12
- /** Returns true when `candidate` is strictly newer than `current` per semver. */
13
- export declare function isNewer(current: string, candidate: string): boolean;
2
+ export { compareVersions, getInstallTag, isNewer, parseVersion } from '@doist/cli-core/commands';
14
3
  export declare function fetchLatestVersion(channel: UpdateChannel): Promise<string>;
4
+ /**
5
+ * Tolerant channel read for `td doctor`. Returns the raw configured value
6
+ * (defaulting to `'stable'`); validation of unknown values is surfaced as a
7
+ * separate warning by `validateConfigForDoctor`. The user-facing
8
+ * `td update` command uses the strict cli-core version internally.
9
+ */
15
10
  export declare function getConfiguredUpdateChannel(): Promise<UpdateChannel>;
16
- export {};
17
11
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/lib/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAE5D,eAAO,MAAM,YAAY,uBAAuB,CAAA;AAMhD,UAAU,aAAa;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CACjC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAI3D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5D;AAED,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,aAAa,CAAC,CAGzE"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/lib/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEhG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,aAAa,CAAC,CAGzE"}
@@ -1,42 +1,16 @@
1
+ import { fetchLatestVersion as fetchLatestVersionCore } from '@doist/cli-core/commands';
2
+ import packageJson from '../../package.json' with { type: 'json' };
1
3
  import { readConfig } from './config.js';
2
- export const PACKAGE_NAME = '@doist/todoist-cli';
3
- export function getInstallTag(channel) {
4
- return channel === 'pre-release' ? 'next' : 'latest';
5
- }
6
- export function parseVersion(version) {
7
- const [core, ...rest] = version.replace(/^v/, '').split('-');
8
- const [major, minor, patch] = core.split('.').map(Number);
9
- return { major, minor, patch, prerelease: rest.length > 0 ? rest.join('-') : undefined };
10
- }
11
- export function compareVersions(a, b) {
12
- const left = parseVersion(a);
13
- const right = parseVersion(b);
14
- for (const key of ['major', 'minor', 'patch']) {
15
- if (left[key] !== right[key])
16
- return left[key] > right[key] ? 1 : -1;
17
- }
18
- if (!left.prerelease && right.prerelease)
19
- return 1;
20
- if (left.prerelease && !right.prerelease)
21
- return -1;
22
- if (left.prerelease && right.prerelease) {
23
- return left.prerelease.localeCompare(right.prerelease, undefined, { numeric: true });
24
- }
25
- return 0;
26
- }
27
- /** Returns true when `candidate` is strictly newer than `current` per semver. */
28
- export function isNewer(current, candidate) {
29
- return compareVersions(candidate, current) > 0;
30
- }
4
+ export { compareVersions, getInstallTag, isNewer, parseVersion } from '@doist/cli-core/commands';
31
5
  export async function fetchLatestVersion(channel) {
32
- const url = `https://registry.npmjs.org/${PACKAGE_NAME}/${getInstallTag(channel)}`;
33
- const response = await fetch(url);
34
- if (!response.ok) {
35
- throw new Error(`Registry request failed (HTTP ${response.status})`);
36
- }
37
- const data = (await response.json());
38
- return data.version;
6
+ return fetchLatestVersionCore({ packageName: packageJson.name, channel });
39
7
  }
8
+ /**
9
+ * Tolerant channel read for `td doctor`. Returns the raw configured value
10
+ * (defaulting to `'stable'`); validation of unknown values is surfaced as a
11
+ * separate warning by `validateConfigForDoctor`. The user-facing
12
+ * `td update` command uses the strict cli-core version internally.
13
+ */
40
14
  export async function getConfiguredUpdateChannel() {
41
15
  const config = await readConfig();
42
16
  return config.update_channel ?? 'stable';
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/lib/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAA;AAahD,MAAM,UAAU,aAAa,CAAC,OAAsB;IAChD,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IACxC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5D,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;AAC5F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;IAE7B,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,CAAC,CAAA;IAClD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,CAAA;IAEnD,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACxF,CAAC;IAED,OAAO,CAAC,CAAA;AACZ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB;IACtD,OAAO,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAsB;IAC3D,MAAM,GAAG,GAAG,8BAA8B,YAAY,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAA;IAClF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAA;IACxD,OAAO,IAAI,CAAC,OAAO,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,OAAO,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/lib/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACvF,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAClE,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAA;AAE5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEhG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAsB;IAC3D,OAAO,sBAAsB,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,OAAO,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAA;AAC5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doist/todoist-cli",
3
- "version": "1.62.1",
3
+ "version": "1.63.0",
4
4
  "description": "TypeScript CLI for Todoist",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,7 +51,7 @@
51
51
  "CHANGELOG.md"
52
52
  ],
53
53
  "dependencies": {
54
- "@doist/cli-core": "0.6.0",
54
+ "@doist/cli-core": "0.9.0",
55
55
  "@doist/todoist-sdk": "10.1.3",
56
56
  "@napi-rs/keyring": "1.3.0",
57
57
  "@pnpm/tabtab": "0.5.4",
@@ -69,8 +69,8 @@
69
69
  "@types/node": "25.6.0",
70
70
  "conventional-changelog-conventionalcommits": "9.3.1",
71
71
  "lefthook": "2.1.6",
72
- "oxfmt": "0.47.0",
73
- "oxlint": "1.62.0",
72
+ "oxfmt": "0.48.0",
73
+ "oxlint": "1.63.0",
74
74
  "semantic-release": "25.0.3",
75
75
  "typescript": "6.0.3",
76
76
  "vitest": "4.1.5"
@@ -1,5 +0,0 @@
1
- export declare function updateAction(options: {
2
- check?: boolean;
3
- channel?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=action.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAuCA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GjG"}
@@ -1,112 +0,0 @@
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
- import { fetchLatestVersion, getConfiguredUpdateChannel, getInstallTag, isNewer, PACKAGE_NAME, } from '../../lib/update.js';
6
- function detectPackageManager() {
7
- const execPath = process.env.npm_execpath ?? '';
8
- if (execPath.includes('pnpm'))
9
- return 'pnpm';
10
- return 'npm';
11
- }
12
- function runInstall(pm, tag) {
13
- const command = pm === 'pnpm' ? 'add' : 'install';
14
- return new Promise((resolve, reject) => {
15
- const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@${tag}`], {
16
- stdio: 'pipe',
17
- });
18
- let stderr = '';
19
- child.stderr?.on('data', (data) => {
20
- stderr += data.toString();
21
- });
22
- child.on('error', reject);
23
- child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
24
- });
25
- }
26
- function channelLabel(channel) {
27
- return channel === 'pre-release' ? ` ${chalk.magenta('(pre-release)')}` : '';
28
- }
29
- export async function updateAction(options) {
30
- if (options.check && options.channel) {
31
- console.error(chalk.red('Error:'), 'Specify either --check or --channel, not both.');
32
- process.exitCode = 1;
33
- return;
34
- }
35
- const channel = await getConfiguredUpdateChannel();
36
- if (options.channel) {
37
- if (channel === 'pre-release') {
38
- console.log(`Update channel: ${chalk.magenta('pre-release')}`);
39
- }
40
- else {
41
- console.log(`Update channel: ${chalk.green('stable')}`);
42
- }
43
- return;
44
- }
45
- const tag = getInstallTag(channel);
46
- const label = channelLabel(channel);
47
- const currentVersion = packageJson.version;
48
- let latestVersion;
49
- try {
50
- latestVersion = await withSpinner({ text: `Checking for updates${label}...`, color: 'blue' }, () => fetchLatestVersion(channel));
51
- }
52
- catch (error) {
53
- const message = error instanceof Error ? error.message : String(error);
54
- console.error(chalk.red('Error:'), `Failed to check for updates: ${message}`);
55
- process.exitCode = 1;
56
- return;
57
- }
58
- const updateAvailable = isNewer(currentVersion, latestVersion);
59
- if (options.check) {
60
- const channelLine = channel === 'pre-release'
61
- ? ` Channel: ${chalk.magenta('pre-release')}`
62
- : ` Channel: ${chalk.green('stable')}`;
63
- if (updateAvailable) {
64
- console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
65
- }
66
- else {
67
- console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
68
- }
69
- console.log(channelLine);
70
- return;
71
- }
72
- if (currentVersion === latestVersion) {
73
- console.log(chalk.green('✓'), `Already up to date${label} (v${currentVersion})`);
74
- return;
75
- }
76
- if (updateAvailable) {
77
- console.log(`Update available${label}: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
78
- }
79
- else {
80
- console.log(`Downgrade available${label}: ${chalk.dim(`v${currentVersion}`)} → ${chalk.yellow(`v${latestVersion}`)}`);
81
- }
82
- const pm = detectPackageManager();
83
- let result;
84
- try {
85
- result = await withSpinner({ text: `Updating to v${latestVersion}${label}...`, color: 'blue' }, () => runInstall(pm, tag));
86
- }
87
- catch (error) {
88
- if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
89
- console.error(chalk.red('Error:'), 'Permission denied. Try running with sudo:');
90
- console.error(chalk.dim(` sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@${tag}`));
91
- }
92
- else {
93
- const message = error instanceof Error ? error.message : String(error);
94
- console.error(chalk.red('Error:'), `Install failed: ${message}`);
95
- }
96
- process.exitCode = 1;
97
- return;
98
- }
99
- if (result.exitCode !== 0) {
100
- console.error(chalk.red('Error:'), `${pm} exited with code ${result.exitCode}`);
101
- if (result.stderr) {
102
- console.error(chalk.dim(result.stderr.trim()));
103
- }
104
- process.exitCode = 1;
105
- return;
106
- }
107
- console.log(chalk.green('✓'), `Updated to v${latestVersion}${label}`);
108
- if (channel === 'stable') {
109
- console.log(chalk.dim(' Run'), chalk.cyan('td changelog'), chalk.dim('to see what changed'));
110
- }
111
- }
112
- //# sourceMappingURL=action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,WAAW,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EACH,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,EACb,OAAO,EACP,YAAY,GACf,MAAM,qBAAqB,CAAA;AAC5B,SAAS,oBAAoB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC5C,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,EAAU,EAAE,GAAW;IACvC,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,IAAI,GAAG,EAAE,CAAC,EAAE;YAC/D,KAAK,EAAE,MAAM;SAChB,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IACxC,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA+C;IAC9E,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,gDAAgD,CAAC,CAAA;QACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAElD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QAClE,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAM;IACV,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAEnC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAA;IAE1C,IAAI,aAAqB,CAAA;IACzB,IAAI,CAAC;QACD,aAAa,GAAG,MAAM,WAAW,CAC7B,EAAE,IAAI,EAAE,uBAAuB,KAAK,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAC1D,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CACpC,CAAA;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,gCAAgC,OAAO,EAAE,CAAC,CAAA;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;IAE9D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,WAAW,GACb,OAAO,KAAK,aAAa;YACrB,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YAC9C,CAAC,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;QAE/C,IAAI,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CACP,qBAAqB,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,CAC/F,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,wBAAwB,cAAc,GAAG,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACxB,OAAM;IACV,CAAC;IAED,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,qBAAqB,KAAK,MAAM,cAAc,GAAG,CAAC,CAAA;QAChF,OAAM;IACV,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CACP,mBAAmB,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,CACvG,CAAA;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CACP,sBAAsB,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,CAC3G,CAAA;IACL,CAAC;IAED,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAEjC,IAAI,MAA4C,CAAA;IAChD,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,WAAW,CACtB,EAAE,IAAI,EAAE,gBAAgB,aAAa,GAAG,KAAK,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EACnE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAC5B,CAAA;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,2CAA2C,CAAC,CAAA;YAC/E,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CACL,UAAU,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,OAAO,YAAY,IAAI,GAAG,EAAE,CAChF,CACJ,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAA;QACpE,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,aAAa,GAAG,KAAK,EAAE,CAAC,CAAA;IACrE,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAClB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAC1B,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CACnC,CAAA;IACL,CAAC;AACL,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare function switchChannel(options: {
2
- stable?: boolean;
3
- preRelease?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=switch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IACzC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChB"}
@@ -1,31 +0,0 @@
1
- import chalk from 'chalk';
2
- import { readConfig, writeConfig } from '../../lib/config.js';
3
- export async function switchChannel(options) {
4
- if (options.stable && options.preRelease) {
5
- console.error(chalk.red('Error:'), 'Specify either --stable or --pre-release, not both.');
6
- process.exitCode = 1;
7
- return;
8
- }
9
- if (!options.stable && !options.preRelease) {
10
- console.error(chalk.red('Error:'), 'Specify --stable or --pre-release.');
11
- process.exitCode = 1;
12
- return;
13
- }
14
- const channel = options.preRelease ? 'pre-release' : 'stable';
15
- const config = await readConfig();
16
- config.update_channel = channel;
17
- await writeConfig(config);
18
- if (channel === 'pre-release') {
19
- console.log(chalk.green('✓'), `Update channel set to ${chalk.magenta('pre-release')}`);
20
- console.log();
21
- console.log(chalk.yellow('Note:'), 'Pre-release updates follow the', chalk.cyan('next'), 'branch.');
22
- console.log('When pre-release changes are merged into a stable release, no further');
23
- console.log('pre-release updates will be published until a new pre-release cycle begins.');
24
- console.log('Remember to switch back to stable when done:');
25
- console.log(chalk.dim(' td update switch --stable'));
26
- }
27
- else {
28
- console.log(chalk.green('✓'), 'Update channel set to stable');
29
- }
30
- }
31
- //# sourceMappingURL=switch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAsB,MAAM,qBAAqB,CAAA;AAEjF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,qDAAqD,CAAC,CAAA;QACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,oCAAoC,CAAC,CAAA;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAkB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;IAE5E,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,MAAM,CAAC,cAAc,GAAG,OAAO,CAAA;IAC/B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAA;IAEzB,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,yBAAyB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EACrB,gCAAgC,EAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,SAAS,CACZ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACpF,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAA;IACjE,CAAC;AACL,CAAC"}
@@ -1,8 +0,0 @@
1
- export declare const DEFAULT_PORT = 8765;
2
- export declare function getRedirectUri(port: number): string;
3
- export declare function startCallbackServer(expectedState: string): Promise<{
4
- promise: Promise<string>;
5
- port: number;
6
- cleanup: () => void;
7
- }>;
8
- //# sourceMappingURL=oauth-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,OAAO,CAAA;AAssBhC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAYD,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,IAAI,CAAA;CACtB,CAAC,CAgGD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-server.js","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { type AdditionalScopeFlag } from './oauth-scopes.js';
2
- export declare const READ_WRITE_SCOPES = "data:read_write,data:delete,project:delete";
3
- export declare const READ_ONLY_SCOPES = "data:read";
4
- export interface AuthScopeOptions {
5
- readOnly?: boolean;
6
- additionalScopes?: readonly AdditionalScopeFlag[];
7
- }
8
- export declare function resolveAuthScope(options: AuthScopeOptions): string;
9
- export declare function buildAuthorizationUrl(codeChallenge: string, state: string, options?: AuthScopeOptions & {
10
- port?: number;
11
- }): string;
12
- export declare function exchangeCodeForToken(code: string, codeVerifier: string, port: number): Promise<string>;
13
- //# sourceMappingURL=oauth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,mBAAmB,CAAA;AAO3E,eAAO,MAAM,iBAAiB,+CAA+C,CAAA;AAC7E,eAAO,MAAM,gBAAgB,cAAc,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;CACpD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAMlE;AAED,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,MAAM,CAYR;AAOD,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
package/dist/lib/oauth.js DELETED
@@ -1,51 +0,0 @@
1
- import { CliError } from './errors.js';
2
- import { oauthScopeFor } from './oauth-scopes.js';
3
- import { DEFAULT_PORT, getRedirectUri } from './oauth-server.js';
4
- import { fetchTodoist } from './usage-tracking.js';
5
- const TODOIST_CLIENT_ID = '04863cc1e3584830a578622f50224d5b';
6
- const OAUTH_AUTHORIZE_URL = 'https://todoist.com/oauth/authorize';
7
- const OAUTH_TOKEN_URL = 'https://todoist.com/oauth/access_token';
8
- export const READ_WRITE_SCOPES = 'data:read_write,data:delete,project:delete';
9
- export const READ_ONLY_SCOPES = 'data:read';
10
- export function resolveAuthScope(options) {
11
- const parts = [options.readOnly ? READ_ONLY_SCOPES : READ_WRITE_SCOPES];
12
- for (const scope of options.additionalScopes ?? []) {
13
- parts.push(oauthScopeFor(scope));
14
- }
15
- return parts.join(',');
16
- }
17
- export function buildAuthorizationUrl(codeChallenge, state, options = {}) {
18
- const scope = resolveAuthScope(options);
19
- const redirectUri = getRedirectUri(options.port ?? DEFAULT_PORT);
20
- const params = new URLSearchParams({
21
- client_id: TODOIST_CLIENT_ID,
22
- scope,
23
- state: state,
24
- redirect_uri: redirectUri,
25
- code_challenge: codeChallenge,
26
- code_challenge_method: 'S256',
27
- });
28
- return `${OAUTH_AUTHORIZE_URL}?${params.toString()}`;
29
- }
30
- export async function exchangeCodeForToken(code, codeVerifier, port) {
31
- const body = new URLSearchParams({
32
- client_id: TODOIST_CLIENT_ID,
33
- code: code,
34
- code_verifier: codeVerifier,
35
- redirect_uri: getRedirectUri(port),
36
- });
37
- const response = await fetchTodoist(OAUTH_TOKEN_URL, {
38
- method: 'POST',
39
- headers: {
40
- 'Content-Type': 'application/x-www-form-urlencoded',
41
- },
42
- body: body.toString(),
43
- });
44
- if (!response.ok) {
45
- const text = await response.text();
46
- throw new CliError('AUTH_FAILED', `Token exchange failed: ${response.status} ${text}`);
47
- }
48
- const data = await response.json();
49
- return data.access_token;
50
- }
51
- //# sourceMappingURL=oauth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAA4B,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,iBAAiB,GAAG,kCAAkC,CAAA;AAC5D,MAAM,mBAAmB,GAAG,qCAAqC,CAAA;AACjE,MAAM,eAAe,GAAG,wCAAwC,CAAA;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAO3C,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACtD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;IACvE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,aAAqB,EACrB,KAAa,EACb,UAAgD,EAAE;IAElD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QAC/B,SAAS,EAAE,iBAAiB;QAC5B,KAAK;QACL,KAAK,EAAE,KAAK;QACZ,YAAY,EAAE,WAAW;QACzB,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;KAChC,CAAC,CAAA;IACF,OAAO,GAAG,mBAAmB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;AACxD,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAY,EACZ,YAAoB,EACpB,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC7B,SAAS,EAAE,iBAAiB;QAC5B,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC;KACrC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,cAAc,EAAE,mCAAmC;SACtD;QACD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAClC,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,0BAA0B,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAA;IAC1F,CAAC;IAED,MAAM,IAAI,GAAkB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IACjD,OAAO,IAAI,CAAC,YAAY,CAAA;AAC5B,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare function generateCodeVerifier(): string;
2
- export declare function generateCodeChallenge(verifier: string): string;
3
- export declare function generateState(): string;
4
- //# sourceMappingURL=pkce.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
package/dist/lib/pkce.js DELETED
@@ -1,19 +0,0 @@
1
- import { createHash, randomBytes } from 'node:crypto';
2
- const VERIFIER_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
3
- const VERIFIER_LENGTH = 64;
4
- export function generateCodeVerifier() {
5
- const bytes = randomBytes(VERIFIER_LENGTH);
6
- let verifier = '';
7
- for (let i = 0; i < VERIFIER_LENGTH; i++) {
8
- verifier += VERIFIER_CHARSET[bytes[i] % VERIFIER_CHARSET.length];
9
- }
10
- return verifier;
11
- }
12
- export function generateCodeChallenge(verifier) {
13
- const hash = createHash('sha256').update(verifier).digest();
14
- return hash.toString('base64url');
15
- }
16
- export function generateState() {
17
- return randomBytes(16).toString('hex');
18
- }
19
- //# sourceMappingURL=pkce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,gBAAgB,GAAG,oEAAoE,CAAA;AAC7F,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,MAAM,UAAU,oBAAoB;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;IAC1C,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,QAAQ,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;IAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC1C,CAAC"}