@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.
- package/CHANGELOG.md +176 -0
- package/LICENSE +21 -0
- package/README.md +388 -0
- package/dist/cli/pagination.d.ts +35 -0
- package/dist/cli/pagination.d.ts.map +1 -0
- package/dist/cli/pagination.js +43 -0
- package/dist/cli/pagination.js.map +1 -0
- package/dist/cli/program.d.ts +5 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +113 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/shared.d.ts +77 -0
- package/dist/cli/shared.d.ts.map +1 -0
- package/dist/cli/shared.js +327 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/bookmarks.d.ts +4 -0
- package/dist/commands/bookmarks.d.ts.map +1 -0
- package/dist/commands/bookmarks.js +189 -0
- package/dist/commands/bookmarks.js.map +1 -0
- package/dist/commands/check.d.ts +4 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +43 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/follow.d.ts +4 -0
- package/dist/commands/follow.d.ts.map +1 -0
- package/dist/commands/follow.js +91 -0
- package/dist/commands/follow.js.map +1 -0
- package/dist/commands/help.d.ts +4 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +19 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/home.d.ts +4 -0
- package/dist/commands/home.d.ts.map +1 -0
- package/dist/commands/home.js +43 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/lists.d.ts +4 -0
- package/dist/commands/lists.d.ts.map +1 -0
- package/dist/commands/lists.js +213 -0
- package/dist/commands/lists.js.map +1 -0
- package/dist/commands/news.d.ts +4 -0
- package/dist/commands/news.d.ts.map +1 -0
- package/dist/commands/news.js +131 -0
- package/dist/commands/news.js.map +1 -0
- package/dist/commands/post.d.ts +4 -0
- package/dist/commands/post.d.ts.map +1 -0
- package/dist/commands/post.js +101 -0
- package/dist/commands/post.js.map +1 -0
- package/dist/commands/query-ids.d.ts +4 -0
- package/dist/commands/query-ids.d.ts.map +1 -0
- package/dist/commands/query-ids.js +80 -0
- package/dist/commands/query-ids.js.map +1 -0
- package/dist/commands/read.d.ts +4 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +152 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +115 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/unbookmark.d.ts +4 -0
- package/dist/commands/unbookmark.d.ts.map +1 -0
- package/dist/commands/unbookmark.js +36 -0
- package/dist/commands/unbookmark.js.map +1 -0
- package/dist/commands/user-tweets.d.ts +4 -0
- package/dist/commands/user-tweets.d.ts.map +1 -0
- package/dist/commands/user-tweets.js +109 -0
- package/dist/commands/user-tweets.js.map +1 -0
- package/dist/commands/users.d.ts +4 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +295 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cli-args.d.ts +7 -0
- package/dist/lib/cli-args.d.ts.map +1 -0
- package/dist/lib/cli-args.js +25 -0
- package/dist/lib/cli-args.js.map +1 -0
- package/dist/lib/cookies.d.ts +31 -0
- package/dist/lib/cookies.d.ts.map +1 -0
- package/dist/lib/cookies.js +173 -0
- package/dist/lib/cookies.js.map +1 -0
- package/dist/lib/extract-bookmark-folder-id.d.ts +2 -0
- package/dist/lib/extract-bookmark-folder-id.d.ts.map +1 -0
- package/dist/lib/extract-bookmark-folder-id.js +20 -0
- package/dist/lib/extract-bookmark-folder-id.js.map +1 -0
- package/dist/lib/extract-list-id.d.ts +2 -0
- package/dist/lib/extract-list-id.d.ts.map +1 -0
- package/dist/lib/extract-list-id.js +19 -0
- package/dist/lib/extract-list-id.js.map +1 -0
- package/dist/lib/extract-tweet-id.d.ts +2 -0
- package/dist/lib/extract-tweet-id.d.ts.map +1 -0
- package/dist/lib/extract-tweet-id.js +14 -0
- package/dist/lib/extract-tweet-id.js.map +1 -0
- package/dist/lib/features.json +17 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/normalize-handle.d.ts +6 -0
- package/dist/lib/normalize-handle.d.ts.map +1 -0
- package/dist/lib/normalize-handle.js +31 -0
- package/dist/lib/normalize-handle.js.map +1 -0
- package/dist/lib/output.d.ts +29 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +88 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/paginate-cursor.d.ts +27 -0
- package/dist/lib/paginate-cursor.d.ts.map +1 -0
- package/dist/lib/paginate-cursor.js +37 -0
- package/dist/lib/paginate-cursor.js.map +1 -0
- package/dist/lib/query-ids.json +20 -0
- package/dist/lib/runtime-features.d.ts +19 -0
- package/dist/lib/runtime-features.d.ts.map +1 -0
- package/dist/lib/runtime-features.js +151 -0
- package/dist/lib/runtime-features.js.map +1 -0
- package/dist/lib/runtime-query-ids.d.ts +33 -0
- package/dist/lib/runtime-query-ids.d.ts.map +1 -0
- package/dist/lib/runtime-query-ids.js +264 -0
- package/dist/lib/runtime-query-ids.js.map +1 -0
- package/dist/lib/thread-filters.d.ts +8 -0
- package/dist/lib/thread-filters.d.ts.map +1 -0
- package/dist/lib/thread-filters.js +124 -0
- package/dist/lib/thread-filters.js.map +1 -0
- package/dist/lib/twitter-client-base.d.ts +38 -0
- package/dist/lib/twitter-client-base.d.ts.map +1 -0
- package/dist/lib/twitter-client-base.js +129 -0
- package/dist/lib/twitter-client-base.js.map +1 -0
- package/dist/lib/twitter-client-bookmarks.d.ts +7 -0
- package/dist/lib/twitter-client-bookmarks.d.ts.map +1 -0
- package/dist/lib/twitter-client-bookmarks.js +61 -0
- package/dist/lib/twitter-client-bookmarks.js.map +1 -0
- package/dist/lib/twitter-client-constants.d.ts +44 -0
- package/dist/lib/twitter-client-constants.d.ts.map +1 -0
- package/dist/lib/twitter-client-constants.js +51 -0
- package/dist/lib/twitter-client-constants.js.map +1 -0
- package/dist/lib/twitter-client-engagement.d.ts +16 -0
- package/dist/lib/twitter-client-engagement.d.ts.map +1 -0
- package/dist/lib/twitter-client-engagement.js +81 -0
- package/dist/lib/twitter-client-engagement.js.map +1 -0
- package/dist/lib/twitter-client-features.d.ts +14 -0
- package/dist/lib/twitter-client-features.d.ts.map +1 -0
- package/dist/lib/twitter-client-features.js +347 -0
- package/dist/lib/twitter-client-features.js.map +1 -0
- package/dist/lib/twitter-client-follow.d.ts +8 -0
- package/dist/lib/twitter-client-follow.d.ts.map +1 -0
- package/dist/lib/twitter-client-follow.js +178 -0
- package/dist/lib/twitter-client-follow.js.map +1 -0
- package/dist/lib/twitter-client-home.d.ts +13 -0
- package/dist/lib/twitter-client-home.d.ts.map +1 -0
- package/dist/lib/twitter-client-home.js +138 -0
- package/dist/lib/twitter-client-home.js.map +1 -0
- package/dist/lib/twitter-client-lists.d.ts +12 -0
- package/dist/lib/twitter-client-lists.d.ts.map +1 -0
- package/dist/lib/twitter-client-lists.js +390 -0
- package/dist/lib/twitter-client-lists.js.map +1 -0
- package/dist/lib/twitter-client-media.d.ts +11 -0
- package/dist/lib/twitter-client-media.d.ts.map +1 -0
- package/dist/lib/twitter-client-media.js +136 -0
- package/dist/lib/twitter-client-media.js.map +1 -0
- package/dist/lib/twitter-client-news.d.ts +47 -0
- package/dist/lib/twitter-client-news.d.ts.map +1 -0
- package/dist/lib/twitter-client-news.js +283 -0
- package/dist/lib/twitter-client-news.js.map +1 -0
- package/dist/lib/twitter-client-posting.d.ts +8 -0
- package/dist/lib/twitter-client-posting.d.ts.map +1 -0
- package/dist/lib/twitter-client-posting.js +218 -0
- package/dist/lib/twitter-client-posting.js.map +1 -0
- package/dist/lib/twitter-client-search.d.ts +19 -0
- package/dist/lib/twitter-client-search.d.ts.map +1 -0
- package/dist/lib/twitter-client-search.js +157 -0
- package/dist/lib/twitter-client-search.js.map +1 -0
- package/dist/lib/twitter-client-timelines.d.ts +23 -0
- package/dist/lib/twitter-client-timelines.d.ts.map +1 -0
- package/dist/lib/twitter-client-timelines.js +471 -0
- package/dist/lib/twitter-client-timelines.js.map +1 -0
- package/dist/lib/twitter-client-tweet-detail.d.ts +25 -0
- package/dist/lib/twitter-client-tweet-detail.d.ts.map +1 -0
- package/dist/lib/twitter-client-tweet-detail.js +295 -0
- package/dist/lib/twitter-client-tweet-detail.js.map +1 -0
- package/dist/lib/twitter-client-types.d.ts +407 -0
- package/dist/lib/twitter-client-types.d.ts.map +1 -0
- package/dist/lib/twitter-client-types.js +2 -0
- package/dist/lib/twitter-client-types.js.map +1 -0
- package/dist/lib/twitter-client-user-lookup.d.ts +16 -0
- package/dist/lib/twitter-client-user-lookup.d.ts.map +1 -0
- package/dist/lib/twitter-client-user-lookup.js +224 -0
- package/dist/lib/twitter-client-user-lookup.js.map +1 -0
- package/dist/lib/twitter-client-user-tweets.d.ts +22 -0
- package/dist/lib/twitter-client-user-tweets.d.ts.map +1 -0
- package/dist/lib/twitter-client-user-tweets.js +154 -0
- package/dist/lib/twitter-client-user-tweets.js.map +1 -0
- package/dist/lib/twitter-client-users.d.ts +9 -0
- package/dist/lib/twitter-client-users.d.ts.map +1 -0
- package/dist/lib/twitter-client-users.js +358 -0
- package/dist/lib/twitter-client-users.js.map +1 -0
- package/dist/lib/twitter-client-utils.d.ts +173 -0
- package/dist/lib/twitter-client-utils.d.ts.map +1 -0
- package/dist/lib/twitter-client-utils.js +511 -0
- package/dist/lib/twitter-client-utils.js.map +1 -0
- package/dist/lib/twitter-client.d.ts +23 -0
- package/dist/lib/twitter-client.d.ts.map +1 -0
- package/dist/lib/twitter-client.js +21 -0
- package/dist/lib/twitter-client.js.map +1 -0
- package/dist/lib/version.d.ts +6 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +174 -0
- package/dist/lib/version.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|