@antcoder/birdxtwittercli 0.8.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 (214) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/LICENSE +21 -0
  3. package/README.md +388 -0
  4. package/dist/cli/pagination.d.ts +35 -0
  5. package/dist/cli/pagination.d.ts.map +1 -0
  6. package/dist/cli/pagination.js +43 -0
  7. package/dist/cli/pagination.js.map +1 -0
  8. package/dist/cli/program.d.ts +5 -0
  9. package/dist/cli/program.d.ts.map +1 -0
  10. package/dist/cli/program.js +113 -0
  11. package/dist/cli/program.js.map +1 -0
  12. package/dist/cli/shared.d.ts +77 -0
  13. package/dist/cli/shared.d.ts.map +1 -0
  14. package/dist/cli/shared.js +327 -0
  15. package/dist/cli/shared.js.map +1 -0
  16. package/dist/cli.d.ts +12 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +29 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands/bookmarks.d.ts +4 -0
  21. package/dist/commands/bookmarks.d.ts.map +1 -0
  22. package/dist/commands/bookmarks.js +189 -0
  23. package/dist/commands/bookmarks.js.map +1 -0
  24. package/dist/commands/check.d.ts +4 -0
  25. package/dist/commands/check.d.ts.map +1 -0
  26. package/dist/commands/check.js +43 -0
  27. package/dist/commands/check.js.map +1 -0
  28. package/dist/commands/follow.d.ts +4 -0
  29. package/dist/commands/follow.d.ts.map +1 -0
  30. package/dist/commands/follow.js +91 -0
  31. package/dist/commands/follow.js.map +1 -0
  32. package/dist/commands/help.d.ts +4 -0
  33. package/dist/commands/help.d.ts.map +1 -0
  34. package/dist/commands/help.js +19 -0
  35. package/dist/commands/help.js.map +1 -0
  36. package/dist/commands/home.d.ts +4 -0
  37. package/dist/commands/home.d.ts.map +1 -0
  38. package/dist/commands/home.js +43 -0
  39. package/dist/commands/home.js.map +1 -0
  40. package/dist/commands/lists.d.ts +4 -0
  41. package/dist/commands/lists.d.ts.map +1 -0
  42. package/dist/commands/lists.js +213 -0
  43. package/dist/commands/lists.js.map +1 -0
  44. package/dist/commands/news.d.ts +4 -0
  45. package/dist/commands/news.d.ts.map +1 -0
  46. package/dist/commands/news.js +131 -0
  47. package/dist/commands/news.js.map +1 -0
  48. package/dist/commands/post.d.ts +4 -0
  49. package/dist/commands/post.d.ts.map +1 -0
  50. package/dist/commands/post.js +101 -0
  51. package/dist/commands/post.js.map +1 -0
  52. package/dist/commands/query-ids.d.ts +4 -0
  53. package/dist/commands/query-ids.d.ts.map +1 -0
  54. package/dist/commands/query-ids.js +80 -0
  55. package/dist/commands/query-ids.js.map +1 -0
  56. package/dist/commands/read.d.ts +4 -0
  57. package/dist/commands/read.d.ts.map +1 -0
  58. package/dist/commands/read.js +152 -0
  59. package/dist/commands/read.js.map +1 -0
  60. package/dist/commands/search.d.ts +4 -0
  61. package/dist/commands/search.d.ts.map +1 -0
  62. package/dist/commands/search.js +115 -0
  63. package/dist/commands/search.js.map +1 -0
  64. package/dist/commands/unbookmark.d.ts +4 -0
  65. package/dist/commands/unbookmark.d.ts.map +1 -0
  66. package/dist/commands/unbookmark.js +36 -0
  67. package/dist/commands/unbookmark.js.map +1 -0
  68. package/dist/commands/user-tweets.d.ts +4 -0
  69. package/dist/commands/user-tweets.d.ts.map +1 -0
  70. package/dist/commands/user-tweets.js +109 -0
  71. package/dist/commands/user-tweets.js.map +1 -0
  72. package/dist/commands/users.d.ts +4 -0
  73. package/dist/commands/users.d.ts.map +1 -0
  74. package/dist/commands/users.js +295 -0
  75. package/dist/commands/users.js.map +1 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +2 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/lib/cli-args.d.ts +7 -0
  81. package/dist/lib/cli-args.d.ts.map +1 -0
  82. package/dist/lib/cli-args.js +25 -0
  83. package/dist/lib/cli-args.js.map +1 -0
  84. package/dist/lib/cookies.d.ts +31 -0
  85. package/dist/lib/cookies.d.ts.map +1 -0
  86. package/dist/lib/cookies.js +173 -0
  87. package/dist/lib/cookies.js.map +1 -0
  88. package/dist/lib/extract-bookmark-folder-id.d.ts +2 -0
  89. package/dist/lib/extract-bookmark-folder-id.d.ts.map +1 -0
  90. package/dist/lib/extract-bookmark-folder-id.js +20 -0
  91. package/dist/lib/extract-bookmark-folder-id.js.map +1 -0
  92. package/dist/lib/extract-list-id.d.ts +2 -0
  93. package/dist/lib/extract-list-id.d.ts.map +1 -0
  94. package/dist/lib/extract-list-id.js +19 -0
  95. package/dist/lib/extract-list-id.js.map +1 -0
  96. package/dist/lib/extract-tweet-id.d.ts +2 -0
  97. package/dist/lib/extract-tweet-id.d.ts.map +1 -0
  98. package/dist/lib/extract-tweet-id.js +14 -0
  99. package/dist/lib/extract-tweet-id.js.map +1 -0
  100. package/dist/lib/features.json +17 -0
  101. package/dist/lib/index.d.ts +10 -0
  102. package/dist/lib/index.d.ts.map +1 -0
  103. package/dist/lib/index.js +4 -0
  104. package/dist/lib/index.js.map +1 -0
  105. package/dist/lib/normalize-handle.d.ts +6 -0
  106. package/dist/lib/normalize-handle.d.ts.map +1 -0
  107. package/dist/lib/normalize-handle.js +31 -0
  108. package/dist/lib/normalize-handle.js.map +1 -0
  109. package/dist/lib/output.d.ts +29 -0
  110. package/dist/lib/output.d.ts.map +1 -0
  111. package/dist/lib/output.js +88 -0
  112. package/dist/lib/output.js.map +1 -0
  113. package/dist/lib/paginate-cursor.d.ts +27 -0
  114. package/dist/lib/paginate-cursor.d.ts.map +1 -0
  115. package/dist/lib/paginate-cursor.js +37 -0
  116. package/dist/lib/paginate-cursor.js.map +1 -0
  117. package/dist/lib/query-ids.json +20 -0
  118. package/dist/lib/runtime-features.d.ts +19 -0
  119. package/dist/lib/runtime-features.d.ts.map +1 -0
  120. package/dist/lib/runtime-features.js +151 -0
  121. package/dist/lib/runtime-features.js.map +1 -0
  122. package/dist/lib/runtime-query-ids.d.ts +33 -0
  123. package/dist/lib/runtime-query-ids.d.ts.map +1 -0
  124. package/dist/lib/runtime-query-ids.js +264 -0
  125. package/dist/lib/runtime-query-ids.js.map +1 -0
  126. package/dist/lib/thread-filters.d.ts +8 -0
  127. package/dist/lib/thread-filters.d.ts.map +1 -0
  128. package/dist/lib/thread-filters.js +124 -0
  129. package/dist/lib/thread-filters.js.map +1 -0
  130. package/dist/lib/twitter-client-base.d.ts +38 -0
  131. package/dist/lib/twitter-client-base.d.ts.map +1 -0
  132. package/dist/lib/twitter-client-base.js +129 -0
  133. package/dist/lib/twitter-client-base.js.map +1 -0
  134. package/dist/lib/twitter-client-bookmarks.d.ts +7 -0
  135. package/dist/lib/twitter-client-bookmarks.d.ts.map +1 -0
  136. package/dist/lib/twitter-client-bookmarks.js +61 -0
  137. package/dist/lib/twitter-client-bookmarks.js.map +1 -0
  138. package/dist/lib/twitter-client-constants.d.ts +44 -0
  139. package/dist/lib/twitter-client-constants.d.ts.map +1 -0
  140. package/dist/lib/twitter-client-constants.js +51 -0
  141. package/dist/lib/twitter-client-constants.js.map +1 -0
  142. package/dist/lib/twitter-client-engagement.d.ts +16 -0
  143. package/dist/lib/twitter-client-engagement.d.ts.map +1 -0
  144. package/dist/lib/twitter-client-engagement.js +81 -0
  145. package/dist/lib/twitter-client-engagement.js.map +1 -0
  146. package/dist/lib/twitter-client-features.d.ts +14 -0
  147. package/dist/lib/twitter-client-features.d.ts.map +1 -0
  148. package/dist/lib/twitter-client-features.js +347 -0
  149. package/dist/lib/twitter-client-features.js.map +1 -0
  150. package/dist/lib/twitter-client-follow.d.ts +8 -0
  151. package/dist/lib/twitter-client-follow.d.ts.map +1 -0
  152. package/dist/lib/twitter-client-follow.js +178 -0
  153. package/dist/lib/twitter-client-follow.js.map +1 -0
  154. package/dist/lib/twitter-client-home.d.ts +13 -0
  155. package/dist/lib/twitter-client-home.d.ts.map +1 -0
  156. package/dist/lib/twitter-client-home.js +138 -0
  157. package/dist/lib/twitter-client-home.js.map +1 -0
  158. package/dist/lib/twitter-client-lists.d.ts +12 -0
  159. package/dist/lib/twitter-client-lists.d.ts.map +1 -0
  160. package/dist/lib/twitter-client-lists.js +390 -0
  161. package/dist/lib/twitter-client-lists.js.map +1 -0
  162. package/dist/lib/twitter-client-media.d.ts +11 -0
  163. package/dist/lib/twitter-client-media.d.ts.map +1 -0
  164. package/dist/lib/twitter-client-media.js +136 -0
  165. package/dist/lib/twitter-client-media.js.map +1 -0
  166. package/dist/lib/twitter-client-news.d.ts +47 -0
  167. package/dist/lib/twitter-client-news.d.ts.map +1 -0
  168. package/dist/lib/twitter-client-news.js +283 -0
  169. package/dist/lib/twitter-client-news.js.map +1 -0
  170. package/dist/lib/twitter-client-posting.d.ts +8 -0
  171. package/dist/lib/twitter-client-posting.d.ts.map +1 -0
  172. package/dist/lib/twitter-client-posting.js +218 -0
  173. package/dist/lib/twitter-client-posting.js.map +1 -0
  174. package/dist/lib/twitter-client-search.d.ts +19 -0
  175. package/dist/lib/twitter-client-search.d.ts.map +1 -0
  176. package/dist/lib/twitter-client-search.js +157 -0
  177. package/dist/lib/twitter-client-search.js.map +1 -0
  178. package/dist/lib/twitter-client-timelines.d.ts +23 -0
  179. package/dist/lib/twitter-client-timelines.d.ts.map +1 -0
  180. package/dist/lib/twitter-client-timelines.js +471 -0
  181. package/dist/lib/twitter-client-timelines.js.map +1 -0
  182. package/dist/lib/twitter-client-tweet-detail.d.ts +25 -0
  183. package/dist/lib/twitter-client-tweet-detail.d.ts.map +1 -0
  184. package/dist/lib/twitter-client-tweet-detail.js +295 -0
  185. package/dist/lib/twitter-client-tweet-detail.js.map +1 -0
  186. package/dist/lib/twitter-client-types.d.ts +407 -0
  187. package/dist/lib/twitter-client-types.d.ts.map +1 -0
  188. package/dist/lib/twitter-client-types.js +2 -0
  189. package/dist/lib/twitter-client-types.js.map +1 -0
  190. package/dist/lib/twitter-client-user-lookup.d.ts +16 -0
  191. package/dist/lib/twitter-client-user-lookup.d.ts.map +1 -0
  192. package/dist/lib/twitter-client-user-lookup.js +224 -0
  193. package/dist/lib/twitter-client-user-lookup.js.map +1 -0
  194. package/dist/lib/twitter-client-user-tweets.d.ts +22 -0
  195. package/dist/lib/twitter-client-user-tweets.d.ts.map +1 -0
  196. package/dist/lib/twitter-client-user-tweets.js +154 -0
  197. package/dist/lib/twitter-client-user-tweets.js.map +1 -0
  198. package/dist/lib/twitter-client-users.d.ts +9 -0
  199. package/dist/lib/twitter-client-users.d.ts.map +1 -0
  200. package/dist/lib/twitter-client-users.js +358 -0
  201. package/dist/lib/twitter-client-users.js.map +1 -0
  202. package/dist/lib/twitter-client-utils.d.ts +173 -0
  203. package/dist/lib/twitter-client-utils.d.ts.map +1 -0
  204. package/dist/lib/twitter-client-utils.js +511 -0
  205. package/dist/lib/twitter-client-utils.js.map +1 -0
  206. package/dist/lib/twitter-client.d.ts +23 -0
  207. package/dist/lib/twitter-client.d.ts.map +1 -0
  208. package/dist/lib/twitter-client.js +21 -0
  209. package/dist/lib/twitter-client.js.map +1 -0
  210. package/dist/lib/version.d.ts +6 -0
  211. package/dist/lib/version.d.ts.map +1 -0
  212. package/dist/lib/version.js +174 -0
  213. package/dist/lib/version.js.map +1 -0
  214. package/package.json +61 -0
