@doist/todoist-cli 1.62.2 → 1.63.1

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 (65) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/auth/helpers.d.ts +8 -1
  3. package/dist/commands/auth/helpers.d.ts.map +1 -1
  4. package/dist/commands/auth/helpers.js +9 -2
  5. package/dist/commands/auth/helpers.js.map +1 -1
  6. package/dist/commands/auth/index.d.ts.map +1 -1
  7. package/dist/commands/auth/index.js +15 -8
  8. package/dist/commands/auth/index.js.map +1 -1
  9. package/dist/commands/auth/login.d.ts +2 -1
  10. package/dist/commands/auth/login.d.ts.map +1 -1
  11. package/dist/commands/auth/login.js +2 -11
  12. package/dist/commands/auth/login.js.map +1 -1
  13. package/dist/commands/auth/logout.d.ts +10 -1
  14. package/dist/commands/auth/logout.d.ts.map +1 -1
  15. package/dist/commands/auth/logout.js +18 -6
  16. package/dist/commands/auth/logout.js.map +1 -1
  17. package/dist/commands/auth/status.d.ts +17 -3
  18. package/dist/commands/auth/status.d.ts.map +1 -1
  19. package/dist/commands/auth/status.js +116 -35
  20. package/dist/commands/auth/status.js.map +1 -1
  21. package/dist/commands/folder/index.d.ts.map +1 -1
  22. package/dist/commands/folder/index.js +1 -9
  23. package/dist/commands/folder/index.js.map +1 -1
  24. package/dist/commands/project/create.d.ts +1 -1
  25. package/dist/commands/project/create.d.ts.map +1 -1
  26. package/dist/commands/project/create.js +2 -7
  27. package/dist/commands/project/create.js.map +1 -1
  28. package/dist/commands/project/helpers.d.ts +27 -1
  29. package/dist/commands/project/helpers.d.ts.map +1 -1
  30. package/dist/commands/project/helpers.js +77 -0
  31. package/dist/commands/project/helpers.js.map +1 -1
  32. package/dist/commands/project/index.d.ts.map +1 -1
  33. package/dist/commands/project/index.js +24 -0
  34. package/dist/commands/project/index.js.map +1 -1
  35. package/dist/commands/project/reorder.d.ts +9 -0
  36. package/dist/commands/project/reorder.d.ts.map +1 -0
  37. package/dist/commands/project/reorder.js +80 -0
  38. package/dist/commands/project/reorder.js.map +1 -0
  39. package/dist/commands/project/update.d.ts +1 -0
  40. package/dist/commands/project/update.d.ts.map +1 -1
  41. package/dist/commands/project/update.js +58 -5
  42. package/dist/commands/project/update.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-store.d.ts +1 -0
  48. package/dist/lib/auth-store.d.ts.map +1 -1
  49. package/dist/lib/auth-store.js +5 -1
  50. package/dist/lib/auth-store.js.map +1 -1
  51. package/dist/lib/errors.d.ts +1 -1
  52. package/dist/lib/errors.d.ts.map +1 -1
  53. package/dist/lib/errors.js.map +1 -1
  54. package/dist/lib/order.d.ts +2 -0
  55. package/dist/lib/order.d.ts.map +1 -0
  56. package/dist/lib/order.js +11 -0
  57. package/dist/lib/order.js.map +1 -0
  58. package/dist/lib/skills/content.d.ts +1 -1
  59. package/dist/lib/skills/content.d.ts.map +1 -1
  60. package/dist/lib/skills/content.js +13 -2
  61. package/dist/lib/skills/content.js.map +1 -1
  62. package/dist/lib/usage-tracking.d.ts.map +1 -1
  63. package/dist/lib/usage-tracking.js +4 -3
  64. package/dist/lib/usage-tracking.js.map +1 -1
  65. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [1.63.1](https://github.com/Doist/todoist-cli/compare/v1.63.0...v1.63.1) (2026-05-13)
2
+
3
+ ### Bug Fixes
4
+
5
+ * forward arrayBuffer on tracked-fetch wrapper for binary attachments ([#338](https://github.com/Doist/todoist-cli/issues/338)) ([8ca5598](https://github.com/Doist/todoist-cli/commit/8ca559855c0e4d8cfa7f8ede1f6c89324f008f8d))
6
+
7
+ ## [1.63.0](https://github.com/Doist/todoist-cli/compare/v1.62.2...v1.63.0) (2026-05-12)
8
+
9
+ ### Features
10
+
11
+ * **project:** add `--parent` on update and new `reorder` command ([#330](https://github.com/Doist/todoist-cli/issues/330)) ([f32f56a](https://github.com/Doist/todoist-cli/commit/f32f56adefee35943cd9fc43b592b6ad75591240))
12
+
1
13
  ## [1.62.2](https://github.com/Doist/todoist-cli/compare/v1.62.1...v1.62.2) (2026-05-11)
2
14
 
3
15
  ### Bug Fixes
@@ -1,4 +1,11 @@
1
1
  import type { TokenStorageResult } from '../../lib/auth.js';
2
2
  export declare function promptHiddenInput(prompt: string): Promise<string>;
3
- export declare function logTokenStorageResult(result: TokenStorageResult, secureStoreMessage: string): void;
3
+ /**
4
+ * Surface a `TokenStorageResult` from a save/clear operation: the
5
+ * human-readable confirmation goes to stdout, any keyring-fallback warning
6
+ * goes to stderr. Pass `isMachineOutput: true` when the command is in
7
+ * `--json` / `--ndjson` mode so the stdout confirmation is suppressed and
8
+ * the warning still reaches the operator on stderr.
9
+ */
10
+ export declare function logTokenStorageResult(result: TokenStorageResult, secureStoreMessage: string, isMachineOutput?: boolean): void;
4
11
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjE;AAED,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAQN"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,eAAe,UAAQ,GACxB,IAAI,CAQN"}
@@ -20,8 +20,15 @@ export function promptHiddenInput(prompt) {
20
20
  });
21
21
  });
22
22
  }
