@doist/twist-cli 1.0.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 (110) hide show
  1. package/README.md +76 -0
  2. package/dist/__tests__/auth.test.d.ts +2 -0
  3. package/dist/__tests__/auth.test.d.ts.map +1 -0
  4. package/dist/__tests__/auth.test.js +300 -0
  5. package/dist/__tests__/auth.test.js.map +1 -0
  6. package/dist/__tests__/lib/dates.test.d.ts +2 -0
  7. package/dist/__tests__/lib/dates.test.d.ts.map +1 -0
  8. package/dist/__tests__/lib/dates.test.js +58 -0
  9. package/dist/__tests__/lib/dates.test.js.map +1 -0
  10. package/dist/__tests__/lib/refs.test.d.ts +2 -0
  11. package/dist/__tests__/lib/refs.test.d.ts.map +1 -0
  12. package/dist/__tests__/lib/refs.test.js +121 -0
  13. package/dist/__tests__/lib/refs.test.js.map +1 -0
  14. package/dist/__tests__/spinner.test.d.ts +2 -0
  15. package/dist/__tests__/spinner.test.d.ts.map +1 -0
  16. package/dist/__tests__/spinner.test.js +153 -0
  17. package/dist/__tests__/spinner.test.js.map +1 -0
  18. package/dist/commands/auth.d.ts +3 -0
  19. package/dist/commands/auth.d.ts.map +1 -0
  20. package/dist/commands/auth.js +93 -0
  21. package/dist/commands/auth.js.map +1 -0
  22. package/dist/commands/channel.d.ts +3 -0
  23. package/dist/commands/channel.d.ts.map +1 -0
  24. package/dist/commands/channel.js +49 -0
  25. package/dist/commands/channel.js.map +1 -0
  26. package/dist/commands/inbox.d.ts +3 -0
  27. package/dist/commands/inbox.d.ts.map +1 -0
  28. package/dist/commands/inbox.js +121 -0
  29. package/dist/commands/inbox.js.map +1 -0
  30. package/dist/commands/msg.d.ts +3 -0
  31. package/dist/commands/msg.d.ts.map +1 -0
  32. package/dist/commands/msg.js +205 -0
  33. package/dist/commands/msg.js.map +1 -0
  34. package/dist/commands/react.d.ts +3 -0
  35. package/dist/commands/react.d.ts.map +1 -0
  36. package/dist/commands/react.js +100 -0
  37. package/dist/commands/react.js.map +1 -0
  38. package/dist/commands/search.d.ts +3 -0
  39. package/dist/commands/search.d.ts.map +1 -0
  40. package/dist/commands/search.js +134 -0
  41. package/dist/commands/search.js.map +1 -0
  42. package/dist/commands/thread.d.ts +3 -0
  43. package/dist/commands/thread.d.ts.map +1 -0
  44. package/dist/commands/thread.js +219 -0
  45. package/dist/commands/thread.js.map +1 -0
  46. package/dist/commands/user.d.ts +3 -0
  47. package/dist/commands/user.d.ts.map +1 -0
  48. package/dist/commands/user.js +67 -0
  49. package/dist/commands/user.js.map +1 -0
  50. package/dist/commands/workspace.d.ts +3 -0
  51. package/dist/commands/workspace.d.ts.map +1 -0
  52. package/dist/commands/workspace.js +48 -0
  53. package/dist/commands/workspace.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +36 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib/api.d.ts +10 -0
  59. package/dist/lib/api.d.ts.map +1 -0
  60. package/dist/lib/api.js +143 -0
  61. package/dist/lib/api.js.map +1 -0
  62. package/dist/lib/auth.d.ts +4 -0
  63. package/dist/lib/auth.d.ts.map +1 -0
  64. package/dist/lib/auth.js +40 -0
  65. package/dist/lib/auth.js.map +1 -0
  66. package/dist/lib/config.d.ts +9 -0
  67. package/dist/lib/config.d.ts.map +1 -0
  68. package/dist/lib/config.js +26 -0
  69. package/dist/lib/config.js.map +1 -0
  70. package/dist/lib/dates.d.ts +3 -0
  71. package/dist/lib/dates.d.ts.map +1 -0
  72. package/dist/lib/dates.js +44 -0
  73. package/dist/lib/dates.js.map +1 -0
  74. package/dist/lib/input.d.ts +3 -0
  75. package/dist/lib/input.d.ts.map +1 -0
  76. package/dist/lib/input.js +52 -0
  77. package/dist/lib/input.js.map +1 -0
  78. package/dist/lib/markdown.d.ts +2 -0
  79. package/dist/lib/markdown.d.ts.map +1 -0
  80. package/dist/lib/markdown.js +12 -0
  81. package/dist/lib/markdown.js.map +1 -0
  82. package/dist/lib/oauth-server.d.ts +13 -0
  83. package/dist/lib/oauth-server.d.ts.map +1 -0
  84. package/dist/lib/oauth-server.js +168 -0
  85. package/dist/lib/oauth-server.js.map +1 -0
  86. package/dist/lib/oauth.d.ts +28 -0
  87. package/dist/lib/oauth.d.ts.map +1 -0
  88. package/dist/lib/oauth.js +125 -0
  89. package/dist/lib/oauth.js.map +1 -0
  90. package/dist/lib/output.d.ts +22 -0
  91. package/dist/lib/output.d.ts.map +1 -0
  92. package/dist/lib/output.js +104 -0
  93. package/dist/lib/output.js.map +1 -0
  94. package/dist/lib/pkce.d.ts +16 -0
  95. package/dist/lib/pkce.d.ts.map +1 -0
  96. package/dist/lib/pkce.js +35 -0
  97. package/dist/lib/pkce.js.map +1 -0
  98. package/dist/lib/refs.d.ts +29 -0
  99. package/dist/lib/refs.d.ts.map +1 -0
  100. package/dist/lib/refs.js +168 -0
  101. package/dist/lib/refs.js.map +1 -0
  102. package/dist/lib/search-api.d.ts +25 -0
  103. package/dist/lib/search-api.d.ts.map +1 -0
  104. package/dist/lib/search-api.js +85 -0
  105. package/dist/lib/search-api.js.map +1 -0
  106. package/dist/lib/spinner.d.ts +20 -0
  107. package/dist/lib/spinner.d.ts.map +1 -0
  108. package/dist/lib/spinner.js +70 -0
  109. package/dist/lib/spinner.js.map +1 -0
  110. package/package.json +71 -0
