@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,152 @@
1
+ import { parsePaginationFlags } from '../cli/pagination.js';
2
+ import { formatStatsLine } from '../lib/output.js';
3
+ import { TwitterClient } from '../lib/twitter-client.js';
4
+ export function registerReadCommands(program, ctx) {
5
+ program
6
+ .command('read')
7
+ .description('Read/fetch a tweet by ID or URL')
8
+ .argument('<tweet-id-or-url>', 'Tweet ID or URL to read')
9
+ .option('--json', 'Output as JSON')
10
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
11
+ .action(async (tweetIdOrUrl, cmdOpts) => {
12
+ const opts = program.opts();
13
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
14
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
15
+ const tweetId = ctx.extractTweetId(tweetIdOrUrl);
16
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
17
+ for (const warning of warnings) {
18
+ console.error(`${ctx.p('warn')}${warning}`);
19
+ }
20
+ if (!cookies.authToken || !cookies.ct0) {
21
+ console.error(`${ctx.p('err')}Missing required credentials`);
22
+ process.exit(1);
23
+ }
24
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
25
+ const includeRaw = cmdOpts.jsonFull ?? false;
26
+ const result = await client.getTweet(tweetId, { includeRaw });
27
+ if (result.success && result.tweet) {
28
+ if (cmdOpts.json || cmdOpts.jsonFull) {
29
+ console.log(JSON.stringify(result.tweet, null, 2));
30
+ }
31
+ else {
32
+ ctx.printTweets([result.tweet], { showSeparator: false });
33
+ console.log(formatStatsLine(result.tweet, ctx.getOutput()));
34
+ }
35
+ }
36
+ else {
37
+ console.error(`${ctx.p('err')}Failed to read tweet: ${result.error}`);
38
+ process.exit(1);
39
+ }
40
+ });
41
+ program
42
+ .command('replies')
43
+ .description('List replies to a tweet (by ID or URL)')
44
+ .argument('<tweet-id-or-url>', 'Tweet ID or URL')
45
+ .option('--all', 'Fetch all replies (paged)')
46
+ .option('--max-pages <number>', 'Fetch N pages (implies pagination)')
47
+ .option('--delay <ms>', 'Delay in ms between page fetches', '1000')
48
+ .option('--cursor <string>', 'Resume pagination from a cursor')
49
+ .option('--json', 'Output as JSON')
50
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
51
+ .action(async (tweetIdOrUrl, cmdOpts) => {
52
+ const opts = program.opts();
53
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
54
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
55
+ const tweetId = ctx.extractTweetId(tweetIdOrUrl);
56
+ const pagination = parsePaginationFlags(cmdOpts, { maxPagesImpliesPagination: true, includeDelay: true });
57
+ if (!pagination.ok) {
58
+ console.error(`${ctx.p('err')}${pagination.error}`);
59
+ process.exit(1);
60
+ }
61
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
62
+ for (const warning of warnings) {
63
+ console.error(`${ctx.p('warn')}${warning}`);
64
+ }
65
+ if (!cookies.authToken || !cookies.ct0) {
66
+ console.error(`${ctx.p('err')}Missing required credentials`);
67
+ process.exit(1);
68
+ }
69
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
70
+ const includeRaw = cmdOpts.jsonFull ?? false;
71
+ const result = pagination.usePagination
72
+ ? await client.getRepliesPaged(tweetId, {
73
+ includeRaw,
74
+ maxPages: pagination.maxPages,
75
+ cursor: pagination.cursor,
76
+ pageDelayMs: pagination.pageDelayMs,
77
+ })
78
+ : await client.getReplies(tweetId, { includeRaw });
79
+ const isJson = Boolean(cmdOpts.json || cmdOpts.jsonFull);
80
+ if (result.tweets) {
81
+ ctx.printTweetsResult(result, {
82
+ json: isJson,
83
+ usePagination: pagination.usePagination,
84
+ emptyMessage: 'No replies found.',
85
+ });
86
+ // Show pagination hint if there's more
87
+ if (result.nextCursor && !isJson) {
88
+ console.error(`${ctx.p('info')}More replies available. Use --cursor "${result.nextCursor}" to continue.`);
89
+ }
90
+ }
91
+ if (!result.success) {
92
+ console.error(`${ctx.p('err')}Failed to fetch replies: ${result.error}`);
93
+ process.exit(1);
94
+ }
95
+ });
96
+ program
97
+ .command('thread')
98
+ .description('Show the full conversation thread containing the tweet')
99
+ .argument('<tweet-id-or-url>', 'Tweet ID or URL')
100
+ .option('--all', 'Fetch all thread tweets (paged)')
101
+ .option('--max-pages <number>', 'Fetch N pages (implies pagination)')
102
+ .option('--delay <ms>', 'Delay in ms between page fetches', '1000')
103
+ .option('--cursor <string>', 'Resume pagination from a cursor')
104
+ .option('--json', 'Output as JSON')
105
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
106
+ .action(async (tweetIdOrUrl, cmdOpts) => {
107
+ const opts = program.opts();
108
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
109
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
110
+ const tweetId = ctx.extractTweetId(tweetIdOrUrl);
111
+ const pagination = parsePaginationFlags(cmdOpts, { maxPagesImpliesPagination: true, includeDelay: true });
112
+ if (!pagination.ok) {
113
+ console.error(`${ctx.p('err')}${pagination.error}`);
114
+ process.exit(1);
115
+ }
116
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
117
+ for (const warning of warnings) {
118
+ console.error(`${ctx.p('warn')}${warning}`);
119
+ }
120
+ if (!cookies.authToken || !cookies.ct0) {
121
+ console.error(`${ctx.p('err')}Missing required credentials`);
122
+ process.exit(1);
123
+ }
124
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
125
+ const includeRaw = cmdOpts.jsonFull ?? false;
126
+ const result = pagination.usePagination
127
+ ? await client.getThreadPaged(tweetId, {
128
+ includeRaw,
129
+ maxPages: pagination.maxPages,
130
+ cursor: pagination.cursor,
131
+ pageDelayMs: pagination.pageDelayMs,
132
+ })
133
+ : await client.getThread(tweetId, { includeRaw });
134
+ const isJson = Boolean(cmdOpts.json || cmdOpts.jsonFull);
135
+ if (result.tweets) {
136
+ ctx.printTweetsResult(result, {
137
+ json: isJson,
138
+ usePagination: pagination.usePagination,
139
+ emptyMessage: 'No thread tweets found.',
140
+ });
141
+ // Show pagination hint if there's more
142
+ if (result.nextCursor && !isJson) {
143
+ console.error(`${ctx.p('info')}More thread tweets available. Use --cursor "${result.nextCursor}" to continue.`);
144
+ }
145
+ }
146
+ if (!result.success) {
147
+ console.error(`${ctx.p('err')}Failed to fetch thread: ${result.error}`);
148
+ process.exit(1);
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function registerSearchCommands(program: Command, ctx: CliContext): void;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CA0I9E"}
@@ -0,0 +1,115 @@
1
+ import { parsePaginationFlags } from '../cli/pagination.js';
2
+ import { mentionsQueryFromUserOption, normalizeHandle } from '../lib/normalize-handle.js';
3
+ import { TwitterClient } from '../lib/twitter-client.js';
4
+ export function registerSearchCommands(program, ctx) {
5
+ program
6
+ .command('search')
7
+ .description('Search for tweets')
8
+ .argument('<query>', 'Search query (e.g., "@clawdbot" or "from:clawdbot")')
9
+ .option('-n, --count <number>', 'Number of tweets to fetch', '10')
10
+ .option('--all', 'Fetch all search results (paged)')
11
+ .option('--max-pages <number>', 'Stop after N pages when using --all')
12
+ .option('--cursor <string>', 'Resume pagination from a cursor')
13
+ .option('--json', 'Output as JSON')
14
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
15
+ .action(async (query, cmdOpts) => {
16
+ const opts = program.opts();
17
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
18
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
19
+ const count = Number.parseInt(cmdOpts.count || '10', 10);
20
+ const pagination = parsePaginationFlags(cmdOpts);
21
+ if (!pagination.ok) {
22
+ console.error(`${ctx.p('err')}${pagination.error}`);
23
+ process.exit(1);
24
+ }
25
+ const maxPages = pagination.maxPages;
26
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
27
+ for (const warning of warnings) {
28
+ console.error(`${ctx.p('warn')}${warning}`);
29
+ }
30
+ if (!cookies.authToken || !cookies.ct0) {
31
+ console.error(`${ctx.p('err')}Missing required credentials`);
32
+ process.exit(1);
33
+ }
34
+ const usePagination = pagination.usePagination;
35
+ if (maxPages !== undefined && !usePagination) {
36
+ console.error(`${ctx.p('err')}--max-pages requires --all or --cursor.`);
37
+ process.exit(1);
38
+ }
39
+ if (!usePagination && (!Number.isFinite(count) || count <= 0)) {
40
+ console.error(`${ctx.p('err')}Invalid --count. Expected a positive integer.`);
41
+ process.exit(1);
42
+ }
43
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
44
+ const includeRaw = cmdOpts.jsonFull ?? false;
45
+ const searchOptions = { includeRaw };
46
+ const paginationOptions = { includeRaw, maxPages, cursor: pagination.cursor };
47
+ const result = usePagination
48
+ ? await client.getAllSearchResults(query, paginationOptions)
49
+ : await client.search(query, count, searchOptions);
50
+ if (result.success) {
51
+ const isJson = Boolean(cmdOpts.json || cmdOpts.jsonFull);
52
+ ctx.printTweetsResult(result, {
53
+ json: isJson,
54
+ usePagination: Boolean(usePagination),
55
+ emptyMessage: 'No tweets found.',
56
+ });
57
+ }
58
+ else {
59
+ console.error(`${ctx.p('err')}Search failed: ${result.error}`);
60
+ process.exit(1);
61
+ }
62
+ });
63
+ program
64
+ .command('mentions')
65
+ .description('Find tweets mentioning a user (defaults to current user)')
66
+ .option('-u, --user <handle>', 'User handle (e.g. @steipete)')
67
+ .option('-n, --count <number>', 'Number of tweets to fetch', '10')
68
+ .option('--json', 'Output as JSON')
69
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
70
+ .action(async (cmdOpts) => {
71
+ const opts = program.opts();
72
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
73
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
74
+ const count = Number.parseInt(cmdOpts.count || '10', 10);
75
+ const fromUserOpt = mentionsQueryFromUserOption(cmdOpts.user);
76
+ if (fromUserOpt.error) {
77
+ console.error(`${ctx.p('err')}${fromUserOpt.error}`);
78
+ process.exit(2);
79
+ }
80
+ let query = fromUserOpt.query;
81
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
82
+ for (const warning of warnings) {
83
+ console.error(`${ctx.p('warn')}${warning}`);
84
+ }
85
+ if (!cookies.authToken || !cookies.ct0) {
86
+ console.error(`${ctx.p('err')}Missing required credentials`);
87
+ process.exit(1);
88
+ }
89
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
90
+ if (!query) {
91
+ const who = await client.getCurrentUser();
92
+ const handle = normalizeHandle(who.user?.username);
93
+ if (handle) {
94
+ query = `@${handle}`;
95
+ }
96
+ else {
97
+ console.error(`${ctx.p('err')}Could not determine current user (${who.error ?? 'Unknown error'}). Use --user <handle>.`);
98
+ process.exit(1);
99
+ }
100
+ }
101
+ const includeRaw = cmdOpts.jsonFull ?? false;
102
+ const result = await client.search(query, count, { includeRaw });
103
+ if (result.success) {
104
+ ctx.printTweets(result.tweets, {
105
+ json: cmdOpts.json || cmdOpts.jsonFull,
106
+ emptyMessage: 'No mentions found.',
107
+ });
108
+ }
109
+ else {
110
+ console.error(`${ctx.p('err')}Failed to fetch mentions: ${result.error}`);
111
+ process.exit(1);
112
+ }
113
+ });
114
+ }
115
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function registerUnbookmarkCommand(program: Command, ctx: CliContext): void;
4
+ //# sourceMappingURL=unbookmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unbookmark.d.ts","sourceRoot":"","sources":["../../src/commands/unbookmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAsCjF"}
@@ -0,0 +1,36 @@
1
+ import { TwitterClient } from '../lib/twitter-client.js';
2
+ export function registerUnbookmarkCommand(program, ctx) {
3
+ program
4
+ .command('unbookmark')
5
+ .description('Remove bookmarked tweets')
6
+ .argument('<tweet-id-or-url...>', 'Tweet IDs or URLs to remove from bookmarks')
7
+ .action(async (tweetIdOrUrls) => {
8
+ const opts = program.opts();
9
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
10
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
11
+ for (const warning of warnings) {
12
+ console.error(`${ctx.p('warn')}${warning}`);
13
+ }
14
+ if (!cookies.authToken || !cookies.ct0) {
15
+ console.error(`${ctx.p('err')}Missing required credentials`);
16
+ process.exit(1);
17
+ }
18
+ const client = new TwitterClient({ cookies, timeoutMs });
19
+ let failures = 0;
20
+ for (const input of tweetIdOrUrls) {
21
+ const tweetId = ctx.extractTweetId(input);
22
+ const result = await client.unbookmark(tweetId);
23
+ if (result.success) {
24
+ console.log(`${ctx.p('ok')}Removed bookmark for ${tweetId}`);
25
+ }
26
+ else {
27
+ failures += 1;
28
+ console.error(`${ctx.p('err')}Failed to remove bookmark for ${tweetId}: ${result.error}`);
29
+ }
30
+ }
31
+ if (failures > 0) {
32
+ process.exit(1);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=unbookmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unbookmark.js","sourceRoot":"","sources":["../../src/commands/unbookmark.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,GAAe;IACzE,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,sBAAsB,EAAE,4CAA4C,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,aAAuB,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAEtD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAE5E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,QAAQ,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,iCAAiC,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function registerUserTweetsCommand(program: Command, ctx: CliContext): void;
4
+ //# sourceMappingURL=user-tweets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-tweets.d.ts","sourceRoot":"","sources":["../../src/commands/user-tweets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAwIjF"}
@@ -0,0 +1,109 @@
1
+ import { parseNonNegativeIntFlag, parsePositiveIntFlag } from '../cli/pagination.js';
2
+ import { normalizeHandle } from '../lib/normalize-handle.js';
3
+ import { TwitterClient } from '../lib/twitter-client.js';
4
+ export function registerUserTweetsCommand(program, ctx) {
5
+ const formatExample = (cmd, desc) => ` ${ctx.colors.command(cmd)}\n ${ctx.colors.muted(desc)}`;
6
+ program
7
+ .command('user-tweets')
8
+ .description("Get tweets from a user's profile timeline")
9
+ .argument('<handle>', 'Username to fetch tweets from (e.g., @steipete or steipete)')
10
+ .option('-n, --count <number>', 'Number of tweets to fetch', '20')
11
+ .option('--max-pages <number>', 'Stop after N pages (max: 10)')
12
+ .option('--delay <ms>', 'Delay in ms between page fetches', '1000')
13
+ .option('--cursor <string>', 'Resume pagination from a cursor')
14
+ .option('--json', 'Output as JSON')
15
+ .option('--json-full', 'Output as JSON with full raw API response in _raw field')
16
+ .addHelpText('after', () => `\n${ctx.colors.section('Command Examples')}\n${[
17
+ formatExample('bird user-tweets @steipete', 'Get recent tweets from a user'),
18
+ formatExample('bird user-tweets steipete -n 10', 'Get 10 tweets (@ is optional)'),
19
+ formatExample('bird user-tweets @steipete -n 50', 'Fetch 50 tweets (paged)'),
20
+ formatExample('bird user-tweets @steipete --max-pages 3 -n 200', 'Safety cap (max 3 pages)'),
21
+ formatExample('bird user-tweets @steipete --json', 'Output as JSON'),
22
+ formatExample('bird user-tweets @steipete --cursor "DAABCg..."', 'Resume from cursor'),
23
+ ].join('\n')}`)
24
+ .action(async (handle, cmdOpts) => {
25
+ const opts = program.opts();
26
+ const timeoutMs = ctx.resolveTimeoutFromOptions(opts);
27
+ const quoteDepth = ctx.resolveQuoteDepthFromOptions(opts);
28
+ const count = Number.parseInt(cmdOpts.count || '20', 10);
29
+ const maxPagesParsed = parsePositiveIntFlag(cmdOpts.maxPages, '--max-pages');
30
+ if (!maxPagesParsed.ok) {
31
+ console.error(`${ctx.p('err')}${maxPagesParsed.error}`);
32
+ process.exit(2);
33
+ }
34
+ const maxPages = maxPagesParsed.value;
35
+ const delayParsed = parseNonNegativeIntFlag(cmdOpts.delay, '--delay', 1000);
36
+ if (!delayParsed.ok) {
37
+ console.error(`${ctx.p('err')}${delayParsed.error}`);
38
+ process.exit(2);
39
+ }
40
+ const pageDelayMs = delayParsed.value;
41
+ // Validate inputs
42
+ if (!Number.isFinite(count) || count <= 0) {
43
+ console.error(`${ctx.p('err')}Invalid --count. Expected a positive integer.`);
44
+ process.exit(2);
45
+ }
46
+ const pageSize = 20;
47
+ const hardMaxPages = 10;
48
+ const hardMaxTweets = pageSize * hardMaxPages;
49
+ if (count > hardMaxTweets) {
50
+ console.error(`${ctx.p('err')}Invalid --count. Max ${hardMaxTweets} tweets per run (safety cap: ${hardMaxPages} pages). Use --cursor to continue.`);
51
+ process.exit(2);
52
+ }
53
+ if (maxPages !== undefined && maxPages > hardMaxPages) {
54
+ console.error(`${ctx.p('err')}Invalid --max-pages. Expected a positive integer (max: ${hardMaxPages}).`);
55
+ process.exit(2);
56
+ }
57
+ // Normalize handle (strip @ if present)
58
+ const username = normalizeHandle(handle);
59
+ if (!username) {
60
+ console.error(`${ctx.p('err')}Invalid handle: ${handle}`);
61
+ process.exit(2);
62
+ }
63
+ const { cookies, warnings } = await ctx.resolveCredentialsFromOptions(opts);
64
+ for (const warning of warnings) {
65
+ console.error(`${ctx.p('warn')}${warning}`);
66
+ }
67
+ if (!cookies.authToken || !cookies.ct0) {
68
+ console.error(`${ctx.p('err')}Missing required credentials`);
69
+ process.exit(1);
70
+ }
71
+ const client = new TwitterClient({ cookies, timeoutMs, quoteDepth });
72
+ // Look up user ID from username
73
+ console.error(`${ctx.p('info')}Looking up @${username}...`);
74
+ const userLookup = await client.getUserIdByUsername(username);
75
+ if (!userLookup.success || !userLookup.userId) {
76
+ console.error(`${ctx.p('err')}${userLookup.error || `Could not find user @${username}`}`);
77
+ process.exit(1);
78
+ }
79
+ const displayName = userLookup.name
80
+ ? `${userLookup.name} (@${userLookup.username})`
81
+ : `@${userLookup.username}`;
82
+ console.error(`${ctx.p('info')}Fetching tweets from ${displayName}...`);
83
+ const includeRaw = cmdOpts.jsonFull ?? false;
84
+ const wantsPaginationOutput = Boolean(cmdOpts.cursor) || maxPages !== undefined || count > pageSize;
85
+ const result = await client.getUserTweetsPaged(userLookup.userId, count, {
86
+ includeRaw,
87
+ maxPages,
88
+ cursor: cmdOpts.cursor,
89
+ pageDelayMs,
90
+ });
91
+ if (result.success) {
92
+ const isJson = Boolean(cmdOpts.json || cmdOpts.jsonFull);
93
+ ctx.printTweetsResult(result, {
94
+ json: isJson,
95
+ usePagination: wantsPaginationOutput,
96
+ emptyMessage: `No tweets found for @${username}.`,
97
+ });
98
+ // Show pagination hint if there's more
99
+ if (result.nextCursor && !cmdOpts.json && !cmdOpts.jsonFull) {
100
+ console.error(`${ctx.p('info')}More tweets available. Use --cursor "${result.nextCursor}" to continue.`);
101
+ }
102
+ }
103
+ else {
104
+ console.error(`${ctx.p('err')}Failed to fetch tweets: ${result.error}`);
105
+ process.exit(1);
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=user-tweets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-tweets.js","sourceRoot":"","sources":["../../src/commands/user-tweets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function registerUserCommands(program: Command, ctx: CliContext): void;
4
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAwMnD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAkL5E"}