23
- export function logTokenStorageResult(result, secureStoreMessage) {
24
- if (result.storage === 'secure-store') {
23
+ /**
24
+ * Surface a `TokenStorageResult` from a save/clear operation: the
25
+ * human-readable confirmation goes to stdout, any keyring-fallback warning
26
+ * goes to stderr. Pass `isMachineOutput: true` when the command is in
27
+ * `--json` / `--ndjson` mode so the stdout confirmation is suppressed and
28
+ * the warning still reaches the operator on stderr.
29
+ */
30
+ export function logTokenStorageResult(result, secureStoreMessage, isMachineOutput = false) {
31
+ if (!isMachineOutput && result.storage === 'secure-store') {
25
32
  console.log(chalk.dim(secureStoreMessage));
26
33
  }
27
34
  if (result.warning) {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/auth/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,eAAe,CAAC;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAA;QACF,kFAAkF;QAClF,MAAM,SAAS,GAAI,EAAU,CAAC,cAAc,CAE3C;QAAC,EAAU,CAAC,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;YAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC9B,CAAC;QACL,CAAC,CAAA;QACD,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1B,OAAO,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,MAA0B,EAC1B,kBAA0B;IAE1B,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/auth/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,eAAe,CAAC;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAA;QACF,kFAAkF;QAClF,MAAM,SAAS,GAAI,EAAU,CAAC,cAAc,CAE3C;QAAC,EAAU,CAAC,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;YAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC9B,CAAC;QACL,CAAC,CAAA;QACD,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1B,OAAO,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACjC,MAA0B,EAC1B,kBAA0B,EAC1B,eAAe,GAAG,KAAK;IAEvB,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOxC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQxC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC1D"}
@@ -1,17 +1,29 @@
1
+ import { createTodoistTokenStore } from '../../lib/auth-store.js';
1
2
  import { attachTodoistLoginCommand } from './login.js';
2
- import { logout } from './logout.js';
3
- import { showStatus } from './status.js';
3
+ import { attachTodoistLogoutCommand } from './logout.js';
4
+ import { attachTodoistStatusCommand } from './status.js';
4
5
  import { viewToken } from './token-view.js';
5
6
  import { loginWithToken } from './token.js';
6
7
  export function registerAuthCommand(program) {
7
8
  const auth = program.command('auth').description('Manage authentication');
8
- attachTodoistLoginCommand(auth);
9
+ // Shared store instance: login stashes the post-`set` storage result for
10
+ // its success handler, logout reads the post-`clear` result for the same
11
+ // keyring-fallback warning surface. Status uses `active()` as the
12
+ // authenticated-snapshot gate.
13
+ const store = createTodoistTokenStore();
14
+ attachTodoistLoginCommand(auth, store);
15
+ attachTodoistLogoutCommand(auth, store);
16
+ attachTodoistStatusCommand(auth, store);
9
17
  // `token` is a hybrid: it accepts a positional `[token]` (save) and also
10
18
  // exposes subcommands (`view`). Commander matches subcommand names before
11
19
  // falling through to the parent action, so `td auth token view` always
12
20
  // dispatches to the `view` subcommand — `view` is never treated as a
13
21
  // literal token value. Real Todoist tokens are 40-char hex strings, so
14
22
  // this disambiguation is safe in practice.
23
+ //
24
+ // `token view` stays hand-rolled (not migrated to `attachTokenViewCommand`)
25
+ // because it depends on the `--user <ref>` selector + env precedence rules
26
+ // that the `TokenStore` adapter intentionally drops from `active()`.
15
27
  const tokenCmd = auth
16
28
  .command('token [token]')
17
29
  .description('Save API token for CLI authentication (or use a subcommand: `view`)')
@@ -20,10 +32,5 @@ export function registerAuthCommand(program) {
20
32
  .command('view')
21
33
  .description('Print the stored API token for the active user (or --user <ref>) to stdout for use in scripts')
22
34
  .action(viewToken);
23
- auth.command('status')
24
- .description('Show current authentication status')
25
- .option('--json', 'Output as JSON')
26
- .action(showStatus);
27
- auth.command('logout').description('Remove saved authentication token').action(logout);
28
35
  }
29
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAA;IAEzE,yBAAyB,CAAC,IAAI,CAAC,CAAA;IAE/B,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,qEAAqE;IACrE,uEAAuE;IACvE,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI;SAChB,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,cAAc,CAAC,CAAA;IAE3B,QAAQ;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACR,+FAA+F,CAClG;SACA,MAAM,CAAC,SAAS,CAAC,CAAA;IAEtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAC1F,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAA;IAEzE,yEAAyE;IACzE,yEAAyE;IACzE,kEAAkE;IAClE,+BAA+B;IAC/B,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAA;IAEvC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtC,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACvC,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAEvC,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,qEAAqE;IACrE,uEAAuE;IACvE,2CAA2C;IAC3C,EAAE;IACF,4EAA4E;IAC5E,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI;SAChB,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,cAAc,CAAC,CAAA;IAE3B,QAAQ;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACR,+FAA+F,CAClG;SACA,MAAM,CAAC,SAAS,CAAC,CAAA;AAC1B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Command } from 'commander';
2
+ import type { TodoistTokenStore } from '../../lib/auth-store.js';
2
3
  /**
3
4
  * Attach `td auth login` via cli-core's generic `attachLoginCommand`. The
4
5
  * registrar wires `--read-only`, `--callback-port`, `--json`, `--ndjson` and
@@ -10,5 +11,5 @@ import type { Command } from 'commander';
10
11
  * the same Commander view; cli-core surfaces it through the `flags` argument
11
12
  * to `resolveScopes`.
12
13
  */
13
- export declare function attachTodoistLoginCommand(auth: Command): Command;
14
+ export declare function attachTodoistLoginCommand(auth: Command, store: TodoistTokenStore): Command;
14
15
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAexC;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAiEhE"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAWhF;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CA0D1F"}
@@ -4,7 +4,6 @@ import chalk from 'chalk';
4
4
  import open from 'open';
5
5
  import { renderAuthErrorPage, renderAuthSuccessPage } from '../../lib/auth-html.js';
6
6
  import { createTodoistAuthProvider } from '../../lib/auth-provider.js';
7
- import { createTodoistTokenStore } from '../../lib/auth-store.js';
8
7
  import { extractAdditionalScopes, formatScopesHelp, resolveAuthScope, } from '../../lib/oauth-scopes.js';
9
8
  import { logTokenStorageResult } from './helpers.js';
10
9
  const TODOIST_CALLBACK_PORT = 8765;
@@ -20,8 +19,7 @@ const TODOIST_CALLBACK_PORT_FALLBACK = 5;
20
19
  * the same Commander view; cli-core surfaces it through the `flags` argument
21
20
  * to `resolveScopes`.
22
21
  */
23
- export function attachTodoistLoginCommand(auth) {
24
- const store = createTodoistTokenStore();
22
+ export function attachTodoistLoginCommand(auth, store) {
25
23
  const login = attachLoginCommand(auth, {
26
24
  provider: createTodoistAuthProvider(),
27
25
  store,
@@ -57,14 +55,7 @@ export function attachTodoistLoginCommand(auth) {
57
55
  // `--json` / `--ndjson` stdout envelope clean; the human "stored
58
56
  // securely" confirmation is suppressed in machine-output mode.
59
57
  if (storage) {
60
- if (view.json || view.ndjson) {
61
- if (storage.warning) {
62
- console.error(chalk.yellow('Warning:'), storage.warning);
63
- }
64
- }
65
- else {
66
- logTokenStorageResult(storage, 'Token stored securely in the system credential manager');
67
- }
58
+ logTokenStorageResult(storage, 'Token stored securely in the system credential manager', view.json || view.ndjson);
68
59
  }
69
60
  },
70
61
  });
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,11 @@
1
- export declare function logout(): Promise<void>;
1
+ import type { Command } from 'commander';
2
+ import type { TodoistTokenStore } from '../../lib/auth-store.js';
3
+ /**
4
+ * Attach `td auth logout` via cli-core's generic `attachLogoutCommand`. The
5
+ * registrar emits the success line (`✓ Logged out` / `{ok:true}` / silent
6
+ * ndjson); `onCleared` only surfaces the keyring-fallback warning carried by
7
+ * `TokenStorageResult` — cli-core's `TokenStore.clear: void` contract can't
8
+ * expose it directly, so we stash it on the adapter (`getLastClearResult`).
9
+ */
10
+ export declare function attachTodoistLogoutCommand(auth: Command, store: TodoistTokenStore): Command;
2
11
  //# sourceMappingURL=logout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAIA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5C"}
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAGhF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAa3F"}
@@ -1,9 +1,21 @@
1
- import chalk from 'chalk';
2
- import { clearApiToken } from '../../lib/auth.js';
1
+ import { attachLogoutCommand } from '@doist/cli-core/auth';
3
2
  import { logTokenStorageResult } from './helpers.js';
4
- export async function logout() {
5
- const result = await clearApiToken();
6
- console.log(chalk.green('✓'), 'Logged out');
7
- logTokenStorageResult(result, 'Stored token removed from the system credential manager');
3
+ /**
4
+ * Attach `td auth logout` via cli-core's generic `attachLogoutCommand`. The
5
+ * registrar emits the success line (`✓ Logged out` / `{ok:true}` / silent
6
+ * ndjson); `onCleared` only surfaces the keyring-fallback warning carried by
7
+ * `TokenStorageResult` — cli-core's `TokenStore.clear: void` contract can't
8
+ * expose it directly, so we stash it on the adapter (`getLastClearResult`).
9
+ */
10
+ export function attachTodoistLogoutCommand(auth, store) {
11
+ return attachLogoutCommand(auth, {
12
+ store,
13
+ onCleared: ({ view }) => {
14
+ const result = store.getLastClearResult();
15
+ if (!result)
16
+ return;
17
+ logTokenStorageResult(result, 'Stored token removed from the system credential manager', view.json || view.ndjson);
18
+ },
19
+ });
8
20
  }
9
21
  //# sourceMappingURL=logout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,MAAM;IACxB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAA;IAC3C,qBAAqB,CAAC,MAAM,EAAE,yDAAyD,CAAC,CAAA;AAC5F,CAAC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAa,EAAE,KAAwB;IAC9E,OAAO,mBAAmB,CAAiB,IAAI,EAAE;QAC7C,KAAK;QACL,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAA;YACzC,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,qBAAqB,CACjB,MAAM,EACN,yDAAyD,EACzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAC3B,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;AACN,CAAC"}
@@ -1,4 +1,18 @@
1
- export declare function showStatus(options: {
2
- json?: boolean;
3
- }): Promise<void>;
1
+ import type { Command } from 'commander';
2
+ import { type TodoistTokenStore } from '../../lib/auth-store.js';
3
+ /**
4
+ * Attach `td auth status` via cli-core's generic `attachStatusCommand`.
5
+ *
6
+ * `TodoistTokenStore.active()` returns `null` for env-token mode + when no
7
+ * default user is stored (per the adapter's documented contract — see
8
+ * `auth-store.ts`). To preserve the existing UX for those cases we route the
9
+ * full status fetch through `onNotAuthenticated`; when `active()` does return
10
+ * a snapshot, `fetchLive` covers the same gather so renderText/renderJson can
11
+ * read from a single closure-captured `StatusData` regardless of which path
12
+ * we took. The snapshot path also short-circuits one credential resolve via
13
+ * `gatherStatusData(token)` when no `--user <ref>` is in play; when `--user`
14
+ * is set we re-resolve through `getApi()` so the displayed account matches
15
+ * the selector instead of the snapshot's default.
16
+ */
17
+ export declare function attachTodoistStatusCommand(auth: Command, store: TodoistTokenStore): Command;
4
18
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAeA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D3E"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAGH,KAAK,iBAAiB,EACzB,MAAM,yBAAyB,CAAA;AAuGhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CA8C3F"}
@@ -1,6 +1,10 @@
1
+ import { formatJson, formatNdjson } from '@doist/cli-core';
2
+ import { attachStatusCommand } from '@doist/cli-core/auth';
1
3
  import chalk from 'chalk';
2
- import { getApi } from '../../lib/api/core.js';
3
- import { getAuthMetadata, listStoredUsers, readConfig } from '../../lib/auth.js';
4
+ import { createApiForToken, getApi } from '../../lib/api/core.js';
5
+ import { toTodoistAccount, } from '../../lib/auth-store.js';
6
+ import { getAuthMetadata, listStoredUsers, readConfig, } from '../../lib/auth.js';
7
+ import { getRequestedUserRef } from '../../lib/global-args.js';
4
8
  import { getDefaultUserId } from '../../lib/users.js';
5
9
  function formatAuthMode(authMode, authScope) {
6
10
  if (authMode === 'read-only') {
@@ -11,32 +15,25 @@ function formatAuthMode(authMode, authScope) {
11
15
  }
12
16
  return 'unknown (manual token or env var; assuming write access)';
13
17
  }
14
- export async function showStatus(options) {
15
- const api = await getApi();
16
- const user = await api.getUser();
17
- const metadata = await getAuthMetadata();
18
- const config = await readConfig();
19
- const storedUsers = await listStoredUsers();
20
- const defaultUserId = getDefaultUserId(config);
18
+ /**
19
+ * `token` shortcut: when the caller already has a resolved token (e.g. from
20
+ * the cli-core `store.active()` snapshot, and no `--user <ref>` override is
21
+ * in play), pass it through to skip the redundant keyring round-trip
22
+ * `getApi()` would do via `resolveActiveUser`.
23
+ */
24
+ async function gatherStatusData(token) {
25
+ const api = token ? createApiForToken(token) : await getApi();
26
+ const [user, metadata, storedUsers, config] = await Promise.all([
27
+ api.getUser(),
28
+ getAuthMetadata(),
29
+ listStoredUsers(),
30
+ readConfig(),
31
+ ]);
32
+ return { user, metadata, storedUsers, defaultUserId: getDefaultUserId(config) };
33
+ }
34
+ function buildStatusText(data) {
35
+ const { user, metadata, storedUsers, defaultUserId } = data;
21
36
  const modeLabel = formatAuthMode(metadata.authMode, metadata.authScope);
22
- if (options.json) {
23
- console.log(JSON.stringify({
24
- id: user.id,
25
- email: user.email,
26
- fullName: user.fullName,
27
- authMode: metadata.authMode,
28
- authScope: metadata.authScope,
29
- authFlags: metadata.authFlags,
30
- source: metadata.source,
31
- isDefault: defaultUserId === user.id,
32
- storedUsers: storedUsers.map((u) => ({
33
- id: u.id,
34
- email: u.email,
35
- isDefault: defaultUserId === u.id,
36
- })),
37
- }, null, 2));
38
- return;
39
- }
40
37
  // env source wins over default: when running with TODOIST_API_TOKEN,
41
38
  // showing `(default)` would hide the more important "this is an env
42
39
  // override, not your stored credential" signal.
@@ -45,19 +42,103 @@ export async function showStatus(options) {
45
42
  : defaultUserId === user.id
46
43
  ? ' (default)'
47
44
  : '';
48
- console.log(chalk.green('✓'), `Authenticated${defaultMarker}`);
49
- console.log(` Email: ${user.email}`);
50
- console.log(` Name: ${user.fullName}`);
51
- console.log(` Mode: ${modeLabel}`);
45
+ const lines = [
46
+ `${chalk.green('✓')} Authenticated${defaultMarker}`,
47
+ ` Email: ${user.email}`,
48
+ ` Name: ${user.fullName}`,
49
+ ` Mode: ${modeLabel}`,
50
+ ];
52
51
  const others = storedUsers.filter((u) => u.id !== user.id);
53
52
  if (others.length > 0) {
54
- console.log();
55
- console.log(chalk.dim(`Other stored accounts (${others.length}):`));
53
+ lines.push('');
54
+ lines.push(chalk.dim(`Other stored accounts (${others.length}):`));
56
55
  for (const other of others) {
57
56
  const marker = other.id === defaultUserId ? chalk.dim(' (default)') : '';
58
- console.log(` ${other.email} ${chalk.dim(`(id:${other.id})`)}${marker}`);
57
+ lines.push(` ${other.email} ${chalk.dim(`(id:${other.id})`)}${marker}`);
59
58
  }
60
- console.log(chalk.dim('Use `td user use <id|email>` to switch default, or `--user <ref>` per command.'));
59
+ lines.push(chalk.dim('Use `td user use <id|email>` to switch default, or `--user <ref>` per command.'));
61
60
  }
61
+ return lines;
62
+ }
63
+ function buildStatusJson(data) {
64
+ const { user, metadata, storedUsers, defaultUserId } = data;
65
+ return {
66
+ id: user.id,
67
+ email: user.email,
68
+ fullName: user.fullName,
69
+ authMode: metadata.authMode,
70
+ authScope: metadata.authScope,
71
+ authFlags: metadata.authFlags,
72
+ source: metadata.source,
73
+ isDefault: defaultUserId === user.id,
74
+ storedUsers: storedUsers.map((u) => ({
75
+ id: u.id,
76
+ email: u.email,
77
+ isDefault: defaultUserId === u.id,
78
+ })),
79
+ };
80
+ }
81
+ /**
82
+ * Attach `td auth status` via cli-core's generic `attachStatusCommand`.
83
+ *
84
+ * `TodoistTokenStore.active()` returns `null` for env-token mode + when no
85
+ * default user is stored (per the adapter's documented contract — see
86
+ * `auth-store.ts`). To preserve the existing UX for those cases we route the
87
+ * full status fetch through `onNotAuthenticated`; when `active()` does return
88
+ * a snapshot, `fetchLive` covers the same gather so renderText/renderJson can
89
+ * read from a single closure-captured `StatusData` regardless of which path
90
+ * we took. The snapshot path also short-circuits one credential resolve via
91
+ * `gatherStatusData(token)` when no `--user <ref>` is in play; when `--user`
92
+ * is set we re-resolve through `getApi()` so the displayed account matches
93
+ * the selector instead of the snapshot's default.
94
+ */
95
+ export function attachTodoistStatusCommand(auth, store) {
96
+ let data = null;
97
+ return attachStatusCommand(auth, {
98
+ store,
99
+ description: 'Show current authentication status',
100
+ fetchLive: async ({ token }) => {
101
+ // Snapshot's token only matches `--user` when no selector is set.
102
+ // Re-resolve via getApi when --user is present so the displayed
103
+ // account is the requested one, not the snapshot's default.
104
+ const userOverride = getRequestedUserRef() !== undefined;
105
+ data = await gatherStatusData(userOverride ? undefined : token);
106
+ return toTodoistAccount({
107
+ id: data.user.id,
108
+ email: data.user.email,
109
+ authMode: data.metadata.authMode,
110
+ authScope: data.metadata.authScope,
111
+ authFlags: data.metadata.authFlags,
112
+ });
113
+ },
114
+ renderText: () => {
115
+ if (!data)
116
+ throw new Error('status renderText called before fetchLive');
117
+ return buildStatusText(data);
118
+ },
119
+ renderJson: () => {
120
+ if (!data)
121
+ throw new Error('status renderJson called before fetchLive');
122
+ return buildStatusJson(data);
123
+ },
124
+ onNotAuthenticated: async ({ view }) => {
125
+ // active() returned null — either env-token mode, --user selector
126
+ // without a snapshot match, or no default. Drive the legacy
127
+ // resolver (getApi) so all three paths render identically; getApi
128
+ // throws NoTokenError / UserNotFoundError when nothing resolves,
129
+ // matching prior UX.
130
+ data = await gatherStatusData();
131
+ if (view.json) {
132
+ console.log(formatJson(buildStatusJson(data)));
133
+ return;
134
+ }
135
+ if (view.ndjson) {
136
+ console.log(formatNdjson([buildStatusJson(data)]));
137
+ return;
138
+ }
139
+ for (const line of buildStatusText(data))
140
+ console.log(line);
141
+ },
142
+ });
62
143
  }
63
144
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH5D"}
@@ -1,19 +1,11 @@
1
1
  import { CURSOR_DESCRIPTION } from '../../lib/constants.js';
2
2
  import { CliError } from '../../lib/errors.js';
3
+ import { parseOrderArg } from '../../lib/order.js';
3
4
  import { createFolder } from './create.js';
4
5
  import { deleteFolder } from './delete.js';
5
6
  import { listFolders } from './list.js';
6
7
  import { updateFolder } from './update.js';
7
8
  import { viewFolder } from './view.js';
8
- function parseOrderArg(val) {
9
- const n = Number(val);
10
- if (!Number.isInteger(n) || n < 0) {
11
- throw new CliError('INVALID_ORDER', `Invalid order value: "${val}"`, [
12
- 'Order must be a non-negative integer (e.g., 0 for top of list)',
13
- ]);
14
- }
15
- return n;
16
- }
17
9
  export function registerFolderCommand(program) {
18
10
  const folder = program
19
11
  .command('folder')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type ColorKey } from '@doist/todoist-sdk';
1
+ import type { ColorKey } from '@doist/todoist-sdk';
2
2
  export interface CreateOptions {
3
3
  name: string;
4
4
  color?: ColorKey;
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/project/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAyB,MAAM,oBAAoB,CAAA;AAQ7F,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CzE"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/project/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,oBAAoB,CAAA;AAOpE,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCzE"}
@@ -1,10 +1,8 @@
1
- import { isWorkspaceProject } from '@doist/todoist-sdk';
2
1
  import chalk from 'chalk';
3
2
  import { getApi } from '../../lib/api/core.js';
4
- import { CliError } from '../../lib/errors.js';
5
3
  import { isQuiet } from '../../lib/global-args.js';
6
4
  import { formatJson, printDryRun } from '../../lib/output.js';
7
- import { resolveProjectRef } from '../../lib/refs.js';
5
+ import { resolvePersonalParent } from './helpers.js';
8
6
  export async function createProject(options) {
9
7
  if (options.dryRun) {
10
8
  printDryRun('create project', {
@@ -19,10 +17,7 @@ export async function createProject(options) {
19
17
  const api = await getApi();
20
18
  let parentId;
21
19
  if (options.parent) {
22
- const parentProject = await resolveProjectRef(api, options.parent);
23
- if (isWorkspaceProject(parentProject)) {
24
- throw new CliError('WORKSPACE_NO_SUBPROJECTS', 'Workspace projects do not support sub-projects.', ['Sub-projects are only supported for personal projects.']);
25
- }
20
+ const parentProject = await resolvePersonalParent(api, options.parent);
26
21
  parentId = parentProject.id;
27
22
  }
28
23
  const project = await api.addProject({
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/project/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAwC,MAAM,oBAAoB,CAAA;AAC7F,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAYrD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACtD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,gBAAgB,EAAE;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,SAAS;SAClC,CAAC,CAAA;QACF,OAAM;IACV,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAE1B,IAAI,QAA4B,CAAA;IAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAClE,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CACd,0BAA0B,EAC1B,iDAAiD,EACjD,CAAC,wDAAwD,CAAC,CAC7D,CAAA;QACL,CAAC;QACD,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,QAAQ;QAC5B,QAAQ;QACR,SAAS,EAAE,OAAO,CAAC,SAA6B;KACnD,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3C,OAAM;IACV,CAAC;IAED,IAAI,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvB,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/project/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAYpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACtD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,gBAAgB,EAAE;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,SAAS;SAClC,CAAC,CAAA;QACF,OAAM;IACV,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAE1B,IAAI,QAA4B,CAAA;IAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACtE,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,QAAQ;QAC5B,QAAQ;QACR,SAAS,EAAE,OAAO,CAAC,SAA6B;KACnD,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3C,OAAM;IACV,CAAC;IAED,IAAI,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvB,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAC/C,CAAC"}
@@ -1,3 +1,29 @@
1
- import type { ProjectViewStyle } from '@doist/todoist-sdk';
1
+ import { type PersonalProject, type ProjectViewStyle, type TodoistApi } from '@doist/todoist-sdk';
2
+ import type { Project } from '../../lib/api/core.js';
2
3
  export declare const VIEW_STYLE_CHOICES: ProjectViewStyle[];
4
+ /**
5
+ * Resolve a project reference for use as a parent. Rejects workspace projects
6
+ * — only personal projects can have sub-projects.
7
+ */
8
+ export declare function resolvePersonalParent(api: TodoistApi, parentRef: string): Promise<PersonalProject>;
9
+ /**
10
+ * Load every personal project the user has access to (paginated). Used by
11
+ * commands that need to traverse the project hierarchy in memory rather than
12
+ * making N round trips.
13
+ */
14
+ export declare function loadPersonalProjects(api: TodoistApi): Promise<PersonalProject[]>;
15
+ /**
16
+ * Returns true if `candidateId` is a descendant of `ancestorId` within the
17
+ * given project set. Walks the parent chain in memory; bails on cycles.
18
+ */
19
+ export declare function isDescendantOf(projects: PersonalProject[], candidateId: string, ancestorId: string): boolean;
20
+ export declare function isPersonal(p: Project): p is PersonalProject;
21
+ /**
22
+ * Resolve a project reference against an in-memory personal-project list,
23
+ * avoiding extra round trips when the caller has already paginated the
24
+ * full list (e.g. `project reorder`). Mirrors the matching rules of
25
+ * `resolveProjectRef` (id prefix → exact name → substring name) but is
26
+ * scoped to personal projects only.
27
+ */
28
+ export declare function resolvePersonalFromList(projects: PersonalProject[], ref: string): PersonalProject;
3
29
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/project/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAAkC,CAAA"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/project/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAKpD,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAAkC,CAAA;AAEnF;;;GAGG;AACH,wBAAsB,qBAAqB,CACvC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAU1B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAMtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,eAAe,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACnB,OAAO,CAUT;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAgCjG"}