@@ -0,0 +1,219 @@
1
+ import { getFullTwistURL } from '@doist/twist-sdk';
2
+ import chalk from 'chalk';
3
+ import { getTwistClient } from '../lib/api.js';
4
+ import { formatRelativeDate } from '../lib/dates.js';
5
+ import { openEditor, readStdin } from '../lib/input.js';
6
+ import { renderMarkdown } from '../lib/markdown.js';
7
+ import { colors, formatJson } from '../lib/output.js';
8
+ import { resolveThreadId } from '../lib/refs.js';
9
+ function printSeparator(label) {
10
+ const totalWidth = 60;
11
+ const labelWithPadding = ` ${label} `;
12
+ const remainingWidth = totalWidth - labelWithPadding.length;
13
+ const leftWidth = Math.floor(remainingWidth / 2);
14
+ const rightWidth = remainingWidth - leftWidth;
15
+ const line = chalk.dim('─'.repeat(leftWidth) + labelWithPadding + '─'.repeat(rightWidth));
16
+ console.log('');
17
+ console.log(line);
18
+ console.log('');
19
+ }
20
+ function pluralize(count, singular) {
21
+ return count === 1 ? singular : `${singular}s`;
22
+ }
23
+ function printComment(comment, userMap, raw) {
24
+ const author = colors.author(userMap.get(comment.creator) || `user:${comment.creator}`);
25
+ const time = colors.timestamp(formatRelativeDate(comment.posted));
26
+ console.log(`${author} ${time} ${colors.timestamp(`id:${comment.id}`)}`);
27
+ console.log(raw ? comment.content : renderMarkdown(comment.content));
28
+ console.log('');
29
+ }
30
+ async function viewThread(ref, options) {
31
+ const threadId = resolveThreadId(ref);
32
+ const client = await getTwistClient();
33
+ const limit = options.limit ? parseInt(options.limit, 10) : 50;
34
+ const [threadResponse, commentsResponse] = await client.batch(client.threads.getThread(threadId, { batch: true }), client.comments.getComments({
35
+ threadId,
36
+ from: options.since ? new Date(options.since) : undefined,
37
+ limit,
38
+ }, { batch: true }));
39
+ const thread = threadResponse.data;
40
+ const comments = commentsResponse.data;
41
+ let lastReadObjIndex = null;
42
+ if (options.unread) {
43
+ const unreadData = await client.threads.getUnread(thread.workspaceId);
44
+ const threadUnread = unreadData.find((u) => u.threadId === threadId);
45
+ if (!threadUnread) {
46
+ console.log('No unread comments in this thread.');
47
+ return;
48
+ }
49
+ lastReadObjIndex = threadUnread.objIndex;
50
+ }
51
+ const userIds = new Set([thread.creator, ...comments.map((c) => c.creator)]);
52
+ const userCalls = [...userIds].map((id) => client.workspaceUsers.getUserById({ workspaceId: thread.workspaceId, userId: id }, { batch: true }));
53
+ const [channelResponse, ...userResponses] = await client.batch(client.channels.getChannel(thread.channelId, { batch: true }), ...userCalls);
54
+ const channel = channelResponse.data;
55
+ const userMap = new Map(userResponses.map((r) => [r.data.id, r.data.name]));
56
+ if (options.json) {
57
+ const output = {
58
+ thread: {
59
+ ...thread,
60
+ channelName: channel.name,
61
+ creatorName: userMap.get(thread.creator),
62
+ url: getFullTwistURL({
63
+ workspaceId: thread.workspaceId,
64
+ channelId: thread.channelId,
65
+ threadId: thread.id,
66
+ }),
67
+ },
68
+ comments: comments.map((c) => ({
69
+ ...c,
70
+ creatorName: userMap.get(c.creator),
71
+ url: getFullTwistURL({
72
+ workspaceId: thread.workspaceId,
73
+ channelId: thread.channelId,
74
+ threadId: thread.id,
75
+ commentId: c.id,
76
+ }),
77
+ })),
78
+ };
79
+ console.log(formatJson(output, undefined, options.full));
80
+ return;
81
+ }
82
+ if (options.ndjson) {
83
+ const threadOutput = {
84
+ type: 'thread',
85
+ ...thread,
86
+ channelName: channel.name,
87
+ creatorName: userMap.get(thread.creator),
88
+ };
89
+ console.log(JSON.stringify(threadOutput));
90
+ for (const c of comments) {
91
+ console.log(JSON.stringify({ type: 'comment', ...c, creatorName: userMap.get(c.creator) }));
92
+ }
93
+ return;
94
+ }
95
+ console.log(chalk.bold(thread.title));
96
+ console.log(colors.channel(`[${channel.name}]`));
97
+ console.log('');
98
+ if (options.unread && lastReadObjIndex !== null) {
99
+ const contextSize = options.context ? parseInt(options.context, 10) : 0;
100
+ const unreadComments = comments.filter((c) => (c.objIndex ?? 0) > lastReadObjIndex);
101
+ const contextComments = comments
102
+ .filter((c) => (c.objIndex ?? 0) <= lastReadObjIndex)
103
+ .sort((a, b) => (b.objIndex ?? 0) - (a.objIndex ?? 0))
104
+ .slice(0, contextSize)
105
+ .reverse();
106
+ if (unreadComments.length === 0) {
107
+ console.log('No unread comments.');
108
+ return;
109
+ }
110
+ const creatorName = userMap.get(thread.creator) || `user:${thread.creator}`;
111
+ console.log(`${colors.author(creatorName)} ${colors.timestamp(formatRelativeDate(thread.posted))} ${chalk.dim('(original post)')}`);
112
+ console.log('');
113
+ console.log(options.raw ? thread.content : renderMarkdown(thread.content));
114
+ if (contextComments.length > 0) {
115
+ const firstContextIndex = contextComments[0].objIndex ?? 0;
116
+ const skippedCount = firstContextIndex - 1;
117
+ if (skippedCount > 0) {
118
+ printSeparator(`${skippedCount} ${pluralize(skippedCount, 'comment')} skipped`);
119
+ }
120
+ else {
121
+ console.log('');
122
+ }
123
+ for (const comment of contextComments) {
124
+ printComment(comment, userMap, options.raw ?? false);
125
+ }
126
+ }
127
+ else if (lastReadObjIndex > 0) {
128
+ printSeparator(`${lastReadObjIndex} ${pluralize(lastReadObjIndex, 'comment')} skipped`);
129
+ }
130
+ printSeparator(`UNREAD (${unreadComments.length} new)`);
131
+ for (const comment of unreadComments) {
132
+ printComment(comment, userMap, options.raw ?? false);
133
+ }
134
+ }
135
+ else {
136
+ const creatorName = userMap.get(thread.creator) || `user:${thread.creator}`;
137
+ console.log(`${colors.author(creatorName)} ${colors.timestamp(formatRelativeDate(thread.posted))}`);
138
+ console.log('');
139
+ console.log(options.raw ? thread.content : renderMarkdown(thread.content));
140
+ console.log('');
141
+ if (comments.length > 0) {
142
+ console.log(chalk.dim(`--- ${comments.length} ${pluralize(comments.length, 'comment')} ---`));
143
+ console.log('');
144
+ for (const comment of comments) {
145
+ printComment(comment, userMap, options.raw ?? false);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ async function replyToThread(ref, content, options) {
151
+ const threadId = resolveThreadId(ref);
152
+ let replyContent = await readStdin();
153
+ if (!replyContent && content) {
154
+ replyContent = content;
155
+ }
156
+ if (!replyContent) {
157
+ replyContent = await openEditor();
158
+ }
159
+ if (!replyContent || replyContent.trim() === '') {
160
+ console.error('No content provided.');
161
+ process.exit(1);
162
+ }
163
+ if (options.dryRun) {
164
+ console.log('Dry run: would post comment to thread', threadId);
165
+ console.log('');
166
+ console.log(replyContent);
167
+ return;
168
+ }
169
+ const client = await getTwistClient();
170
+ const thread = await client.threads.getThread(threadId);
171
+ const comment = await client.comments.createComment({
172
+ threadId,
173
+ content: replyContent,
174
+ });
175
+ const url = getFullTwistURL({
176
+ workspaceId: thread.workspaceId,
177
+ channelId: thread.channelId,
178
+ threadId,
179
+ commentId: comment.id,
180
+ });
181
+ console.log(`Comment posted: ${url}`);
182
+ }
183
+ async function markThreadDone(ref, options) {
184
+ const threadId = resolveThreadId(ref);
185
+ if (options.dryRun) {
186
+ console.log(`Dry run: would archive thread ${threadId}`);
187
+ return;
188
+ }
189
+ const client = await getTwistClient();
190
+ await client.inbox.archiveThread(threadId);
191
+ console.log(`Thread ${threadId} archived.`);
192
+ }
193
+ export function registerThreadCommand(program) {
194
+ const thread = program.command('thread').description('Thread operations');
195
+ thread
196
+ .command('view <thread-ref>')
197
+ .description('Display a thread with its comments')
198
+ .option('--unread', 'Show only unread comments (with original post for context)')
199
+ .option('--context <n>', 'Include N read comments before unread (use with --unread)')
200
+ .option('--limit <n>', 'Max comments to show (default: 50)')
201
+ .option('--since <date>', 'Comments newer than')
202
+ .option('--until <date>', 'Comments older than')
203
+ .option('--raw', 'Show raw markdown instead of rendered')
204
+ .option('--json', 'Output as JSON')
205
+ .option('--ndjson', 'Output as newline-delimited JSON')
206
+ .option('--full', 'Include all fields in JSON output')
207
+ .action(viewThread);
208
+ thread
209
+ .command('reply <thread-ref> [content]')
210
+ .description('Post a comment to a thread')
211
+ .option('--dry-run', 'Show what would be posted without posting')
212
+ .action(replyToThread);
213
+ thread
214
+ .command('done <thread-ref>')
215
+ .description('Archive a thread (mark as done)')
216
+ .option('--dry-run', 'Show what would happen without executing')
217
+ .action(markThreadDone);
218
+ }
219
+ //# sourceMappingURL=thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/commands/thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUserCommand(program: Command): void;
3
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyEnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY1D"}
@@ -0,0 +1,67 @@
1
+ import chalk from 'chalk';
2
+ import { getCurrentWorkspaceId, getSessionUser, getWorkspaceUsers } from '../lib/api.js';
3
+ import { colors, formatJson, formatNdjson } from '../lib/output.js';
4
+ import { resolveWorkspaceRef } from '../lib/refs.js';
5
+ async function showCurrentUser() {
6
+ const user = await getSessionUser();
7
+ console.log(chalk.bold(user.name));
8
+ console.log('');
9
+ console.log(`ID: ${user.id}`);
10
+ console.log(`Email: ${user.email}`);
11
+ console.log(`Timezone: ${user.timezone}`);
12
+ if (user.defaultWorkspace) {
13
+ console.log(`Default: workspace id:${user.defaultWorkspace}`);
14
+ }
15
+ }
16
+ async function listUsers(workspaceRef, options) {
17
+ let workspaceId;
18
+ if (workspaceRef) {
19
+ const workspace = await resolveWorkspaceRef(workspaceRef);
20
+ workspaceId = workspace.id;
21
+ }
22
+ else if (options.workspace) {
23
+ const workspace = await resolveWorkspaceRef(options.workspace);
24
+ workspaceId = workspace.id;
25
+ }
26
+ else {
27
+ workspaceId = await getCurrentWorkspaceId();
28
+ }
29
+ let users = await getWorkspaceUsers(workspaceId);
30
+ if (options.search) {
31
+ const search = options.search.toLowerCase();
32
+ users = users.filter((u) => u.name.toLowerCase().includes(search) || u.email?.toLowerCase().includes(search));
33
+ }
34
+ if (users.length === 0) {
35
+ console.log('No users found.');
36
+ return;
37
+ }
38
+ if (options.json) {
39
+ console.log(formatJson(users, 'user', options.full));
40
+ return;
41
+ }
42
+ if (options.ndjson) {
43
+ console.log(formatNdjson(users, 'user', options.full));
44
+ return;
45
+ }
46
+ for (const u of users) {
47
+ const id = colors.timestamp(`id:${u.id}`);
48
+ const name = u.name;
49
+ const email = u.email ? colors.timestamp(`<${u.email}>`) : '';
50
+ const type = colors.channel(`[${u.userType}]`);
51
+ const bot = u.bot ? chalk.yellow(' [bot]') : '';
52
+ console.log(`${id} ${name} ${email} ${type}${bot}`);
53
+ }
54
+ }
55
+ export function registerUserCommand(program) {
56
+ program.command('user').description('Show current user info').action(showCurrentUser);
57
+ program
58
+ .command('users [workspace-ref]')
59
+ .description('List users in a workspace')
60
+ .option('--workspace <ref>', 'Workspace ID or name')
61
+ .option('--search <text>', 'Filter by name/email')
62
+ .option('--json', 'Output as JSON')
63
+ .option('--ndjson', 'Output as newline-delimited JSON')
64
+ .option('--full', 'Include all fields in JSON output')
65
+ .action(listUsers);
66
+ }
67
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerWorkspaceCommand(program: Command): void;
3
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+CnC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/D"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import { fetchWorkspaces, getCurrentWorkspaceId } from '../lib/api.js';
3
+ import { updateConfig } from '../lib/config.js';
4
+ import { colors, formatJson, formatNdjson } from '../lib/output.js';
5
+ import { resolveWorkspaceRef } from '../lib/refs.js';
6
+ async function listWorkspaces(options) {
7
+ const workspaces = await fetchWorkspaces();
8
+ if (workspaces.length === 0) {
9
+ console.log('No workspaces found.');
10
+ return;
11
+ }
12
+ if (options.json) {
13
+ console.log(formatJson(workspaces, 'workspace', options.full));
14
+ return;
15
+ }
16
+ if (options.ndjson) {
17
+ console.log(formatNdjson(workspaces, 'workspace', options.full));
18
+ return;
19
+ }
20
+ const currentWorkspaceId = await getCurrentWorkspaceId().catch(() => null);
21
+ for (const w of workspaces) {
22
+ const id = colors.timestamp(`id:${w.id}`);
23
+ const name = w.id === currentWorkspaceId ? chalk.bold(w.name) : w.name;
24
+ const current = w.id === currentWorkspaceId ? chalk.green(' (current)') : '';
25
+ const plan = w.plan ? colors.channel(`[${w.plan}]`) : '';
26
+ console.log(`${id} ${name}${current} ${plan}`);
27
+ }
28
+ }
29
+ async function useWorkspace(ref) {
30
+ const workspace = await resolveWorkspaceRef(ref);
31
+ await updateConfig({ currentWorkspace: workspace.id });
32
+ console.log(`Switched to workspace: ${workspace.name}`);
33
+ }
34
+ export function registerWorkspaceCommand(program) {
35
+ program
36
+ .command('workspaces')
37
+ .description('List all workspaces')
38
+ .option('--json', 'Output as JSON')
39
+ .option('--ndjson', 'Output as newline-delimited JSON')
40
+ .option('--full', 'Include all fields in JSON output')
41
+ .action(listWorkspaces);
42
+ const workspace = program.command('workspace').description('Manage workspace');
43
+ workspace
44
+ .command('use <workspace-ref>')
45
+ .description('Set the current workspace')
46
+ .action(useWorkspace);
47
+ }
48
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { program } from 'commander';
6
+ import { registerAuthCommand } from './commands/auth.js';
7
+ import { registerChannelCommand } from './commands/channel.js';
8
+ import { registerInboxCommand } from './commands/inbox.js';
9
+ import { registerMsgCommand } from './commands/msg.js';
10
+ import { registerReactCommand } from './commands/react.js';
11
+ import { registerSearchCommand } from './commands/search.js';
12
+ import { registerThreadCommand } from './commands/thread.js';
13
+ import { registerUserCommand } from './commands/user.js';
14
+ import { registerWorkspaceCommand } from './commands/workspace.js';
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
16
+ const { version } = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
17
+ program
18
+ .name('tw')
19
+ .description('Twist CLI')
20
+ .version(version)
21
+ .option('--no-spinner', 'Disable loading animations')
22
+ .addHelpText('after', `
23
+ Note for AI/LLM agents:
24
+ Use --json or --ndjson flags for unambiguous, parseable output.
25
+ Default JSON shows essential fields; use --full for all fields.`);
26
+ registerWorkspaceCommand(program);
27
+ registerUserCommand(program);
28
+ registerChannelCommand(program);
29
+ registerInboxCommand(program);
30
+ registerThreadCommand(program);
31
+ registerMsgCommand(program);
32
+ registerSearchCommand(program);
33
+ registerReactCommand(program);
34
+ registerAuthCommand(program);
35
+ program.parse();
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAElE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAExF,OAAO;KACF,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,WAAW,CAAC;KACxB,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;KACpD,WAAW,CACR,OAAO,EACP;;;kEAG0D,CAC7D,CAAA;AAEL,wBAAwB,CAAC,OAAO,CAAC,CAAA;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { TwistApi, type User, type Workspace, type WorkspaceUser } from '@doist/twist-sdk';
2
+ export declare function getTwistClient(): Promise<TwistApi>;
3
+ export declare function fetchWorkspaces(): Promise<Workspace[]>;
4
+ export declare function clearWorkspaceCache(): void;
5
+ export declare function getCurrentWorkspaceId(flagValue?: number): Promise<number>;
6
+ export declare function getSessionUser(): Promise<User>;
7
+ export declare function getWorkspaceUsers(workspaceId: number): Promise<WorkspaceUser[]>;
8
+ export declare function clearUserCache(): void;
9
+ export type { Workspace, WorkspaceUser, User };
10
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AA4G1F,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,CAOxD;AAKD,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAO5D;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAsB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpD;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGrF;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA"}
@@ -0,0 +1,143 @@
1
+ import { TwistApi } from '@doist/twist-sdk';
2
+ import { getApiToken } from './auth.js';
3
+ import { getConfig, updateConfig } from './config.js';
4
+ import { withSpinner } from './spinner.js';
5
+ // Mapping of API method paths to user-friendly spinner messages
6
+ const API_SPINNER_MESSAGES = {
7
+ // User operations
8
+ 'users.getSessionUser': { text: 'Checking authentication...', color: 'blue' },
9
+ // Workspace operations
10
+ 'workspaces.getWorkspaces': { text: 'Loading workspaces...', color: 'blue' },
11
+ 'workspaceUsers.getWorkspaceUsers': { text: 'Loading workspace users...', color: 'blue' },
12
+ 'workspaceUsers.getUserById': { text: 'Loading user details...', color: 'blue' },
13
+ // Thread operations
14
+ 'threads.getThread': { text: 'Loading thread...', color: 'blue' },
15
+ 'threads.getUnread': { text: 'Loading unread threads...', color: 'blue' },
16
+ // Comment operations
17
+ 'comments.getComments': { text: 'Loading comments...', color: 'blue' },
18
+ 'comments.createComment': { text: 'Creating comment...', color: 'green' },
19
+ 'comments.updateComment': { text: 'Updating comment...', color: 'yellow' },
20
+ 'comments.deleteComment': { text: 'Deleting comment...', color: 'yellow' },
21
+ // Channel operations
22
+ 'channels.getChannel': { text: 'Loading channel...', color: 'blue' },
23
+ 'channels.getChannels': { text: 'Loading channels...', color: 'blue' },
24
+ 'channels.createChannel': { text: 'Creating channel...', color: 'green' },
25
+ 'channels.updateChannel': { text: 'Updating channel...', color: 'yellow' },
26
+ 'channels.deleteChannel': { text: 'Deleting channel...', color: 'yellow' },
27
+ // Conversation operations
28
+ 'conversations.getConversation': { text: 'Loading conversation...', color: 'blue' },
29
+ 'conversations.getUnread': { text: 'Loading unread conversations...', color: 'blue' },
30
+ 'conversations.createConversation': { text: 'Creating conversation...', color: 'green' },
31
+ 'conversations.archiveConversation': { text: 'Archiving conversation...', color: 'yellow' },
32
+ 'conversations.unarchiveConversation': {
33
+ text: 'Unarchiving conversation...',
34
+ color: 'yellow',
35
+ },
36
+ // Conversation message operations
37
+ 'conversationMessages.getMessages': { text: 'Loading messages...', color: 'blue' },
38
+ 'conversationMessages.createMessage': { text: 'Sending message...', color: 'green' },
39
+ 'conversationMessages.updateMessage': { text: 'Updating message...', color: 'yellow' },
40
+ 'conversationMessages.deleteMessage': { text: 'Deleting message...', color: 'yellow' },
41
+ // Inbox operations
42
+ 'inbox.getInbox': { text: 'Loading inbox...', color: 'blue' },
43
+ 'inbox.archiveThread': { text: 'Archiving thread...', color: 'yellow' },
44
+ // Batch operations
45
+ batch: { text: 'Processing batch operations...', color: 'blue' },
46
+ };
47
+ function createSpinnerWrappedApi(api) {
48
+ return new Proxy(api, {
49
+ get(target, property, receiver) {
50
+ const value = Reflect.get(target, property, receiver);
51
+ // If this is a nested object (like workspaces, users, etc.), wrap it too
52
+ if (value &&
53
+ typeof value === 'object' &&
54
+ !Array.isArray(value) &&
55
+ typeof property === 'string') {
56
+ return createNestedSpinnerProxy(value, property);
57
+ }
58
+ return value;
59
+ },
60
+ });
61
+ }
62
+ function createNestedSpinnerProxy(obj, basePath) {
63
+ return new Proxy(obj, {
64
+ get(target, property, receiver) {
65
+ const originalMethod = Reflect.get(target, property, receiver);
66
+ // Only wrap functions that are likely API calls
67
+ if (typeof originalMethod === 'function' && typeof property === 'string') {
68
+ const fullPath = `${basePath}.${property}`;
69
+ const spinnerConfig = API_SPINNER_MESSAGES[fullPath];
70
+ if (spinnerConfig) {
71
+ return (...args) => {
72
+ const result = originalMethod.apply(target, args);
73
+ // If the method returns a Promise, wrap it with spinner
74
+ if (result && typeof result.then === 'function') {
75
+ return withSpinner(spinnerConfig, () => result);
76
+ }
77
+ return result;
78
+ };
79
+ }
80
+ }
81
+ return originalMethod;
82
+ },
83
+ });
84
+ }
85
+ let apiClient = null;
86
+ export async function getTwistClient() {
87
+ if (!apiClient) {
88
+ const token = await getApiToken();
89
+ const rawApi = new TwistApi(token);
90
+ apiClient = createSpinnerWrappedApi(rawApi);
91
+ }
92
+ return apiClient;
93
+ }
94
+ let workspaceCache = null;
95
+ let sessionUserCache = null;
96
+ export async function fetchWorkspaces() {
97
+ if (workspaceCache) {
98
+ return workspaceCache;
99
+ }
100
+ const client = await getTwistClient();
101
+ workspaceCache = await client.workspaces.getWorkspaces();
102
+ return workspaceCache;
103
+ }
104
+ export function clearWorkspaceCache() {
105
+ workspaceCache = null;
106
+ }
107
+ export async function getCurrentWorkspaceId(flagValue) {
108
+ if (flagValue) {
109
+ return flagValue;
110
+ }
111
+ const config = await getConfig();
112
+ if (config.currentWorkspace) {
113
+ return config.currentWorkspace;
114
+ }
115
+ const sessionUser = await getSessionUser();
116
+ if (sessionUser.defaultWorkspace) {
117
+ await updateConfig({ currentWorkspace: sessionUser.defaultWorkspace });
118
+ return sessionUser.defaultWorkspace;
119
+ }
120
+ const workspaces = await fetchWorkspaces();
121
+ if (workspaces.length === 0) {
122
+ throw new Error('No workspaces found for this user');
123
+ }
124
+ const defaultWorkspace = workspaces[0];
125
+ await updateConfig({ currentWorkspace: defaultWorkspace.id });
126
+ return defaultWorkspace.id;
127
+ }
128
+ export async function getSessionUser() {
129
+ if (sessionUserCache) {
130
+ return sessionUserCache;
131
+ }
132
+ const client = await getTwistClient();
133
+ sessionUserCache = await client.users.getSessionUser();
134
+ return sessionUserCache;
135
+ }
136
+ export async function getWorkspaceUsers(workspaceId) {
137
+ const client = await getTwistClient();
138
+ return client.workspaceUsers.getWorkspaceUsers({ workspaceId });
139
+ }
140
+ export function clearUserCache() {
141
+ sessionUserCache = null;
142
+ }
143
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getApiToken(): Promise<string>;
2
+ export declare function saveApiToken(token: string): Promise<void>;
3
+ export declare function clearApiToken(): Promise<void>;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAcnD;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBnD"}