@doist/twist-cli 2.32.2 → 2.34.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 (66) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/commands/channel/helpers.d.ts +3 -0
  3. package/dist/commands/channel/helpers.d.ts.map +1 -0
  4. package/dist/commands/channel/helpers.js +24 -0
  5. package/dist/commands/channel/helpers.js.map +1 -0
  6. package/dist/commands/{channel.d.ts → channel/index.d.ts} +1 -1
  7. package/dist/commands/channel/index.d.ts.map +1 -0
  8. package/dist/commands/channel/index.js +67 -0
  9. package/dist/commands/channel/index.js.map +1 -0
  10. package/dist/commands/channel/list.d.ts +8 -0
  11. package/dist/commands/channel/list.d.ts.map +1 -0
  12. package/dist/commands/{channel.js → channel/list.js} +7 -39
  13. package/dist/commands/channel/list.js.map +1 -0
  14. package/dist/commands/channel/threads.d.ts +11 -0
  15. package/dist/commands/channel/threads.d.ts.map +1 -0
  16. package/dist/commands/channel/threads.js +97 -0
  17. package/dist/commands/channel/threads.js.map +1 -0
  18. package/dist/commands/config/index.d.ts +3 -0
  19. package/dist/commands/config/index.d.ts.map +1 -0
  20. package/dist/commands/config/index.js +29 -0
  21. package/dist/commands/config/index.js.map +1 -0
  22. package/dist/commands/config/set.d.ts +3 -0
  23. package/dist/commands/config/set.d.ts.map +1 -0
  24. package/dist/commands/config/set.js +41 -0
  25. package/dist/commands/config/set.js.map +1 -0
  26. package/dist/commands/config/view.d.ts +6 -0
  27. package/dist/commands/config/view.d.ts.map +1 -0
  28. package/dist/commands/config/view.js +108 -0
  29. package/dist/commands/config/view.js.map +1 -0
  30. package/dist/commands/thread/create.d.ts +1 -0
  31. package/dist/commands/thread/create.d.ts.map +1 -1
  32. package/dist/commands/thread/create.js +13 -0
  33. package/dist/commands/thread/create.js.map +1 -1
  34. package/dist/commands/thread/index.d.ts.map +1 -1
  35. package/dist/commands/thread/index.js +4 -1
  36. package/dist/commands/thread/index.js.map +1 -1
  37. package/dist/index.js +5 -5
  38. package/dist/index.js.map +1 -1
  39. package/dist/lib/api.d.ts.map +1 -1
  40. package/dist/lib/api.js +2 -0
  41. package/dist/lib/api.js.map +1 -1
  42. package/dist/lib/config.d.ts +17 -0
  43. package/dist/lib/config.d.ts.map +1 -1
  44. package/dist/lib/config.js +57 -1
  45. package/dist/lib/config.js.map +1 -1
  46. package/dist/lib/errors.d.ts +1 -1
  47. package/dist/lib/errors.d.ts.map +1 -1
  48. package/dist/lib/errors.js.map +1 -1
  49. package/dist/lib/output.d.ts.map +1 -1
  50. package/dist/lib/output.js +3 -0
  51. package/dist/lib/output.js.map +1 -1
  52. package/dist/lib/refs.d.ts +2 -1
  53. package/dist/lib/refs.d.ts.map +1 -1
  54. package/dist/lib/refs.js +43 -1
  55. package/dist/lib/refs.js.map +1 -1
  56. package/dist/lib/skills/content.d.ts +1 -1
  57. package/dist/lib/skills/content.d.ts.map +1 -1
  58. package/dist/lib/skills/content.js +26 -1
  59. package/dist/lib/skills/content.js.map +1 -1
  60. package/package.json +4 -4
  61. package/dist/__mocks__/chalk.d.ts +0 -3
  62. package/dist/__mocks__/chalk.d.ts.map +0 -1
  63. package/dist/__mocks__/chalk.js +0 -8
  64. package/dist/__mocks__/chalk.js.map +0 -1
  65. package/dist/commands/channel.d.ts.map +0 -1
  66. package/dist/commands/channel.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [2.34.0](https://github.com/Doist/twist-cli/compare/v2.33.0...v2.34.0) (2026-04-27)
2
+
3
+ ### Features
4
+
5
+ - **thread:** opt-in unarchive of newly-created threads ([#196](https://github.com/Doist/twist-cli/issues/196)) ([1872225](https://github.com/Doist/twist-cli/commit/1872225d3ae23b0322c1ed6c6e08d088fb872580))
6
+
7
+ ## [2.33.0](https://github.com/Doist/twist-cli/compare/v2.32.2...v2.33.0) (2026-04-23)
8
+
9
+ ### Features
10
+
11
+ - **channel:** add channel threads listing with pagination ([#191](https://github.com/Doist/twist-cli/issues/191)) ([f17f09f](https://github.com/Doist/twist-cli/commit/f17f09fbfc3a11ee3bf641bc40a9e5702d3b311f))
12
+ - **config:** add `tw config view` to inspect the CLI config file ([#192](https://github.com/Doist/twist-cli/issues/192)) ([f7d0d9b](https://github.com/Doist/twist-cli/commit/f7d0d9bbc3fbee03825032d6c54f293429bee45f))
13
+
14
+ ### Bug Fixes
15
+
16
+ - **deps:** update dependency marked to v18.0.2 ([#189](https://github.com/Doist/twist-cli/issues/189)) ([f4caf89](https://github.com/Doist/twist-cli/commit/f4caf8978a12a547050a7649de2285d41330abe6))
17
+
1
18
  ## [2.32.2](https://github.com/Doist/twist-cli/compare/v2.32.1...v2.32.2) (2026-04-22)
2
19
 
3
20
  ### Bug Fixes
@@ -0,0 +1,3 @@
1
+ export declare function encodeCursor(offset: number): string;
2
+ export declare function decodeCursor(cursor: string | undefined): number;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/helpers.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB/D"}
@@ -0,0 +1,24 @@
1
+ import { CliError } from '../../lib/errors.js';
2
+ export function encodeCursor(offset) {
3
+ return Buffer.from(JSON.stringify({ offset })).toString('base64url');
4
+ }
5
+ export function decodeCursor(cursor) {
6
+ if (!cursor)
7
+ return 0;
8
+ let parsed;
9
+ try {
10
+ parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
11
+ }
12
+ catch {
13
+ throw new CliError('INVALID_CURSOR', `Invalid cursor: ${cursor}`);
14
+ }
15
+ if (!parsed ||
16
+ typeof parsed !== 'object' ||
17
+ typeof parsed.offset !== 'number' ||
18
+ !Number.isFinite(parsed.offset) ||
19
+ parsed.offset < 0) {
20
+ throw new CliError('INVALID_CURSOR', `Invalid cursor: ${cursor}`);
21
+ }
22
+ return parsed.offset;
23
+ }
24
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/channel/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA0B;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IAErB,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,IACI,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAQ,MAA+B,CAAC,MAAM,KAAK,QAAQ;QAC3D,CAAC,MAAM,CAAC,QAAQ,CAAE,MAA6B,CAAC,MAAM,CAAC;QACtD,MAA6B,CAAC,MAAM,GAAG,CAAC,EAC3C,CAAC;QACC,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,OAAQ,MAA6B,CAAC,MAAM,CAAA;AAChD,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { Command } from 'commander';
2
2
  export declare function registerChannelCommand(program: Command): void;
3
- //# sourceMappingURL=channel.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAK3C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF7D"}
@@ -0,0 +1,67 @@
1
+ import { Option } from 'commander';
2
+ import { withCaseInsensitiveChoices } from '../../lib/completion.js';
3
+ import { listChannels } from './list.js';
4
+ import { showChannelThreads } from './threads.js';
5
+ export function registerChannelCommand(program) {
6
+ const channel = program
7
+ .command('channel')
8
+ .alias('channels')
9
+ .description('Channel operations (list, threads)');
10
+ channel
11
+ .command('list [workspace-ref]', { isDefault: true })
12
+ .description('List joined channels or discoverable public channels in a workspace')
13
+ .option('--workspace <ref>', 'Workspace ID or name')
14
+ .option('--scope <scope>', 'Channel set to list: joined, public, or discoverable (default: joined)')
15
+ .option('--state <state>', 'Channel state to list: active, all, or archived (default: active)')
16
+ .option('--json', 'Output as JSON')
17
+ .option('--ndjson', 'Output as newline-delimited JSON')
18
+ .option('--full', 'Include all fields in JSON output')
19
+ .addHelpText('after', `
20
+ Examples:
21
+ tw channels
22
+ tw channels --state all
23
+ tw channels --scope discoverable
24
+ tw channels --scope public --state archived
25
+ tw channels --scope public --state all --json
26
+ tw channels --json
27
+ tw channels "My Workspace" --scope discoverable --json
28
+
29
+ Notes:
30
+ Defaults to active channels that you have joined.
31
+ joined Channels you have joined (private channels require --include-private-channels)
32
+ public Public channels visible in the workspace, whether joined or not
33
+ discoverable Public channels visible in the workspace that you have not joined
34
+ active Non-archived channels only
35
+ all Both active and archived channels
36
+ archived Archived channels only
37
+
38
+ Twist does not expose unjoined private channels, so public/discoverable scopes never include them.`)
39
+ .action(listChannels);
40
+ channel
41
+ .command('threads <channel-ref> [workspace-ref]')
42
+ .description('List threads in a channel with pagination and filtering')
43
+ .option('--workspace <ref>', 'Workspace ID or name')
44
+ .option('--unread', 'Only show unread threads')
45
+ .addOption(withCaseInsensitiveChoices(new Option('--archive-filter <filter>', 'Show active, archived, or all threads (default: active)'), ['active', 'archived', 'all']))
46
+ .option('--since <date>', 'Threads updated on/after this date (ISO format)')
47
+ .option('--until <date>', 'Threads updated before this date (ISO format)')
48
+ .option('--limit <n>', 'Max threads per page (default: 50)')
49
+ .option('--cursor <cursor>', 'Pagination cursor from a previous response')
50
+ .option('--json', 'Output as JSON')
51
+ .option('--ndjson', 'Output as newline-delimited JSON')
52
+ .option('--full', 'Include all fields in JSON output')
53
+ .addHelpText('after', `
54
+ Examples:
55
+ tw channel threads 12345
56
+ tw channel threads "general"
57
+ tw channel threads id:12345 --unread
58
+ tw channel threads 12345 --archive-filter all --since 2026-01-01
59
+ tw channel threads 12345 --limit 20 --json
60
+ tw channel threads 12345 --limit 20 --cursor <cursor-from-previous>
61
+
62
+ Notes:
63
+ Sorted newest-first by last activity. --limit, --cursor, --since, --until,
64
+ and --unread are applied client-side; --archive-filter is applied server-side.`)
65
+ .action(showChannelThreads);
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAG,OAAO;SAClB,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,UAAU,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC,CAAA;IAEtD,OAAO;SACF,OAAO,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpD,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CACH,iBAAiB,EACjB,wEAAwE,CAC3E;SACA,MAAM,CACH,iBAAiB,EACjB,mEAAmE,CACtE;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;;;;;;;;;qGAmByF,CAC5F;SACA,MAAM,CAAC,YAAY,CAAC,CAAA;IAEzB,OAAO;SACF,OAAO,CAAC,uCAAuC,CAAC;SAChD,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,SAAS,CACN,0BAA0B,CACtB,IAAI,MAAM,CACN,2BAA2B,EAC3B,yDAAyD,CAC5D,EACD,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAChC,CACJ;SACA,MAAM,CAAC,gBAAgB,EAAE,iDAAiD,CAAC;SAC3E,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;iFAWqE,CACxE;SACA,MAAM,CAAC,kBAAkB,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ViewOptions } from '../../lib/options.js';
2
+ export type ListChannelsOptions = ViewOptions & {
3
+ workspace?: string;
4
+ scope?: string;
5
+ state?: string;
6
+ };
7
+ export declare function listChannels(workspaceRef: string | undefined, options: ListChannelsOptions): Promise<void>;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/list.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAWvD,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAkID,wBAAsB,YAAY,CAC9B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyDf"}
@@ -1,8 +1,8 @@
1
- import { getCurrentWorkspaceId, getTwistClient } from '../lib/api.js';
2
- import { CliError } from '../lib/errors.js';
3
- import { includePrivateChannels } from '../lib/global-args.js';
4
- import { colors, formatJson, formatNdjson } from '../lib/output.js';
5
- import { resolveWorkspaceRef } from '../lib/refs.js';
1
+ import { getCurrentWorkspaceId, getTwistClient } from '../../lib/api.js';
2
+ import { CliError } from '../../lib/errors.js';
3
+ import { includePrivateChannels } from '../../lib/global-args.js';
4
+ import { colors, formatJson, formatNdjson } from '../../lib/output.js';
5
+ import { resolveWorkspaceRef } from '../../lib/refs.js';
6
6
  const CHANNEL_SCOPES = ['joined', 'public', 'discoverable'];
7
7
  const CHANNEL_STATES = ['active', 'all', 'archived'];
8
8
  function parseChannelScope(scope) {
@@ -94,7 +94,7 @@ function formatChannelLine(channel, scope) {
94
94
  : '';
95
95
  return `${id} ${name}${visibility}${membership}${archived}`;
96
96
  }
97
- async function listChannels(workspaceRef, options) {
97
+ export async function listChannels(workspaceRef, options) {
98
98
  const scope = parseChannelScope(options.scope);
99
99
  const state = parseChannelState(options.state);
100
100
  const workspaceId = await getWorkspaceId(workspaceRef, options);
@@ -146,36 +146,4 @@ async function listChannels(workspaceRef, options) {
146
146
  console.log(formatChannelLine(channel, scope));
147
147
  }
148
148
  }
149
- export function registerChannelCommand(program) {
150
- program
151
- .command('channels [workspace-ref]')
152
- .description('List joined channels or discoverable public channels in a workspace')
153
- .option('--workspace <ref>', 'Workspace ID or name')
154
- .option('--scope <scope>', 'Channel set to list: joined, public, or discoverable (default: joined)')
155
- .option('--state <state>', 'Channel state to list: active, all, or archived (default: active)')
156
- .option('--json', 'Output as JSON')
157
- .option('--ndjson', 'Output as newline-delimited JSON')
158
- .option('--full', 'Include all fields in JSON output')
159
- .addHelpText('after', `
160
- Examples:
161
- tw channels
162
- tw channels --state all
163
- tw channels --scope discoverable
164
- tw channels --scope public --state archived
165
- tw channels --scope public --state all --json
166
- tw channels --json
167
- tw channels "My Workspace" --scope discoverable --json
168
-
169
- Notes:
170
- Defaults to active channels that you have joined.
171
- joined Channels you have joined (private channels require --include-private-channels)
172
- public Public channels visible in the workspace, whether joined or not
173
- discoverable Public channels visible in the workspace that you have not joined
174
- active Non-archived channels only
175
- all Both active and archived channels
176
- archived Archived channels only
177
-
178
- Twist does not expose unjoined private channels, so public/discoverable scopes never include them.`)
179
- .action(listChannels);
180
- }
181
- //# sourceMappingURL=channel.js.map
149
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/channel/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ArchiveFilter } from '@doist/twist-sdk';
2
+ import type { PaginatedViewOptions } from '../../lib/options.js';
3
+ type ChannelThreadsOptions = PaginatedViewOptions & {
4
+ workspace?: string;
5
+ unread?: boolean;
6
+ archiveFilter?: ArchiveFilter;
7
+ cursor?: string;
8
+ };
9
+ export declare function showChannelThreads(channelRef: string, workspaceRef: string | undefined, options: ChannelThreadsOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,kBAAkB,CAAA;AAM7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAWhE,KAAK,qBAAqB,GAAG,oBAAoB,GAAG;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AA0BD,wBAAsB,kBAAkB,CACpC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,qBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAgGf"}
@@ -0,0 +1,97 @@
1
+ import chalk from 'chalk';
2
+ import { getCurrentWorkspaceId, getTwistClient } from '../../lib/api.js';
3
+ import { formatRelativeDate } from '../../lib/dates.js';
4
+ import { CliError } from '../../lib/errors.js';
5
+ import { isAccessible } from '../../lib/global-args.js';
6
+ import { colors, formatPaginatedJson, formatPaginatedNdjson, } from '../../lib/output.js';
7
+ import { assertChannelIsPublic } from '../../lib/public-channels.js';
8
+ import { resolveChannelRef, resolveWorkspaceRef } from '../../lib/refs.js';
9
+ import { decodeCursor, encodeCursor } from './helpers.js';
10
+ function archiveFilterToFlag(filter) {
11
+ switch (filter ?? 'active') {
12
+ case 'active':
13
+ return false;
14
+ case 'archived':
15
+ return true;
16
+ case 'all':
17
+ return undefined;
18
+ }
19
+ }
20
+ function parseDateFilter(value, flag) {
21
+ const ts = new Date(value).getTime();
22
+ if (Number.isNaN(ts)) {
23
+ throw new CliError('INVALID_DATE', `Invalid ${flag} value: "${value}". Use an ISO-8601 date (e.g. 2026-01-15 or 2026-01-15T09:00:00Z).`);
24
+ }
25
+ return ts;
26
+ }
27
+ export async function showChannelThreads(channelRef, workspaceRef, options) {
28
+ if (workspaceRef && options.workspace) {
29
+ throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
30
+ }
31
+ const sinceTs = options.since ? parseDateFilter(options.since, '--since') : undefined;
32
+ const untilTs = options.until ? parseDateFilter(options.until, '--until') : undefined;
33
+ let workspaceId;
34
+ const ref = workspaceRef || options.workspace;
35
+ if (ref) {
36
+ const workspace = await resolveWorkspaceRef(ref);
37
+ workspaceId = workspace.id;
38
+ }
39
+ else {
40
+ workspaceId = await getCurrentWorkspaceId();
41
+ }
42
+ const channel = await resolveChannelRef(channelRef, workspaceId);
43
+ await assertChannelIsPublic(channel.id, workspaceId);
44
+ const archived = archiveFilterToFlag(options.archiveFilter);
45
+ const client = await getTwistClient();
46
+ const [threadsResp, unreadResp] = await client.batch(client.threads.getThreads(archived === undefined
47
+ ? { workspaceId, channelId: channel.id }
48
+ : { workspaceId, channelId: channel.id, archived }, { batch: true }), client.threads.getUnread(workspaceId, { batch: true }));
49
+ const unreadThreadIds = new Set(unreadResp.data.map((u) => u.threadId));
50
+ let threads = threadsResp.data.map((t) => ({
51
+ ...t,
52
+ isUnread: unreadThreadIds.has(t.id),
53
+ }));
54
+ if (options.unread) {
55
+ threads = threads.filter((t) => t.isUnread);
56
+ }
57
+ if (sinceTs !== undefined) {
58
+ threads = threads.filter((t) => new Date(t.lastUpdated).getTime() >= sinceTs);
59
+ }
60
+ if (untilTs !== undefined) {
61
+ threads = threads.filter((t) => new Date(t.lastUpdated).getTime() < untilTs);
62
+ }
63
+ threads.sort((a, b) => new Date(b.lastUpdated).getTime() - new Date(a.lastUpdated).getTime());
64
+ const limitNum = options.limit ? parseInt(options.limit, 10) : 50;
65
+ const limit = Number.isFinite(limitNum) && limitNum > 0 ? limitNum : 50;
66
+ const offset = decodeCursor(options.cursor);
67
+ const page = threads.slice(offset, offset + limit);
68
+ const nextCursor = offset + limit < threads.length ? encodeCursor(offset + limit) : null;
69
+ const paginated = { results: page, nextCursor };
70
+ if (options.json) {
71
+ console.log(formatPaginatedJson(paginated, 'thread', options.full));
72
+ return;
73
+ }
74
+ if (options.ndjson) {
75
+ console.log(formatPaginatedNdjson(paginated, 'thread', options.full));
76
+ return;
77
+ }
78
+ if (page.length === 0) {
79
+ console.log(`No threads in #${channel.name}.`);
80
+ return;
81
+ }
82
+ console.log(chalk.bold.blue(`[${channel.name}]`));
83
+ console.log('');
84
+ for (const thread of page) {
85
+ const title = thread.isUnread ? chalk.bold(thread.title) : thread.title;
86
+ const time = colors.timestamp(formatRelativeDate(thread.lastUpdated));
87
+ const unreadBadge = thread.isUnread ? chalk.blue(isAccessible() ? ' (unread)' : ' *') : '';
88
+ console.log(` ${title}${unreadBadge}`);
89
+ console.log(` ${time} ${colors.timestamp(`id:${thread.id}`)}`);
90
+ console.log(` ${colors.url(thread.url)}`);
91
+ console.log('');
92
+ }
93
+ if (nextCursor) {
94
+ console.log(colors.timestamp(`More threads available. Use --cursor ${nextCursor}`));
95
+ }
96
+ }
97
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC5D"}
@@ -0,0 +1,29 @@
1
+ import { listSettableKeys, setConfigValue } from './set.js';
2
+ import { viewConfig } from './view.js';
3
+ export function registerConfigCommand(program) {
4
+ const config = program.command('config').description('Manage CLI configuration');
5
+ config
6
+ .command('view', { isDefault: true })
7
+ .description('Show the current CLI configuration file')
8
+ .option('--json', 'Output the raw config as JSON')
9
+ .option('--show-token', 'Include the full token instead of masking it')
10
+ .action(viewConfig);
11
+ config
12
+ .command('set <key> <value>')
13
+ .description('Set a user preference in the config file')
14
+ .addHelpText('after', `
15
+ Settable keys:
16
+ ${listSettableKeys()}
17
+
18
+ Examples:
19
+ $ tw config set unarchive-new-threads true
20
+ $ tw config set unarchive-new-threads false`)
21
+ .action(setConfigValue);
22
+ config.addHelpText('after', `
23
+ Examples:
24
+ $ tw config view # pretty-printed, token masked
25
+ $ tw config view --json # raw JSON, token masked
26
+ $ tw config view --show-token # include the full token
27
+ $ tw config set unarchive-new-threads true # change a user preference`);
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAA;IAEhF,MAAM;SACD,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC;SACjD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACtE,MAAM,CAAC,UAAU,CAAC,CAAA;IAEvB,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,0CAA0C,CAAC;SACvD,WAAW,CACR,OAAO,EACP;;EAEV,gBAAgB,EAAE;;;;8CAI0B,CACrC;SACA,MAAM,CAAC,cAAc,CAAC,CAAA;IAE3B,MAAM,CAAC,WAAW,CACd,OAAO,EACP;;;;;2EAKmE,CACtE,CAAA;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function setConfigValue(key: string, value: string): Promise<void>;
2
+ export declare function listSettableKeys(): string;
3
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AA8BA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
@@ -0,0 +1,41 @@
1
+ import chalk from 'chalk';
2
+ import { readConfigStrict, setConfig } from '../../lib/config.js';
3
+ import { CliError } from '../../lib/errors.js';
4
+ const TRUE_VALUES = new Set(['true', 'on', '1', 'yes']);
5
+ const FALSE_VALUES = new Set(['false', 'off', '0', 'no']);
6
+ function parseBoolean(raw, key) {
7
+ const normalized = raw.trim().toLowerCase();
8
+ if (TRUE_VALUES.has(normalized))
9
+ return true;
10
+ if (FALSE_VALUES.has(normalized))
11
+ return false;
12
+ throw new CliError('INVALID_VALUE', `Invalid boolean value "${raw}" for ${key}. Use one of: true, false, on, off, 1, 0.`);
13
+ }
14
+ const SETTERS = {
15
+ 'unarchive-new-threads': {
16
+ description: 'Unarchive newly-created threads so they appear in your Inbox',
17
+ apply: (config, value) => {
18
+ const parsed = parseBoolean(value, 'unarchive-new-threads');
19
+ config.userSettings = { ...config.userSettings, unarchiveNewThreads: parsed };
20
+ return `userSettings.unarchiveNewThreads = ${parsed}`;
21
+ },
22
+ },
23
+ };
24
+ export async function setConfigValue(key, value) {
25
+ const setter = SETTERS[key];
26
+ if (!setter) {
27
+ const known = Object.keys(SETTERS).join(', ');
28
+ throw new CliError('UNKNOWN_KEY', `Unknown config key "${key}". Known keys: ${known}.`);
29
+ }
30
+ const read = await readConfigStrict();
31
+ const config = read.state === 'present' ? read.config : {};
32
+ const summary = setter.apply(config, value);
33
+ await setConfig(config);
34
+ console.log(chalk.green('✓'), `Set ${chalk.cyan(summary)}`);
35
+ }
36
+ export function listSettableKeys() {
37
+ return Object.entries(SETTERS)
38
+ .map(([key, { description }]) => ` ${key.padEnd(28)} ${description}`)
39
+ .join('\n');
40
+ }
41
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAe,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;AAEzD,SAAS,YAAY,CAAC,GAAW,EAAE,GAAW;IAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,IAAI,QAAQ,CACd,eAAe,EACf,0BAA0B,GAAG,SAAS,GAAG,2CAA2C,CACvF,CAAA;AACL,CAAC;AAID,MAAM,OAAO,GAA2D;IACpE,uBAAuB,EAAE;QACrB,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAA;YAC3D,MAAM,CAAC,YAAY,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAA;YAC7E,OAAO,sCAAsC,MAAM,EAAE,CAAA;QACzD,CAAC;KACJ;CACJ,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,uBAAuB,GAAG,kBAAkB,KAAK,GAAG,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACrC,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ViewConfigOptions {
2
+ json?: boolean;
3
+ showToken?: boolean;
4
+ }
5
+ export declare function viewConfig(options: ViewConfigOptions): Promise<void>;
6
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/commands/config/view.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB;AA0GD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB1E"}
@@ -0,0 +1,108 @@
1
+ import chalk from 'chalk';
2
+ import { NoTokenError, probeApiToken, TOKEN_ENV_VAR, } from '../../lib/auth.js';
3
+ import { CONFIG_PATH, readConfigStrict } from '../../lib/config.js';
4
+ import { SECURE_STORE_DESCRIPTION, SecureStoreUnavailableError } from '../../lib/secure-store.js';
5
+ function maskToken(token) {
6
+ if (token.length < 5)
7
+ return '****';
8
+ return `****…${token.slice(-4)}`;
9
+ }
10
+ function describeTokenSource(source) {
11
+ switch (source) {
12
+ case 'env':
13
+ return `environment variable ${TOKEN_ENV_VAR}`;
14
+ case 'secure-store':
15
+ return SECURE_STORE_DESCRIPTION;
16
+ case 'config-file':
17
+ return 'config file (plaintext fallback)';
18
+ }
19
+ }
20
+ async function probeTokenPresence() {
21
+ try {
22
+ const { token, metadata } = await probeApiToken();
23
+ return { state: 'present', token, metadata };
24
+ }
25
+ catch (error) {
26
+ if (error instanceof NoTokenError)
27
+ return { state: 'missing' };
28
+ if (error instanceof SecureStoreUnavailableError) {
29
+ return {
30
+ state: 'unavailable',
31
+ reason: `${SECURE_STORE_DESCRIPTION} unavailable (${error.message})`,
32
+ };
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ function formatValue(value) {
38
+ if (value === undefined || value === null)
39
+ return chalk.dim('not set');
40
+ if (typeof value === 'boolean')
41
+ return value ? 'true' : 'false';
42
+ return String(value);
43
+ }
44
+ function renderTokenLine(token, showToken) {
45
+ switch (token.state) {
46
+ case 'present': {
47
+ const value = showToken ? token.token : maskToken(token.token);
48
+ return `${value} ${chalk.dim(`(${describeTokenSource(token.metadata.source)})`)}`;
49
+ }
50
+ case 'unavailable':
51
+ return chalk.dim(`unknown — ${token.reason}`);
52
+ case 'missing':
53
+ return formatValue(undefined);
54
+ }
55
+ }
56
+ function formatConfigView(config, token, showToken, configMissing) {
57
+ const lines = [];
58
+ const headerSuffix = configMissing ? ` ${chalk.dim('(not created yet)')}` : '';
59
+ lines.push(`${chalk.dim('Config file:')} ${CONFIG_PATH}${headerSuffix}`);
60
+ lines.push('');
61
+ // When a token is present, its metadata is the ground truth for the active
62
+ // mode/scope — this matters most for env-sourced tokens, whose scope the CLI
63
+ // does not know and where config.auth* may be stale from an unrelated
64
+ // `tw auth login`. For missing/unavailable tokens, fall back to the config
65
+ // file values (what the CLI would attempt once auth recovers).
66
+ const effectiveMode = token.state === 'present' ? token.metadata.authMode : config.authMode;
67
+ const effectiveScope = token.state === 'present' ? token.metadata.authScope : config.authScope;
68
+ // When the mode is 'unknown' and no scope is recorded, the scope is
69
+ // genuinely unintrospectable (env-sourced tokens, or tokens saved via
70
+ // `tw auth token` without metadata). Render 'unknown' rather than
71
+ // 'not set' to avoid reading as an explicit empty scope.
72
+ const scopeDisplay = effectiveMode === 'unknown' && effectiveScope === undefined
73
+ ? 'unknown'
74
+ : formatValue(effectiveScope);
75
+ lines.push(chalk.bold('Authentication'));
76
+ lines.push(` Token: ${renderTokenLine(token, showToken)}`);
77
+ lines.push(` Mode: ${formatValue(effectiveMode)}`);
78
+ lines.push(` Scope: ${scopeDisplay}`);
79
+ lines.push('');
80
+ lines.push(chalk.bold('Workspace'));
81
+ lines.push(` Current: ${formatValue(config.currentWorkspace)}`);
82
+ lines.push('');
83
+ lines.push(chalk.bold('Updates'));
84
+ lines.push(` Channel: ${formatValue(config.updateChannel)}`);
85
+ lines.push('');
86
+ lines.push(chalk.bold('User settings'));
87
+ lines.push(` Unarchive new threads: ${formatValue(config.userSettings?.unarchiveNewThreads)}`);
88
+ return lines.join('\n');
89
+ }
90
+ export async function viewConfig(options) {
91
+ const read = await readConfigStrict();
92
+ const config = read.state === 'present' ? read.config : {};
93
+ if (options.json) {
94
+ const output = { ...config };
95
+ if (output.token && !options.showToken) {
96
+ output.token = maskToken(output.token);
97
+ }
98
+ console.log(JSON.stringify(output, null, 2));
99
+ return;
100
+ }
101
+ const token = await probeTokenPresence();
102
+ if (read.state === 'missing' && token.state === 'missing') {
103
+ console.log(`${chalk.dim('Config file:')} ${CONFIG_PATH} ${chalk.dim('(not created yet)')}`);
104
+ return;
105
+ }
106
+ console.log(formatConfigView(config, token, options.showToken ?? false, read.state === 'missing'));
107
+ }
108
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/commands/config/view.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { MutationOptions } from '../../lib/options.js';
2
2
  type CreateOptions = MutationOptions & {
3
3
  notify?: string;
4
+ unarchive?: boolean;
4
5
  };
5
6
  export declare function createThread(channelRef: string, title: string, content: string | undefined, options: CreateOptions): Promise<void>;
6
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/thread/create.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAM3D,KAAK,aAAa,GAAG,eAAe,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,YAAY,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CA8Df"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/thread/create.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAM3D,KAAK,aAAa,GAAG,eAAe,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,wBAAsB,YAAY,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}