@@ -0,0 +1,295 @@
1
+ import { normalizeHandle } from '../lib/normalize-handle.js';
2
+ import { TwitterClient } from '../lib/twitter-client.js';
3
+ function formatAboutProfile(profile, ctx, handle) {
4
+ const lines = [`${ctx.p('info')}Account information for @${handle}:`];
5
+ if (profile.accountBasedIn) {
6
+ lines.push(` Account based in: ${profile.accountBasedIn}`);
7
+ }
8
+ if (profile.createdCountryAccurate !== undefined) {
9
+ lines.push(` Creation country accurate: ${profile.createdCountryAccurate ? 'Yes' : 'No'}`);
10
+ }
11
+ if (profile.locationAccurate !== undefined) {
12
+ lines.push(` Location accurate: ${profile.locationAccurate ? 'Yes' : 'No'}`);
13
+ }
14
+ if (profile.source) {
15
+ lines.push(`${ctx.l('source')}${profile.source}`);
16
+ }
17
+ if (profile.learnMoreUrl) {
18
+ lines.push(` Learn more: ${profile.learnMoreUrl}`);
19
+ }
20
+ return lines;
21
+ }
22
+ function printUsers(users, ctx) {
23
+ for (const user of users) {
24
+ console.log(`@${user.username} (${user.name})`);
25
+ if (user.description) {
26
+ console.log(` ${user.description.slice(0, 100)}${user.description.length > 100 ? '...' : ''}`);
27
+ }
28
+ if (user.followersCount !== undefined) {
29
+ console.log(` ${ctx.p('info')}${user.followersCount.toLocaleString()} followers`);
30
+ }
31
+ console.log('──────────────────────────────────────────────────');
32
+ }
33
+ }
34
+ async function resolveUserIdOrExit(client, requestedUserId, ctx) {
35
+ if (requestedUserId) {
36
+ return requestedUserId;
37
+ }
38
+ const currentUser = await client.getCurrentUser();
39
+ if (!currentUser.success || !currentUser.user?.id) {
40
+ console.error(`${ctx.p('err')}Failed to get current user: ${currentUser.error || 'Unknown error'}`);
41
+ process.exit(1);
42
+ }
43
+ return currentUser.user.id;
44
+ }
45
+ async function runUserListCommand(program, ctx, spec, cmdOpts) {
46
+ const opts = program.opts();
47
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
48
+ const count = Number.parseInt(cmdOpts.count || '20', 10);
49
+ const maxPages = cmdOpts.maxPages ? Number.parseInt(cmdOpts.maxPages, 10) : undefined;
50
+ const usePagination = cmdOpts.all || cmdOpts.cursor;
51
+ if (maxPages !== undefined && !cmdOpts.all) {
52
+ console.error(`${ctx.p('err')}--max-pages requires --all.`);
53
+ process.exit(1);
54
+ }
55
+ if (maxPages !== undefined && (!Number.isFinite(maxPages) || maxPages <= 0)) {
56
+ console.error(`${ctx.p('err')}Invalid --max-pages. Expected a positive integer.`);
57
+ process.exit(1);
58
+ }
59
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
60
+ for (const warning of warnings) {
61
+ console.error(`${ctx.p('warn')}${warning}`);
62
+ }
63
+ if (!cookies.authToken || !cookies.ct0) {
64
+ console.error(`${ctx.p('err')}Missing required credentials`);
65
+ process.exit(1);
66
+ }
67
+ const client = new TwitterClient({ cookies, timeoutMs });
68
+ const userId = await resolveUserIdOrExit(client, cmdOpts.user, ctx);
69
+ if (cmdOpts.all) {
70
+ const allUsers = [];
71
+ const seen = new Set();
72
+ let cursor = cmdOpts.cursor;
73
+ let pageNum = 0;
74
+ let nextCursor;
75
+ while (true) {
76
+ pageNum += 1;
77
+ if (!cmdOpts.json) {
78
+ console.error(`${ctx.p('info')}Fetching page ${pageNum}...`);
79
+ }
80
+ const result = await spec.fetch(client, userId, count, cursor);
81
+ if (!result.success || !result.users) {
82
+ console.error(`${ctx.p('err')}Failed to fetch ${spec.name}: ${result.error}`);
83
+ process.exit(1);
84
+ }
85
+ let added = 0;
86
+ for (const user of result.users) {
87
+ if (!seen.has(user.id)) {
88
+ seen.add(user.id);
89
+ allUsers.push(user);
90
+ added += 1;
91
+ }
92
+ }
93
+ const pageCursor = result.nextCursor;
94
+ if (!pageCursor || result.users.length === 0 || added === 0 || pageCursor === cursor) {
95
+ nextCursor = undefined;
96
+ break;
97
+ }
98
+ if (maxPages && pageNum >= maxPages) {
99
+ nextCursor = pageCursor;
100
+ break;
101
+ }
102
+ cursor = pageCursor;
103
+ await new Promise((resolve) => setTimeout(resolve, 1000));
104
+ }
105
+ if (cmdOpts.json) {
106
+ console.log(JSON.stringify({ users: allUsers, nextCursor: nextCursor ?? null }, null, 2));
107
+ }
108
+ else {
109
+ console.error(`${ctx.p('info')}Total: ${allUsers.length} users`);
110
+ if (nextCursor) {
111
+ console.error(`${ctx.p('info')}Stopped at --max-pages. Use --cursor to continue.`);
112
+ console.error(`${ctx.p('info')}Next cursor: ${nextCursor}`);
113
+ }
114
+ printUsers(allUsers, ctx);
115
+ }
116
+ return;
117
+ }
118
+ const result = await spec.fetch(client, userId, count, cmdOpts.cursor);
119
+ if (result.success && result.users) {
120
+ if (cmdOpts.json) {
121
+ if (usePagination) {
122
+ console.log(JSON.stringify({ users: result.users, nextCursor: result.nextCursor ?? null }, null, 2));
123
+ }
124
+ else {
125
+ console.log(JSON.stringify(result.users, null, 2));
126
+ }
127
+ }
128
+ else {
129
+ if (result.users.length === 0) {
130
+ console.log('No users found.');
131
+ }
132
+ else {
133
+ printUsers(result.users, ctx);
134
+ if (result.nextCursor) {
135
+ console.error(`${ctx.p('info')}Next cursor: ${result.nextCursor}`);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ console.error(`${ctx.p('err')}Failed to fetch ${spec.name}: ${result.error}`);
142
+ process.exit(1);
143
+ }
144
+ }
145
+ export function registerUserCommands(program, ctx) {
146
+ const registerUserListCommand = (spec) => {
147
+ program
148
+ .command(spec.name)
149
+ .description(spec.description)
150
+ .option('--user <userId>', `User ID to get ${spec.name} for (defaults to current user)`)
151
+ .option('-n, --count <number>', 'Number of users to fetch per page', '20')
152
+ .option('--cursor <cursor>', 'Cursor for pagination (from previous response)')
153
+ .option('--all', 'Fetch all users (paginate automatically)')
154
+ .option('--max-pages <number>', 'Stop after N pages when using --all')
155
+ .option('--json', 'Output as JSON')
156
+ .action(async (cmdOpts) => runUserListCommand(program, ctx, spec, cmdOpts));
157
+ };
158
+ registerUserListCommand({
159
+ name: 'following',
160
+ description: 'Get users that you (or another user) follow',
161
+ fetch: (client, userId, count, cursor) => client.getFollowing(userId, count, cursor),
162
+ });
163
+ registerUserListCommand({
164
+ name: 'followers',
165
+ description: 'Get users that follow you (or another user)',
166
+ fetch: (client, userId, count, cursor) => client.getFollowers(userId, count, cursor),
167
+ });
168
+ program
169
+ .command('likes')
170
+ .description('Get your liked tweets')
171
+ .option('-n, --count <number>', 'Number of likes to fetch', '20')
172
+ .option('--all', 'Fetch all likes (paged)')
173
+ .option('--max-pages <number>', 'Stop after N pages when using --all')
174
+ .option('--cursor <string>', 'Resume pagination from a cursor')
175
+ .option('--json', 'Output as JSON')
176
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
177
+ .action(async (cmdOpts) => {
178
+ const opts = program.opts();
179
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
180
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
181
+ const count = Number.parseInt(cmdOpts.count || '20', 10);
182
+ const maxPages = cmdOpts.maxPages ? Number.parseInt(cmdOpts.maxPages, 10) : undefined;
183
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
184
+ for (const warning of warnings) {
185
+ console.error(`${ctx.p('warn')}${warning}`);
186
+ }
187
+ if (!cookies.authToken || !cookies.ct0) {
188
+ console.error(`${ctx.p('err')}Missing required credentials`);
189
+ process.exit(1);
190
+ }
191
+ const usePagination = cmdOpts.all || cmdOpts.cursor;
192
+ if (maxPages !== undefined && !usePagination) {
193
+ console.error(`${ctx.p('err')}--max-pages requires --all or --cursor.`);
194
+ process.exit(1);
195
+ }
196
+ if (!usePagination && (!Number.isFinite(count) || count <= 0)) {
197
+ console.error(`${ctx.p('err')}Invalid --count. Expected a positive integer.`);
198
+ process.exit(1);
199
+ }
200
+ if (maxPages !== undefined && (!Number.isFinite(maxPages) || maxPages <= 0)) {
201
+ console.error(`${ctx.p('err')}Invalid --max-pages. Expected a positive integer.`);
202
+ process.exit(1);
203
+ }
204
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
205
+ const includeRaw = cmdOpts.jsonFull ?? false;
206
+ const timelineOptions = { includeRaw };
207
+ const paginationOptions = { includeRaw, maxPages, cursor: cmdOpts.cursor };
208
+ const result = usePagination
209
+ ? await client.getAllLikes(paginationOptions)
210
+ : await client.getLikes(count, timelineOptions);
211
+ if (result.success) {
212
+ const isJson = Boolean(cmdOpts.json || cmdOpts.jsonFull);
213
+ ctx.printTweetsResult(result, {
214
+ json: isJson,
215
+ usePagination: Boolean(usePagination),
216
+ emptyMessage: 'No liked tweets found.',
217
+ });
218
+ }
219
+ else {
220
+ console.error(`${ctx.p('err')}Failed to fetch likes: ${result.error}`);
221
+ process.exit(1);
222
+ }
223
+ });
224
+ program
225
+ .command('whoami')
226
+ .description('Show which Twitter account the current credentials belong to')
227
+ .action(async () => {
228
+ const opts = program.opts();
229
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
230
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
231
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
232
+ for (const warning of warnings) {
233
+ console.error(`${ctx.p('warn')}${warning}`);
234
+ }
235
+ if (!cookies.authToken || !cookies.ct0) {
236
+ console.error(`${ctx.p('err')}Missing required credentials`);
237
+ process.exit(1);
238
+ }
239
+ if (cookies.source) {
240
+ console.error(`${ctx.l('source')}${cookies.source}`);
241
+ }
242
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
243
+ const result = await client.getCurrentUser();
244
+ const credentialSource = cookies.source ?? 'env/auto-detected cookies';
245
+ if (result.success && result.user) {
246
+ console.log(`${ctx.l('user')}@${result.user.username} (${result.user.name})`);
247
+ console.log(`${ctx.l('userId')}${result.user.id}`);
248
+ console.log(`${ctx.l('engine')}graphql`);
249
+ console.log(`${ctx.l('credentials')}${credentialSource}`);
250
+ }
251
+ else {
252
+ console.error(`${ctx.p('err')}Failed to determine current user: ${result.error ?? 'Unknown error'}`);
253
+ process.exit(1);
254
+ }
255
+ });
256
+ program
257
+ .command('about')
258
+ .description('Get account origin and location information for a user')
259
+ .argument('<username>', 'Twitter username (with or without @)')
260
+ .option('--json', 'Output as JSON')
261
+ .action(async (username, cmdOpts) => {
262
+ const opts = program.opts();
263
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
264
+ const normalizedHandle = normalizeHandle(username);
265
+ if (!normalizedHandle) {
266
+ console.error(`${ctx.p('err')}Invalid username: ${username}`);
267
+ process.exit(1);
268
+ }
269
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
270
+ for (const warning of warnings) {
271
+ console.error(`${ctx.p('warn')}${warning}`);
272
+ }
273
+ if (!cookies.authToken || !cookies.ct0) {
274
+ console.error(`${ctx.p('err')}Missing required credentials`);
275
+ process.exit(1);
276
+ }
277
+ const client = new TwitterClient({ cookies, timeoutMs });
278
+ const result = await client.getUserAboutAccount(normalizedHandle);
279
+ if (result.success && result.aboutProfile) {
280
+ if (cmdOpts.json) {
281
+ console.log(JSON.stringify(result.aboutProfile, null, 2));
282
+ }
283
+ else {
284
+ for (const line of formatAboutProfile(result.aboutProfile, ctx, normalizedHandle)) {
285
+ console.log(line);
286
+ }
287
+ }
288
+ }
289
+ else {
290
+ console.error(`${ctx.p('err')}Failed to fetch account information: ${result.error ?? 'Unknown error'}`);
291
+ process.exit(1);
292
+ }
293
+ });
294
+ }
295
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './lib/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './lib/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type CliInvocation = {
2
+ argv: string[] | null;
3
+ showHelp: boolean;
4
+ };
5
+ export declare function looksLikeTweetInput(value: string): boolean;
6
+ export declare function resolveCliInvocation(rawArgs: string[], knownCommands: Set<string>): CliInvocation;
7
+ //# sourceMappingURL=cli-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../../src/lib/cli-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAKF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM1D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,CAiBjG"}
@@ -0,0 +1,25 @@
1
+ const TWEET_URL_REGEX = /^(?:https?:\/\/)?(?:www\.)?(?:twitter\.com|x\.com)\/[^/]+\/status\/\d+/i;
2
+ const TWEET_ID_REGEX = /^\d{8,}$/;
3
+ export function looksLikeTweetInput(value) {
4
+ const trimmed = value.trim();
5
+ if (!trimmed) {
6
+ return false;
7
+ }
8
+ return TWEET_URL_REGEX.test(trimmed) || TWEET_ID_REGEX.test(trimmed);
9
+ }
10
+ export function resolveCliInvocation(rawArgs, knownCommands) {
11
+ if (rawArgs.length === 0) {
12
+ return { argv: null, showHelp: true };
13
+ }
14
+ const hasKnownCommand = rawArgs.some((arg) => knownCommands.has(arg));
15
+ if (!hasKnownCommand) {
16
+ const tweetArgIndex = rawArgs.findIndex(looksLikeTweetInput);
17
+ if (tweetArgIndex >= 0) {
18
+ const rewrittenArgs = [...rawArgs];
19
+ rewrittenArgs.splice(tweetArgIndex, 0, 'read');
20
+ return { argv: ['node', 'bird', ...rewrittenArgs], showHelp: false };
21
+ }
22
+ }
23
+ return { argv: null, showHelp: false };
24
+ }
25
+ //# sourceMappingURL=cli-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../../src/lib/cli-args.ts"],"names":[],"mappings":"AAKA,MAAM,eAAe,GAAG,yEAAyE,CAAC;AAClG,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAiB,EAAE,aAA0B;IAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC7D,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACnC,aAAa,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/C,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Browser cookie extraction for Twitter authentication.
3
+ * Delegates to @steipete/sweet-cookie for Safari/Chrome/Firefox reads.
4
+ */
5
+ export interface TwitterCookies {
6
+ authToken: string | null;
7
+ ct0: string | null;
8
+ cookieHeader: string | null;
9
+ source: string | null;
10
+ }
11
+ export interface CookieExtractionResult {
12
+ cookies: TwitterCookies;
13
+ warnings: string[];
14
+ }
15
+ export type CookieSource = 'safari' | 'chrome' | 'firefox';
16
+ export declare function extractCookiesFromSafari(): Promise<CookieExtractionResult>;
17
+ export declare function extractCookiesFromChrome(profile?: string): Promise<CookieExtractionResult>;
18
+ export declare function extractCookiesFromFirefox(profile?: string): Promise<CookieExtractionResult>;
19
+ /**
20
+ * Resolve Twitter credentials from multiple sources.
21
+ * Priority: CLI args > environment variables > browsers (ordered).
22
+ */
23
+ export declare function resolveCredentials(options: {
24
+ authToken?: string;
25
+ ct0?: string;
26
+ cookieSource?: CookieSource | CookieSource[];
27
+ chromeProfile?: string;
28
+ firefoxProfile?: string;
29
+ cookieTimeoutMs?: number;
30
+ }): Promise<CookieExtractionResult>;
31
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/lib/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAsI3D,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAEhF;AAED,wBAAsB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAEhG;AAED,wBAAsB,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAEjG;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0DlC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Browser cookie extraction for Twitter authentication.
3
+ * Delegates to @steipete/sweet-cookie for Safari/Chrome/Firefox reads.
4
+ */
5
+ import { getCookies } from '@steipete/sweet-cookie';
6
+ const TWITTER_COOKIE_NAMES = ['auth_token', 'ct0'];
7
+ const TWITTER_URL = 'https://x.com/';
8
+ const TWITTER_ORIGINS = ['https://x.com/', 'https://twitter.com/'];
9
+ const DEFAULT_COOKIE_TIMEOUT_MS = 30_000;
10
+ function normalizeValue(value) {
11
+ if (typeof value !== 'string') {
12
+ return null;
13
+ }
14
+ const trimmed = value.trim();
15
+ return trimmed.length > 0 ? trimmed : null;
16
+ }
17
+ function cookieHeader(authToken, ct0) {
18
+ return `auth_token=${authToken}; ct0=${ct0}`;
19
+ }
20
+ function buildEmpty() {
21
+ return { authToken: null, ct0: null, cookieHeader: null, source: null };
22
+ }
23
+ function readEnvCookie(cookies, keys, field) {
24
+ if (cookies[field]) {
25
+ return;
26
+ }
27
+ for (const key of keys) {
28
+ const value = normalizeValue(process.env[key]);
29
+ if (!value) {
30
+ continue;
31
+ }
32
+ cookies[field] = value;
33
+ if (!cookies.source) {
34
+ cookies.source = `env ${key}`;
35
+ }
36
+ break;
37
+ }
38
+ }
39
+ function resolveSources(cookieSource) {
40
+ if (Array.isArray(cookieSource)) {
41
+ return cookieSource;
42
+ }
43
+ if (cookieSource) {
44
+ return [cookieSource];
45
+ }
46
+ return ['safari', 'chrome', 'firefox'];
47
+ }
48
+ function labelForSource(source, profile) {
49
+ if (source === 'safari') {
50
+ return 'Safari';
51
+ }
52
+ if (source === 'chrome') {
53
+ return profile ? `Chrome profile "${profile}"` : 'Chrome default profile';
54
+ }
55
+ return profile ? `Firefox profile "${profile}"` : 'Firefox default profile';
56
+ }
57
+ function pickCookieValue(cookies, name) {
58
+ const matches = cookies.filter((c) => c?.name === name && typeof c.value === 'string');
59
+ if (matches.length === 0) {
60
+ return null;
61
+ }
62
+ const preferred = matches.find((c) => (c.domain ?? '').endsWith('x.com'));
63
+ if (preferred?.value) {
64
+ return preferred.value;
65
+ }
66
+ const twitter = matches.find((c) => (c.domain ?? '').endsWith('twitter.com'));
67
+ if (twitter?.value) {
68
+ return twitter.value;
69
+ }
70
+ return matches[0]?.value ?? null;
71
+ }
72
+ async function readTwitterCookiesFromBrowser(options) {
73
+ const warnings = [];
74
+ const out = buildEmpty();
75
+ const { cookies, warnings: providerWarnings } = await getCookies({
76
+ url: TWITTER_URL,
77
+ origins: TWITTER_ORIGINS,
78
+ names: [...TWITTER_COOKIE_NAMES],
79
+ browsers: [options.source],
80
+ mode: 'merge',
81
+ chromeProfile: options.chromeProfile,
82
+ firefoxProfile: options.firefoxProfile,
83
+ timeoutMs: options.cookieTimeoutMs,
84
+ });
85
+ warnings.push(...providerWarnings);
86
+ const authToken = pickCookieValue(cookies, 'auth_token');
87
+ const ct0 = pickCookieValue(cookies, 'ct0');
88
+ if (authToken) {
89
+ out.authToken = authToken;
90
+ }
91
+ if (ct0) {
92
+ out.ct0 = ct0;
93
+ }
94
+ if (out.authToken && out.ct0) {
95
+ out.cookieHeader = cookieHeader(out.authToken, out.ct0);
96
+ out.source = labelForSource(options.source, options.source === 'chrome' ? options.chromeProfile : options.firefoxProfile);
97
+ return { cookies: out, warnings };
98
+ }
99
+ if (options.source === 'safari') {
100
+ warnings.push('No Twitter cookies found in Safari. Make sure you are logged into x.com in Safari.');
101
+ }
102
+ else if (options.source === 'chrome') {
103
+ warnings.push('No Twitter cookies found in Chrome. Make sure you are logged into x.com in Chrome.');
104
+ }
105
+ else {
106
+ warnings.push('No Twitter cookies found in Firefox. Make sure you are logged into x.com in Firefox and the profile exists.');
107
+ }
108
+ return { cookies: out, warnings };
109
+ }
110
+ export async function extractCookiesFromSafari() {
111
+ return readTwitterCookiesFromBrowser({ source: 'safari' });
112
+ }
113
+ export async function extractCookiesFromChrome(profile) {
114
+ return readTwitterCookiesFromBrowser({ source: 'chrome', chromeProfile: profile });
115
+ }
116
+ export async function extractCookiesFromFirefox(profile) {
117
+ return readTwitterCookiesFromBrowser({ source: 'firefox', firefoxProfile: profile });
118
+ }
119
+ /**
120
+ * Resolve Twitter credentials from multiple sources.
121
+ * Priority: CLI args > environment variables > browsers (ordered).
122
+ */
123
+ export async function resolveCredentials(options) {
124
+ const warnings = [];
125
+ const cookies = buildEmpty();
126
+ const cookieTimeoutMs = typeof options.cookieTimeoutMs === 'number' &&
127
+ Number.isFinite(options.cookieTimeoutMs) &&
128
+ options.cookieTimeoutMs > 0
129
+ ? options.cookieTimeoutMs
130
+ : process.platform === 'darwin'
131
+ ? DEFAULT_COOKIE_TIMEOUT_MS
132
+ : undefined;
133
+ if (options.authToken) {
134
+ cookies.authToken = options.authToken;
135
+ cookies.source = 'CLI argument';
136
+ }
137
+ if (options.ct0) {
138
+ cookies.ct0 = options.ct0;
139
+ if (!cookies.source) {
140
+ cookies.source = 'CLI argument';
141
+ }
142
+ }
143
+ readEnvCookie(cookies, ['AUTH_TOKEN', 'TWITTER_AUTH_TOKEN'], 'authToken');
144
+ readEnvCookie(cookies, ['CT0', 'TWITTER_CT0'], 'ct0');
145
+ if (cookies.authToken && cookies.ct0) {
146
+ cookies.cookieHeader = cookieHeader(cookies.authToken, cookies.ct0);
147
+ return { cookies, warnings };
148
+ }
149
+ const sourcesToTry = resolveSources(options.cookieSource);
150
+ for (const source of sourcesToTry) {
151
+ const res = await readTwitterCookiesFromBrowser({
152
+ source,
153
+ chromeProfile: options.chromeProfile,
154
+ firefoxProfile: options.firefoxProfile,
155
+ cookieTimeoutMs,
156
+ });
157
+ warnings.push(...res.warnings);
158
+ if (res.cookies.authToken && res.cookies.ct0) {
159
+ return { cookies: res.cookies, warnings };
160
+ }
161
+ }
162
+ if (!cookies.authToken) {
163
+ warnings.push('Missing auth_token - provide via --auth-token, AUTH_TOKEN env var, or login to x.com in Safari/Chrome/Firefox');
164
+ }
165
+ if (!cookies.ct0) {
166
+ warnings.push('Missing ct0 - provide via --ct0, CT0 env var, or login to x.com in Safari/Chrome/Firefox');
167
+ }
168
+ if (cookies.authToken && cookies.ct0) {
169
+ cookies.cookieHeader = cookieHeader(cookies.authToken, cookies.ct0);
170
+ }
171
+ return { cookies, warnings };
172
+ }
173
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/lib/cookies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function extractBookmarkFolderId(input: string): string | null;
2
+ //# sourceMappingURL=extract-bookmark-folder-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-bookmark-folder-id.d.ts","sourceRoot":"","sources":["../../src/lib/extract-bookmark-folder-id.ts"],"names":[],"mappings":"AAMA,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAapE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Extract bookmark folder (collection) ID from an X/Twitter bookmarks URL.
3
+ */
4
+ const BOOKMARK_FOLDER_URL_REGEX = /(?:twitter\.com|x\.com)\/i\/bookmarks\/(\d+)/i;
5
+ const BOOKMARK_FOLDER_ID_REGEX = /^\d{5,}$/;
6
+ export function extractBookmarkFolderId(input) {
7
+ const trimmed = input.trim();
8
+ if (!trimmed) {
9
+ return null;
10
+ }
11
+ const urlMatch = BOOKMARK_FOLDER_URL_REGEX.exec(trimmed);
12
+ if (urlMatch) {
13
+ return urlMatch[1];
14
+ }
15
+ if (BOOKMARK_FOLDER_ID_REGEX.test(trimmed)) {
16
+ return trimmed;
17
+ }
18
+ return null;
19
+ }
20
+ //# sourceMappingURL=extract-bookmark-folder-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-bookmark-folder-id.js","sourceRoot":"","sources":["../../src/lib/extract-bookmark-folder-id.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,yBAAyB,GAAG,+CAA+C,CAAC;AAClF,MAAM,wBAAwB,GAAG,UAAU,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractListId(input: string): string | null;
2
+ //# sourceMappingURL=extract-list-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-list-id.d.ts","sourceRoot":"","sources":["../../src/lib/extract-list-id.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1D"}