@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 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,aAAa,CAAC;AAEnE,eAAO,MAAM,cAAc,aAyBzB,CAAC;AAEH,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CA+GtD"}
@@ -0,0 +1,113 @@
1
+ import { Command } from 'commander';
2
+ import { registerBookmarksCommand } from '../commands/bookmarks.js';
3
+ import { registerCheckCommand } from '../commands/check.js';
4
+ import { registerFollowCommands } from '../commands/follow.js';
5
+ import { registerHelpCommand } from '../commands/help.js';
6
+ import { registerHomeCommand } from '../commands/home.js';
7
+ import { registerListsCommand } from '../commands/lists.js';
8
+ import { registerNewsCommand } from '../commands/news.js';
9
+ import { registerPostCommands } from '../commands/post.js';
10
+ import { registerQueryIdsCommand } from '../commands/query-ids.js';
11
+ import { registerReadCommands } from '../commands/read.js';
12
+ import { registerSearchCommands } from '../commands/search.js';
13
+ import { registerUnbookmarkCommand } from '../commands/unbookmark.js';
14
+ import { registerUserTweetsCommand } from '../commands/user-tweets.js';
15
+ import { registerUserCommands } from '../commands/users.js';
16
+ import { getCliVersion } from '../lib/version.js';
17
+ import { collectCookieSource } from './shared.js';
18
+ export const KNOWN_COMMANDS = new Set([
19
+ 'tweet',
20
+ 'reply',
21
+ 'query-ids',
22
+ 'read',
23
+ 'replies',
24
+ 'thread',
25
+ 'search',
26
+ 'mentions',
27
+ 'bookmarks',
28
+ 'unbookmark',
29
+ 'follow',
30
+ 'unfollow',
31
+ 'following',
32
+ 'followers',
33
+ 'likes',
34
+ 'lists',
35
+ 'list-timeline',
36
+ 'home',
37
+ 'user-tweets',
38
+ 'news',
39
+ 'trending',
40
+ 'help',
41
+ 'whoami',
42
+ 'check',
43
+ ]);
44
+ export function createProgram(ctx) {
45
+ const program = new Command();
46
+ program.configureHelp({
47
+ showGlobalOptions: true,
48
+ styleTitle: (t) => ctx.colors.section(t),
49
+ styleUsage: (t) => ctx.colors.description(t),
50
+ styleCommandText: (t) => ctx.colors.command(t),
51
+ styleCommandDescription: (t) => ctx.colors.muted(t),
52
+ styleOptionTerm: (t) => ctx.colors.option(t),
53
+ styleOptionText: (t) => ctx.colors.option(t),
54
+ styleOptionDescription: (t) => ctx.colors.muted(t),
55
+ styleArgumentTerm: (t) => ctx.colors.argument(t),
56
+ styleArgumentText: (t) => ctx.colors.argument(t),
57
+ styleArgumentDescription: (t) => ctx.colors.muted(t),
58
+ styleSubcommandTerm: (t) => ctx.colors.command(t),
59
+ styleSubcommandText: (t) => ctx.colors.command(t),
60
+ styleSubcommandDescription: (t) => ctx.colors.muted(t),
61
+ styleDescriptionText: (t) => ctx.colors.muted(t),
62
+ });
63
+ const collect = (value, previous = []) => {
64
+ previous.push(value);
65
+ return previous;
66
+ };
67
+ program.addHelpText('beforeAll', () => `${ctx.colors.banner('bird')} ${ctx.colors.muted(getCliVersion())} ${ctx.colors.subtitle('— fast X CLI for tweeting, replying, and reading')}`);
68
+ program.name('bird').description('Post tweets and replies via Twitter/X GraphQL API').version(getCliVersion());
69
+ const formatExample = (command, description) => `${ctx.colors.command(` ${command}`)}\n${ctx.colors.muted(` ${description}`)}`;
70
+ program.addHelpText('afterAll', () => `\n${ctx.colors.section('Examples')}\n${[
71
+ formatExample('bird whoami', 'Show the logged-in account via GraphQL cookies'),
72
+ formatExample('bird --firefox-profile default-release whoami', 'Use Firefox profile cookies'),
73
+ formatExample('bird tweet "hello from bird"', 'Send a tweet'),
74
+ formatExample('bird 1234567890123456789 --json', 'Read a tweet (ID or URL shorthand for `read`) and print JSON'),
75
+ ].join('\n\n')}\n\n${ctx.colors.section('Shortcuts')}\n${[
76
+ formatExample('bird <tweet-id-or-url> [--json]', 'Shorthand for `bird read <tweet-id-or-url>`'),
77
+ ].join('\n\n')}\n\n${ctx.colors.section('JSON Output')}\n${ctx.colors.muted(` Add ${ctx.colors.option('--json')} to: read, replies, thread, search, mentions, bookmarks, likes, following, followers, about, lists, list-timeline, user-tweets, query-ids`)}\n${ctx.colors.muted(` Add ${ctx.colors.option('--json-full')} to include raw API response in ${ctx.colors.argument('_raw')} field (tweet commands only)`)}\n${ctx.colors.muted(` (Run ${ctx.colors.command('bird <command> --help')} to see per-command flags.)`)}`);
78
+ program.addHelpText('afterAll', () => `\n\n${ctx.colors.section('Config')}\n${ctx.colors.muted(` Reads ${ctx.colors.argument('~/.config/bird/config.json5')} and ${ctx.colors.argument('./.birdrc.json5')} (JSON5)`)}\n${ctx.colors.muted(` Supports: chromeProfile, chromeProfileDir, firefoxProfile, cookieSource, cookieTimeoutMs, timeoutMs, quoteDepth`)}\n\n${ctx.colors.section('Env')}\n${ctx.colors.muted(` ${ctx.colors.option('NO_COLOR')}, ${ctx.colors.option('BIRD_TIMEOUT_MS')}, ${ctx.colors.option('BIRD_COOKIE_TIMEOUT_MS')}, ${ctx.colors.option('BIRD_QUOTE_DEPTH')}`)}`);
79
+ program
80
+ .option('--auth-token <token>', 'Twitter auth_token cookie')
81
+ .option('--ct0 <token>', 'Twitter ct0 cookie')
82
+ .option('--chrome-profile <name>', 'Chrome profile name for cookie extraction', ctx.config.chromeProfile)
83
+ .option('--chrome-profile-dir <path>', 'Chrome/Chromium profile directory or cookie DB path for cookie extraction', ctx.config.chromeProfileDir)
84
+ .option('--firefox-profile <name>', 'Firefox profile name for cookie extraction', ctx.config.firefoxProfile)
85
+ .option('--cookie-timeout <ms>', 'Cookie extraction timeout in milliseconds (keychain/OS helpers)')
86
+ .option('--cookie-source <source>', 'Cookie source for browser cookie extraction (repeatable)', collectCookieSource)
87
+ .option('--media <path>', 'Attach media file (repeatable, up to 4 images or 1 video)', collect)
88
+ .option('--alt <text>', 'Alt text for the corresponding --media (repeatable)', collect)
89
+ .option('--timeout <ms>', 'Request timeout in milliseconds')
90
+ .option('--quote-depth <depth>', 'Max quoted tweet depth (default: 1; 0 disables)')
91
+ .option('--plain', 'Plain output (stable, no emoji, no color)')
92
+ .option('--no-emoji', 'Disable emoji output')
93
+ .option('--no-color', 'Disable ANSI colors (or set NO_COLOR)');
94
+ program.hook('preAction', (_thisCommand, actionCommand) => {
95
+ ctx.applyOutputFromCommand(actionCommand);
96
+ });
97
+ registerHelpCommand(program, ctx);
98
+ registerQueryIdsCommand(program, ctx);
99
+ registerPostCommands(program, ctx);
100
+ registerReadCommands(program, ctx);
101
+ registerSearchCommands(program, ctx);
102
+ registerBookmarksCommand(program, ctx);
103
+ registerUnbookmarkCommand(program, ctx);
104
+ registerFollowCommands(program, ctx);
105
+ registerListsCommand(program, ctx);
106
+ registerHomeCommand(program, ctx);
107
+ registerUserCommands(program, ctx);
108
+ registerUserTweetsCommand(program, ctx);
109
+ registerNewsCommand(program, ctx);
110
+ registerCheckCommand(program, ctx);
111
+ return program;
112
+ }
113
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { Command } from 'commander';
2
+ import { type CookieSource, resolveCredentials } from '../lib/cookies.js';
3
+ import { labelPrefix, type OutputConfig, statusPrefix } from '../lib/output.js';
4
+ import type { TweetData } from '../lib/twitter-client.js';
5
+ export type BirdConfig = {
6
+ chromeProfile?: string;
7
+ chromeProfileDir?: string;
8
+ firefoxProfile?: string;
9
+ cookieSource?: CookieSource | CookieSource[];
10
+ cookieTimeoutMs?: number;
11
+ timeoutMs?: number;
12
+ quoteDepth?: number;
13
+ };
14
+ export type MediaSpec = {
15
+ path: string;
16
+ alt?: string;
17
+ mime: string;
18
+ buffer: Buffer;
19
+ };
20
+ export type CliContext = {
21
+ isTty: boolean;
22
+ getOutput: () => OutputConfig;
23
+ colors: {
24
+ banner: (t: string) => string;
25
+ subtitle: (t: string) => string;
26
+ section: (t: string) => string;
27
+ bullet: (t: string) => string;
28
+ command: (t: string) => string;
29
+ option: (t: string) => string;
30
+ argument: (t: string) => string;
31
+ description: (t: string) => string;
32
+ muted: (t: string) => string;
33
+ accent: (t: string) => string;
34
+ };
35
+ p: (kind: Parameters<typeof statusPrefix>[0]) => string;
36
+ l: (kind: Parameters<typeof labelPrefix>[0]) => string;
37
+ config: BirdConfig;
38
+ applyOutputFromCommand: (command: Command) => void;
39
+ resolveTimeoutFromOptions: (options: {
40
+ timeout?: string | number;
41
+ }) => number | undefined;
42
+ resolveQuoteDepthFromOptions: (options: {
43
+ quoteDepth?: string | number;
44
+ }) => number | undefined;
45
+ resolveCredentialsFromOptions: (opts: CredentialsOptions) => ReturnType<typeof resolveCredentials>;
46
+ loadMedia: (opts: {
47
+ media: string[];
48
+ alts: string[];
49
+ }) => MediaSpec[];
50
+ printTweets: (tweets: TweetData[], opts?: {
51
+ json?: boolean;
52
+ emptyMessage?: string;
53
+ showSeparator?: boolean;
54
+ }) => void;
55
+ printTweetsResult: (result: {
56
+ tweets?: TweetData[];
57
+ nextCursor?: string;
58
+ }, opts: {
59
+ json: boolean;
60
+ usePagination: boolean;
61
+ emptyMessage: string;
62
+ }) => void;
63
+ extractTweetId: (tweetIdOrUrl: string) => string;
64
+ };
65
+ export declare const collectCookieSource: (value: string, previous?: CookieSource[]) => CookieSource[];
66
+ type CredentialsOptions = {
67
+ authToken?: string;
68
+ ct0?: string;
69
+ chromeProfile?: string;
70
+ chromeProfileDir?: string;
71
+ firefoxProfile?: string;
72
+ cookieSource?: CookieSource[];
73
+ cookieTimeout?: string | number;
74
+ };
75
+ export declare function createCliContext(normalizedArgs: string[], env?: NodeJS.ProcessEnv): CliContext;
76
+ export {};
77
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,327 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import JSON5 from 'json5';
5
+ import kleur from 'kleur';
6
+ import { resolveCredentials } from '../lib/cookies.js';
7
+ import { extractTweetId } from '../lib/extract-tweet-id.js';
8
+ import { hyperlink, labelPrefix, resolveOutputConfigFromArgv, resolveOutputConfigFromCommander, statusPrefix, } from '../lib/output.js';
9
+ const COOKIE_SOURCES = ['safari', 'chrome', 'firefox'];
10
+ function parseCookieSource(value) {
11
+ const normalized = value.trim().toLowerCase();
12
+ if (normalized === 'safari' || normalized === 'chrome' || normalized === 'firefox') {
13
+ return normalized;
14
+ }
15
+ throw new Error(`Invalid --cookie-source "${value}". Allowed: safari, chrome, firefox.`);
16
+ }
17
+ export const collectCookieSource = (value, previous = []) => {
18
+ previous.push(parseCookieSource(value));
19
+ return previous;
20
+ };
21
+ function resolveCookieSourceOrder(input) {
22
+ if (typeof input === 'string') {
23
+ return [parseCookieSource(input)];
24
+ }
25
+ if (Array.isArray(input)) {
26
+ const result = [];
27
+ for (const entry of input) {
28
+ if (typeof entry !== 'string') {
29
+ continue;
30
+ }
31
+ result.push(parseCookieSource(entry));
32
+ }
33
+ return result.length > 0 ? result : undefined;
34
+ }
35
+ return undefined;
36
+ }
37
+ function resolveTimeoutMs(...values) {
38
+ for (const value of values) {
39
+ if (value === undefined || value === null || value === '') {
40
+ continue;
41
+ }
42
+ const parsed = typeof value === 'number' ? value : Number(value);
43
+ if (Number.isFinite(parsed) && parsed > 0) {
44
+ return parsed;
45
+ }
46
+ }
47
+ return undefined;
48
+ }
49
+ function resolveQuoteDepth(...values) {
50
+ for (const value of values) {
51
+ if (value === undefined || value === null || value === '') {
52
+ continue;
53
+ }
54
+ const parsed = typeof value === 'number' ? value : Number.parseInt(value, 10);
55
+ if (Number.isFinite(parsed) && parsed >= 0) {
56
+ return Math.floor(parsed);
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ function detectMime(path) {
62
+ const ext = path.toLowerCase();
63
+ if (ext.endsWith('.jpg') || ext.endsWith('.jpeg')) {
64
+ return 'image/jpeg';
65
+ }
66
+ if (ext.endsWith('.png')) {
67
+ return 'image/png';
68
+ }
69
+ if (ext.endsWith('.webp')) {
70
+ return 'image/webp';
71
+ }
72
+ if (ext.endsWith('.gif')) {
73
+ return 'image/gif';
74
+ }
75
+ if (ext.endsWith('.mp4') || ext.endsWith('.m4v')) {
76
+ return 'video/mp4';
77
+ }
78
+ if (ext.endsWith('.mov')) {
79
+ return 'video/quicktime';
80
+ }
81
+ return null;
82
+ }
83
+ function readConfigFile(path, warn) {
84
+ if (!existsSync(path)) {
85
+ return {};
86
+ }
87
+ try {
88
+ const raw = readFileSync(path, 'utf8');
89
+ const parsed = JSON5.parse(raw);
90
+ return parsed ?? {};
91
+ }
92
+ catch (error) {
93
+ warn(`Failed to parse config at ${path}: ${error instanceof Error ? error.message : String(error)}`);
94
+ return {};
95
+ }
96
+ }
97
+ function loadConfig(warn) {
98
+ const globalPath = join(homedir(), '.config', 'bird', 'config.json5');
99
+ const localPath = join(process.cwd(), '.birdrc.json5');
100
+ return {
101
+ ...readConfigFile(globalPath, warn),
102
+ ...readConfigFile(localPath, warn),
103
+ };
104
+ }
105
+ export function createCliContext(normalizedArgs, env = process.env) {
106
+ const isTty = process.stdout.isTTY;
107
+ let output = resolveOutputConfigFromArgv(normalizedArgs, env, isTty);
108
+ kleur.enabled = output.color;
109
+ const wrap = (styler) => (text) => isTty ? styler(text) : text;
110
+ const colors = {
111
+ banner: wrap((t) => kleur.bold().blue(t)),
112
+ subtitle: wrap((t) => kleur.dim(t)),
113
+ section: wrap((t) => kleur.bold().white(t)),
114
+ bullet: wrap((t) => kleur.blue(t)),
115
+ command: wrap((t) => kleur.bold().cyan(t)),
116
+ option: wrap((t) => kleur.cyan(t)),
117
+ argument: wrap((t) => kleur.magenta(t)),
118
+ description: wrap((t) => kleur.white(t)),
119
+ muted: wrap((t) => kleur.gray(t)),
120
+ accent: wrap((t) => kleur.green(t)),
121
+ };
122
+ const p = (kind) => {
123
+ const prefix = statusPrefix(kind, output);
124
+ if (output.plain || !output.color) {
125
+ return prefix;
126
+ }
127
+ if (kind === 'ok') {
128
+ return kleur.green(prefix);
129
+ }
130
+ if (kind === 'warn') {
131
+ return kleur.yellow(prefix);
132
+ }
133
+ if (kind === 'err') {
134
+ return kleur.red(prefix);
135
+ }
136
+ if (kind === 'info') {
137
+ return kleur.cyan(prefix);
138
+ }
139
+ return kleur.gray(prefix);
140
+ };
141
+ const l = (kind) => {
142
+ const prefix = labelPrefix(kind, output);
143
+ if (output.plain || !output.color) {
144
+ return prefix;
145
+ }
146
+ if (kind === 'url') {
147
+ return kleur.cyan(prefix);
148
+ }
149
+ if (kind === 'date') {
150
+ return kleur.magenta(prefix);
151
+ }
152
+ if (kind === 'source') {
153
+ return kleur.gray(prefix);
154
+ }
155
+ if (kind === 'engine') {
156
+ return kleur.blue(prefix);
157
+ }
158
+ if (kind === 'credentials') {
159
+ return kleur.yellow(prefix);
160
+ }
161
+ if (kind === 'user') {
162
+ return kleur.cyan(prefix);
163
+ }
164
+ if (kind === 'userId') {
165
+ return kleur.magenta(prefix);
166
+ }
167
+ if (kind === 'email') {
168
+ return kleur.green(prefix);
169
+ }
170
+ return kleur.gray(prefix);
171
+ };
172
+ const config = loadConfig((message) => {
173
+ console.error(colors.muted(`${p('warn')}${message}`));
174
+ });
175
+ function applyOutputFromCommand(command) {
176
+ const opts = command.optsWithGlobals();
177
+ output = resolveOutputConfigFromCommander(opts, env, isTty);
178
+ kleur.enabled = output.color;
179
+ }
180
+ function resolveTimeoutFromOptions(options) {
181
+ return resolveTimeoutMs(options.timeout, config.timeoutMs, env.BIRD_TIMEOUT_MS);
182
+ }
183
+ function resolveCookieTimeoutFromOptions(options) {
184
+ return resolveTimeoutMs(options.cookieTimeout, config.cookieTimeoutMs, env.BIRD_COOKIE_TIMEOUT_MS);
185
+ }
186
+ function resolveQuoteDepthFromOptions(options) {
187
+ return resolveQuoteDepth(options.quoteDepth, config.quoteDepth, env.BIRD_QUOTE_DEPTH);
188
+ }
189
+ function resolveCredentialsFromOptions(opts) {
190
+ const cookieSource = opts.cookieSource?.length
191
+ ? opts.cookieSource
192
+ : (resolveCookieSourceOrder(config.cookieSource) ?? COOKIE_SOURCES);
193
+ const chromeProfile = opts.chromeProfileDir || opts.chromeProfile || config.chromeProfileDir || config.chromeProfile;
194
+ return resolveCredentials({
195
+ authToken: opts.authToken,
196
+ ct0: opts.ct0,
197
+ cookieSource,
198
+ chromeProfile,
199
+ firefoxProfile: opts.firefoxProfile || config.firefoxProfile,
200
+ cookieTimeoutMs: resolveCookieTimeoutFromOptions(opts),
201
+ });
202
+ }
203
+ function loadMedia(opts) {
204
+ if (opts.media.length === 0) {
205
+ return [];
206
+ }
207
+ const specs = [];
208
+ for (const [index, path] of opts.media.entries()) {
209
+ const mime = detectMime(path);
210
+ if (!mime) {
211
+ throw new Error(`Unsupported media type for ${path}. Supported: jpg, jpeg, png, webp, gif, mp4, mov`);
212
+ }
213
+ const buffer = readFileSync(path);
214
+ specs.push({ path, mime, buffer, alt: opts.alts[index] });
215
+ }
216
+ const videoCount = specs.filter((m) => m.mime.startsWith('video/')).length;
217
+ if (videoCount > 1) {
218
+ throw new Error('Only one video can be attached');
219
+ }
220
+ if (videoCount === 1 && specs.length > 1) {
221
+ throw new Error('Video cannot be combined with other media');
222
+ }
223
+ if (specs.length > 4) {
224
+ throw new Error('Maximum 4 media attachments');
225
+ }
226
+ return specs;
227
+ }
228
+ function printTweets(tweets, opts = {}) {
229
+ if (opts.json) {
230
+ console.log(JSON.stringify(tweets, null, 2));
231
+ return;
232
+ }
233
+ if (tweets.length === 0) {
234
+ console.log(opts.emptyMessage ?? 'No tweets found.');
235
+ return;
236
+ }
237
+ const useEmoji = output.emoji && !output.plain;
238
+ const articleLabel = useEmoji ? '📰' : 'Article:';
239
+ const mediaLabel = (type) => {
240
+ if (useEmoji) {
241
+ return type === 'video' ? '🎬' : type === 'animated_gif' ? '🔄' : '🖼️';
242
+ }
243
+ return type === 'video' ? 'VIDEO:' : type === 'animated_gif' ? 'GIF:' : 'PHOTO:';
244
+ };
245
+ const quotePrefix = useEmoji ? { top: '┌─', mid: '│ ', bot: '└─' } : { top: '> ', mid: '> ', bot: '> ' };
246
+ for (const tweet of tweets) {
247
+ console.log(`\n@${tweet.author.username} (${tweet.author.name}):`);
248
+ // Display tweet text, with article indicator if present
249
+ if (tweet.article) {
250
+ // Full body mode: text starts with article title (from extractArticleText)
251
+ // Preview mode: text is short tweet intro that doesn't start with title
252
+ const hasFullBody = tweet.text.startsWith(tweet.article.title);
253
+ if (hasFullBody) {
254
+ console.log(`${articleLabel} ${tweet.text}`);
255
+ }
256
+ else {
257
+ console.log(`${articleLabel} ${tweet.article.title}`);
258
+ if (tweet.article.previewText) {
259
+ console.log(` ${tweet.article.previewText}`);
260
+ }
261
+ }
262
+ }
263
+ else {
264
+ console.log(tweet.text);
265
+ }
266
+ // Display media attachments
267
+ if (tweet.media && tweet.media.length > 0) {
268
+ for (const m of tweet.media) {
269
+ console.log(`${mediaLabel(m.type)} ${m.url}`);
270
+ }
271
+ }
272
+ // Display quoted tweet
273
+ if (tweet.quotedTweet) {
274
+ console.log(`${quotePrefix.top} QT @${tweet.quotedTweet.author.username}:`);
275
+ const qtText = tweet.quotedTweet.article
276
+ ? `${articleLabel} ${tweet.quotedTweet.article.title}`
277
+ : tweet.quotedTweet.text;
278
+ // Indent and truncate quoted tweet text
279
+ const maxLen = 280;
280
+ const truncated = qtText.length > maxLen ? `${qtText.slice(0, maxLen)}...` : qtText;
281
+ for (const line of truncated.split('\n').slice(0, 4)) {
282
+ console.log(`${quotePrefix.mid}${line}`);
283
+ }
284
+ // Display quoted tweet media
285
+ if (tweet.quotedTweet.media && tweet.quotedTweet.media.length > 0) {
286
+ for (const m of tweet.quotedTweet.media) {
287
+ console.log(`${quotePrefix.mid}${mediaLabel(m.type)} ${m.url}`);
288
+ }
289
+ }
290
+ console.log(`${quotePrefix.bot} https://x.com/${tweet.quotedTweet.author.username}/status/${tweet.quotedTweet.id}`);
291
+ }
292
+ if (tweet.createdAt) {
293
+ console.log(`${l('date')}${tweet.createdAt}`);
294
+ }
295
+ const tweetUrl = `https://x.com/${tweet.author.username}/status/${tweet.id}`;
296
+ console.log(`${l('url')}${hyperlink(tweetUrl, tweetUrl, output)}`);
297
+ if (opts.showSeparator ?? true) {
298
+ console.log('─'.repeat(50));
299
+ }
300
+ }
301
+ }
302
+ function printTweetsResult(result, opts) {
303
+ const tweets = result.tweets ?? [];
304
+ if (opts.json && opts.usePagination) {
305
+ console.log(JSON.stringify({ tweets, nextCursor: result.nextCursor ?? null }, null, 2));
306
+ return;
307
+ }
308
+ printTweets(tweets, { json: opts.json, emptyMessage: opts.emptyMessage });
309
+ }
310
+ return {
311
+ isTty,
312
+ getOutput: () => output,
313
+ colors,
314
+ p,
315
+ l,
316
+ config,
317
+ applyOutputFromCommand,
318
+ resolveTimeoutFromOptions,
319
+ resolveQuoteDepthFromOptions,
320
+ resolveCredentialsFromOptions,
321
+ loadMedia,
322
+ printTweets,
323
+ printTweetsResult,
324
+ extractTweetId,
325
+ };
326
+ }
327
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bird - CLI tool for posting tweets and replies
4
+ *
5
+ * Usage:
6
+ * bird tweet "Hello world!"
7
+ * bird reply <tweet-id> "This is a reply"
8
+ * bird reply <tweet-url> "This is a reply"
9
+ * bird read <tweet-id-or-url>
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/cli.js ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bird - CLI tool for posting tweets and replies
4
+ *
5
+ * Usage:
6
+ * bird tweet "Hello world!"
7
+ * bird reply <tweet-id> "This is a reply"
8
+ * bird reply <tweet-url> "This is a reply"
9
+ * bird read <tweet-id-or-url>
10
+ */
11
+ import { createProgram, KNOWN_COMMANDS } from './cli/program.js';
12
+ import { createCliContext } from './cli/shared.js';
13
+ import { resolveCliInvocation } from './lib/cli-args.js';
14
+ const rawArgs = process.argv.slice(2);
15
+ const normalizedArgs = rawArgs[0] === '--' ? rawArgs.slice(1) : rawArgs;
16
+ const ctx = createCliContext(normalizedArgs);
17
+ const program = createProgram(ctx);
18
+ const { argv, showHelp } = resolveCliInvocation(normalizedArgs, KNOWN_COMMANDS);
19
+ if (showHelp) {
20
+ program.outputHelp();
21
+ process.exit(0);
22
+ }
23
+ if (argv) {
24
+ program.parse(argv);
25
+ }
26
+ else {
27
+ program.parse(['node', 'bird', ...normalizedArgs]);
28
+ }
29
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,OAAO,GAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,cAAc,GAAa,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAElF,MAAM,GAAG,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAE7C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAEnC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAEhF,IAAI,QAAQ,EAAE,CAAC;IACb,OAAO,CAAC,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,EAAE,CAAC;IACT,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function registerBookmarksCommand(program: Command, ctx: CliContext): void;
4
+ //# sourceMappingURL=bookmarks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookmarks.d.ts","sourceRoot":"","sources":["../../src/commands/bookmarks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAsOhF"}