@harveyrandall/bsky-cli 1.0.0 → 1.1.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/README.md CHANGED
@@ -27,7 +27,7 @@ bun add -g @harveyrandall/bsky-cli
27
27
  ### Homebrew (macOS / Linux)
28
28
 
29
29
  ```bash
30
- brew install harveyrandall/bsky-cli
30
+ brew install harveyrandall/tools/bsky-cli
31
31
  ```
32
32
 
33
33
  ### Download a binary
@@ -171,6 +171,19 @@ bsky report <handle> [--comment text]
171
171
  bsky mod-list <handles...> [--name] [--desc]
172
172
  ```
173
173
 
174
+ ### Direct Messages
175
+
176
+ ```
177
+ bsky dm list [--unread] [--requests] [-n count]
178
+ bsky dm read <handle> [-n count]
179
+ bsky dm send <handle> <text...>
180
+ bsky dm delete <handle> <messageId>
181
+ bsky dm accept <handle>
182
+ bsky dm mark-read <handle>
183
+ bsky dm mute <handle>
184
+ bsky dm unmute <handle>
185
+ ```
186
+
174
187
  ### Utilities
175
188
 
176
189
  ```
@@ -215,7 +228,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full contributor guide.
215
228
 
216
229
  ## Roadmap
217
230
 
218
- - [ ] Direct messages
231
+ - [x] Direct messages
219
232
  - [ ] List creation and management
220
233
  - [ ] Starter packs
221
234
  - [ ] Moderation lists
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { Command } from "commander";
4
+ import { Command as Command2 } from "commander";
5
5
 
6
6
  // src/config.ts
7
7
  import { readFile, writeFile, mkdir } from "fs/promises";
@@ -267,6 +267,45 @@ function printStreamPost(did, handle, text, rkey, collection) {
267
267
  console.log(` at://${did}/${collection}/${rkey}`);
268
268
  console.log();
269
269
  }
270
+ function printConvo(convo, myDid) {
271
+ const others = convo.members.filter((m) => m.did !== myDid);
272
+ const names = others.map((m) => m.handle).join(", ");
273
+ process.stdout.write(chalk.redBright(names));
274
+ if (convo.unreadCount > 0) {
275
+ process.stdout.write(chalk.yellow(` (${convo.unreadCount} unread)`));
276
+ }
277
+ if (convo.muted) {
278
+ process.stdout.write(chalk.gray(" [muted]"));
279
+ }
280
+ if (convo.status === "request") {
281
+ process.stdout.write(chalk.magenta(" [request]"));
282
+ }
283
+ console.log();
284
+ if (convo.lastMessage && "text" in convo.lastMessage && convo.lastMessage.text) {
285
+ const preview = convo.lastMessage.text.length > 80 ? convo.lastMessage.text.slice(0, 80) + "..." : convo.lastMessage.text;
286
+ console.log(` ${preview}`);
287
+ if (convo.lastMessage.sentAt) {
288
+ console.log(` ${chalk.gray(formatTime(convo.lastMessage.sentAt))}`);
289
+ }
290
+ }
291
+ process.stdout.write(" - ");
292
+ console.log(chalk.blue(convo.id));
293
+ console.log();
294
+ }
295
+ function printMessage(message, members) {
296
+ const sender = members.find((m) => m.did === message.sender.did);
297
+ const senderName = sender?.handle ?? message.sender.did;
298
+ process.stdout.write(chalk.redBright(senderName));
299
+ console.log(` (${formatTime(message.sentAt)})`);
300
+ if ("text" in message && message.text) {
301
+ console.log(message.text);
302
+ } else {
303
+ console.log(chalk.gray("[deleted]"));
304
+ }
305
+ process.stdout.write(" - ");
306
+ console.log(chalk.blue(message.id));
307
+ console.log();
308
+ }
270
309
  function outputJson(data) {
271
310
  console.log(JSON.stringify(data));
272
311
  }
@@ -1557,9 +1596,111 @@ function registerCompletions(program2) {
1557
1596
  });
1558
1597
  }
1559
1598
 
1599
+ // src/commands/dm.ts
1600
+ import { Command } from "commander";
1601
+ import { ChatBskyConvoDefs } from "@atproto/api";
1602
+ async function resolveConvoId(agent, handle) {
1603
+ const did = handle.startsWith("did:") ? handle : (await agent.getProfile({ actor: handle })).data.did;
1604
+ const resp = await agent.chat.bsky.convo.getConvoForMembers({
1605
+ members: [agent.session.did, did]
1606
+ });
1607
+ return resp.data.convo.id;
1608
+ }
1609
+ function registerDm(program2) {
1610
+ const dm = new Command("dm").description("Direct messages");
1611
+ dm.command("list").description("List DM conversations").option("--unread", "Show only unread conversations").option("--requests", "Show conversation requests").option("-n <count>", "Number of conversations", "50").action(async (opts) => {
1612
+ const agent = await getClient(program2);
1613
+ const json = isJson(program2);
1614
+ const limit = parseInt(opts.n, 10);
1615
+ let cursor;
1616
+ let count = 0;
1617
+ while (true) {
1618
+ const resp = await agent.chat.bsky.convo.listConvos({
1619
+ cursor,
1620
+ limit: Math.min(limit - count, 100),
1621
+ readState: opts.unread ? "unread" : void 0,
1622
+ status: opts.requests ? "request" : void 0
1623
+ });
1624
+ for (const convo of resp.data.convos) {
1625
+ if (json) {
1626
+ outputJson(convo);
1627
+ } else {
1628
+ printConvo(convo, agent.session.did);
1629
+ }
1630
+ count++;
1631
+ if (count >= limit) break;
1632
+ }
1633
+ cursor = resp.data.cursor;
1634
+ if (!cursor || count >= limit) break;
1635
+ }
1636
+ });
1637
+ dm.command("read").description("Read messages in a conversation").argument("<handle>", "Handle or DID of the other user").option("-n <count>", "Number of messages", "30").action(async (handle, opts) => {
1638
+ const agent = await getClient(program2);
1639
+ const json = isJson(program2);
1640
+ const limit = parseInt(opts.n, 10);
1641
+ const convoId = await resolveConvoId(agent, handle);
1642
+ const convoResp = await agent.chat.bsky.convo.getConvo({ convoId });
1643
+ const members = convoResp.data.convo.members;
1644
+ const resp = await agent.chat.bsky.convo.getMessages({
1645
+ convoId,
1646
+ limit
1647
+ });
1648
+ const messages = [...resp.data.messages].reverse();
1649
+ for (const msg of messages) {
1650
+ if (json) {
1651
+ outputJson(msg);
1652
+ } else if (ChatBskyConvoDefs.isMessageView(msg) || ChatBskyConvoDefs.isDeletedMessageView(msg)) {
1653
+ printMessage(msg, members);
1654
+ }
1655
+ }
1656
+ });
1657
+ dm.command("send").description("Send a direct message").argument("<handle>", "Handle or DID of the recipient").argument("<text...>", "Message text").action(async (handle, textParts) => {
1658
+ const text = textParts.join(" ");
1659
+ if (!text.trim()) {
1660
+ program2.error("message text is required");
1661
+ }
1662
+ const agent = await getClient(program2);
1663
+ const convoId = await resolveConvoId(agent, handle);
1664
+ const resp = await agent.chat.bsky.convo.sendMessage({
1665
+ convoId,
1666
+ message: { text }
1667
+ });
1668
+ console.log(resp.data.id);
1669
+ });
1670
+ dm.command("delete").description("Delete a message for yourself").argument("<handle>", "Handle or DID of the conversation partner").argument("<messageId>", "Message ID to delete").action(async (handle, messageId) => {
1671
+ const agent = await getClient(program2);
1672
+ const convoId = await resolveConvoId(agent, handle);
1673
+ await agent.chat.bsky.convo.deleteMessageForSelf({
1674
+ convoId,
1675
+ messageId
1676
+ });
1677
+ });
1678
+ dm.command("accept").description("Accept a conversation request").argument("<handle>", "Handle or DID of the requesting user").action(async (handle) => {
1679
+ const agent = await getClient(program2);
1680
+ const convoId = await resolveConvoId(agent, handle);
1681
+ await agent.chat.bsky.convo.acceptConvo({ convoId });
1682
+ });
1683
+ dm.command("mark-read").description("Mark a conversation as read").argument("<handle>", "Handle or DID of the conversation partner").action(async (handle) => {
1684
+ const agent = await getClient(program2);
1685
+ const convoId = await resolveConvoId(agent, handle);
1686
+ await agent.chat.bsky.convo.updateRead({ convoId });
1687
+ });
1688
+ dm.command("mute").description("Mute a conversation").argument("<handle>", "Handle or DID of the conversation partner").action(async (handle) => {
1689
+ const agent = await getClient(program2);
1690
+ const convoId = await resolveConvoId(agent, handle);
1691
+ await agent.chat.bsky.convo.muteConvo({ convoId });
1692
+ });
1693
+ dm.command("unmute").description("Unmute a conversation").argument("<handle>", "Handle or DID of the conversation partner").action(async (handle) => {
1694
+ const agent = await getClient(program2);
1695
+ const convoId = await resolveConvoId(agent, handle);
1696
+ await agent.chat.bsky.convo.unmuteConvo({ convoId });
1697
+ });
1698
+ program2.addCommand(dm);
1699
+ }
1700
+
1560
1701
  // src/index.ts
1561
- var program = new Command();
1562
- program.name("bsky").description("A CLI client for Bluesky").version("1.0.0").option("--json", "Output as JSON").option("-p, --profile <name>", "Profile name").option("-v, --verbose", "Verbose output");
1702
+ var program = new Command2();
1703
+ program.name("bsky").description("A CLI client for Bluesky").version("1.1.0").option("--json", "Output as JSON").option("-p, --profile <name>", "Profile name").option("-v, --verbose", "Verbose output");
1563
1704
  function resolveProfile(program2) {
1564
1705
  return program2.opts().profile ?? process.env.BSKY_PROFILE;
1565
1706
  }
@@ -1608,6 +1749,7 @@ registerBookmarks(program);
1608
1749
  registerAppPassword(program);
1609
1750
  registerInviteCodes(program);
1610
1751
  registerCompletions(program);
1752
+ registerDm(program);
1611
1753
  program.parseAsync(process.argv).catch((err) => {
1612
1754
  console.error(err.message ?? err);
1613
1755
  process.exit(1);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/client.ts","../src/auth.ts","../src/commands/login.ts","../src/commands/timeline.ts","../src/lib/format.ts","../src/commands/thread.ts","../src/commands/post.ts","../src/lib/extract.ts","../src/commands/delete.ts","../src/commands/like.ts","../src/commands/repost.ts","../src/commands/social.ts","../src/commands/search.ts","../src/commands/profile.ts","../src/commands/notification.ts","../src/commands/moderation.ts","../src/commands/bookmark.ts","../src/commands/password.ts","../src/commands/invite.ts","../src/commands/completions.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { loadConfig } from \"@/config\";\nimport { createClient } from \"@/client\";\nimport { registerLogin } from \"@/commands/login\";\nimport { registerTimeline, registerStream } from \"@/commands/timeline\";\nimport { registerThread } from \"@/commands/thread\";\nimport { registerPost, registerReply, registerQuote } from \"@/commands/post\";\nimport { registerDelete } from \"@/commands/delete\";\nimport { registerLike, registerLikes } from \"@/commands/like\";\nimport { registerRepost, registerReposts } from \"@/commands/repost\";\nimport {\n registerFollow,\n registerUnfollow,\n registerFollows,\n registerFollowers,\n registerBlock,\n registerUnblock,\n registerBlocks,\n registerMute,\n} from \"@/commands/social\";\nimport { registerSearch, registerSearchUsers } from \"@/commands/search\";\nimport {\n registerProfile,\n registerProfileUpdate,\n registerSession,\n} from \"@/commands/profile\";\nimport { registerNotifs } from \"@/commands/notification\";\nimport { registerReport, registerModList } from \"@/commands/moderation\";\nimport { registerBookmarks } from \"@/commands/bookmark\";\nimport { registerAppPassword } from \"@/commands/password\";\nimport { registerInviteCodes } from \"@/commands/invite\";\nimport { registerCompletions } from \"@/commands/completions\";\nimport type { AtpAgent } from \"@atproto/api\";\nimport type { Config } from \"@/lib/types\";\n\nconst program = new Command();\n\nprogram\n .name(\"bsky\")\n .description(\"A CLI client for Bluesky\")\n .version(\"1.0.0\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-p, --profile <name>\", \"Profile name\")\n .option(\"-v, --verbose\", \"Verbose output\");\n\nfunction resolveProfile(program: Command): string | undefined {\n return program.opts().profile ?? process.env.BSKY_PROFILE;\n}\n\n// Helper to get authenticated client within commands\nexport async function getClient(program: Command): Promise<AtpAgent> {\n const profile = resolveProfile(program);\n const config = await loadConfig(profile);\n const prefix = profile ? `${profile}-` : \"\";\n return createClient(config, prefix);\n}\n\nexport async function getConfig(program: Command): Promise<Config> {\n const profile = resolveProfile(program);\n return loadConfig(profile);\n}\n\nexport function isJson(program: Command): boolean {\n return program.opts().json === true;\n}\n\n// Register all commands\nregisterLogin(program);\nregisterTimeline(program);\nregisterStream(program);\nregisterThread(program);\nregisterPost(program);\nregisterReply(program);\nregisterQuote(program);\nregisterDelete(program);\nregisterLike(program);\nregisterLikes(program);\nregisterRepost(program);\nregisterReposts(program);\nregisterFollow(program);\nregisterUnfollow(program);\nregisterFollows(program);\nregisterFollowers(program);\nregisterBlock(program);\nregisterUnblock(program);\nregisterBlocks(program);\nregisterMute(program);\nregisterSearch(program);\nregisterSearchUsers(program);\nregisterProfile(program);\nregisterProfileUpdate(program);\nregisterSession(program);\nregisterNotifs(program);\nregisterReport(program);\nregisterModList(program);\nregisterBookmarks(program);\nregisterAppPassword(program);\nregisterInviteCodes(program);\nregisterCompletions(program);\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err.message ?? err);\n process.exit(1);\n});\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readdirSync } from \"node:fs\";\nimport type { Config } from \"@/lib/types\";\n\nfunction configDir(): string {\n return join(homedir(), \".config\");\n}\n\nfunction bskyDir(): string {\n return join(configDir(), \"bsky\");\n}\n\nexport function configPath(profile?: string): string {\n if (profile) {\n return join(bskyDir(), `config-${profile}.json`);\n }\n return join(bskyDir(), \"config.json\");\n}\n\nexport function authPath(handle: string, prefix: string = \"\"): string {\n return join(bskyDir(), `${prefix}${handle}.auth`);\n}\n\nexport async function loadConfig(profile?: string): Promise<Config> {\n if (profile === \"?\") {\n listProfiles();\n process.exit(0);\n }\n\n const fp = configPath(profile);\n await mkdir(dirname(fp), { recursive: true });\n\n let cfg: Config = {\n host: \"https://bsky.social\",\n bgs: \"https://bsky.network\",\n handle: \"\",\n password: \"\",\n };\n\n try {\n const data = await readFile(fp, \"utf-8\");\n const fileCfg: Partial<Config> = JSON.parse(data);\n cfg = { ...cfg, ...fileCfg };\n } catch {\n // No config file — env vars or login required\n }\n\n // Env vars override config file values\n if (process.env.BSKY_HANDLE) cfg.handle = process.env.BSKY_HANDLE;\n if (process.env.BSKY_PASSWORD) cfg.password = process.env.BSKY_PASSWORD;\n if (process.env.BSKY_HOST) cfg.host = process.env.BSKY_HOST;\n if (process.env.BSKY_BGS) cfg.bgs = process.env.BSKY_BGS;\n\n if (!cfg.handle || !cfg.password) {\n throw new Error(\n \"No credentials found. Run 'bsky login' or set BSKY_HANDLE and BSKY_PASSWORD.\",\n );\n }\n\n return cfg;\n}\n\nexport async function saveConfig(\n config: Config,\n profile?: string,\n): Promise<void> {\n const fp = configPath(profile);\n await mkdir(dirname(fp), { recursive: true });\n await writeFile(fp, JSON.stringify(config, null, \" \") + \"\\n\", {\n mode: 0o644,\n });\n}\n\nfunction listProfiles(): void {\n const dir = bskyDir();\n if (!existsSync(dir)) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n if (file.startsWith(\"config-\") && file.endsWith(\".json\")) {\n const name = file.slice(7, -5);\n console.log(name);\n }\n }\n}\n","import { AtpAgent } from \"@atproto/api\";\nimport { readAuth, writeAuth, prompt2FA } from \"@/auth\";\nimport type { Config } from \"@/lib/types\";\n\nexport async function createClient(\n config: Config,\n prefix: string = \"\",\n): Promise<AtpAgent> {\n const agent = new AtpAgent({ service: config.host });\n\n // Try refreshing existing session first\n const auth = await readAuth(config.handle, prefix);\n if (auth) {\n try {\n // Resume session using saved auth, then refresh\n await agent.resumeSession({\n did: auth.did,\n handle: auth.handle,\n accessJwt: auth.refreshJwt,\n refreshJwt: auth.refreshJwt,\n active: true,\n });\n\n const refreshed = await agent.com.atproto.server.refreshSession(\n undefined,\n {\n headers: {\n authorization: `Bearer ${auth.refreshJwt}`,\n },\n },\n );\n\n // Resume with refreshed tokens\n await agent.resumeSession({\n did: refreshed.data.did,\n handle: refreshed.data.handle,\n accessJwt: refreshed.data.accessJwt,\n refreshJwt: refreshed.data.refreshJwt,\n active: true,\n });\n\n await writeAuth(\n {\n did: refreshed.data.did,\n handle: refreshed.data.handle,\n accessJwt: refreshed.data.accessJwt,\n refreshJwt: refreshed.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n } catch {\n // Refresh failed, fall through to full login\n }\n }\n\n // Full login with credentials\n try {\n const loginResponse = await agent.login({\n identifier: config.handle,\n password: config.password,\n });\n\n await writeAuth(\n {\n did: loginResponse.data.did,\n handle: loginResponse.data.handle,\n accessJwt: loginResponse.data.accessJwt,\n refreshJwt: loginResponse.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n } catch (err: unknown) {\n // Handle 2FA\n if (\n err instanceof Error &&\n err.message.includes(\"AuthFactorTokenRequired\")\n ) {\n const token = await prompt2FA();\n const loginResponse = await agent.login({\n identifier: config.handle,\n password: config.password,\n authFactorToken: token,\n });\n\n await writeAuth(\n {\n did: loginResponse.data.did,\n handle: loginResponse.data.handle,\n accessJwt: loginResponse.data.accessJwt,\n refreshJwt: loginResponse.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n }\n\n throw new Error(`Cannot create session: ${err}`);\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport { stdin, stdout, stderr } from \"node:process\";\nimport { authPath } from \"@/config\";\nimport type { AuthInfo, Config } from \"@/lib/types\";\n\nexport async function readAuth(\n handle: string,\n prefix: string = \"\",\n): Promise<AuthInfo | null> {\n try {\n const fp = authPath(handle, prefix);\n const data = await readFile(fp, \"utf-8\");\n return JSON.parse(data) as AuthInfo;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuth(\n auth: AuthInfo,\n handle: string,\n prefix: string = \"\",\n): Promise<void> {\n const fp = authPath(handle, prefix);\n await writeFile(fp, JSON.stringify(auth, null, \" \") + \"\\n\", {\n mode: 0o600,\n });\n}\n\nexport async function promptPassword(): Promise<string> {\n if (stdin.isTTY) {\n // Interactive: hide input by sending output to /dev/null\n stderr.write(\"Password: \");\n const muted = createWriteStream(\"/dev/null\");\n const rl = createInterface({ input: stdin, output: muted });\n const password = await rl.question(\"\");\n rl.close();\n stderr.write(\"\\n\");\n return password.trim();\n }\n\n // Piped: read a single line from stdin\n const rl = createInterface({ input: stdin });\n const password = await rl.question(\"\");\n rl.close();\n return password.trim();\n}\n\nexport async function prompt2FA(): Promise<string> {\n stderr.write(\n \"2FA is enabled. A sign-in code has been sent to your email.\\nEnter the code: \",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n const code = await rl.question(\"\");\n rl.close();\n return code.trim();\n}\n","import type { Command } from \"commander\";\nimport { saveConfig } from \"@/config\";\nimport { promptPassword } from \"@/auth\";\nimport type { Config } from \"@/lib/types\";\n\nexport function registerLogin(program: Command): void {\n program\n .command(\"login\")\n .description(\"Login to Bluesky\")\n .argument(\"<handle>\", \"Your Bluesky handle\")\n .argument(\"[password]\", \"Your app password (prompts if omitted)\")\n .option(\"--host <url>\", \"PDS host URL\", \"https://bsky.social\")\n .option(\"--bgs <url>\", \"BGS host URL\", \"https://bsky.network\")\n .action(\n async (\n handle: string,\n password: string | undefined,\n opts: { host: string; bgs: string },\n ) => {\n const resolvedPassword =\n password ?? process.env.BSKY_PASSWORD ?? (await promptPassword());\n const profile = program.opts().profile;\n const config: Config = {\n host: opts.host,\n bgs: opts.bgs,\n handle,\n password: resolvedPassword,\n };\n await saveConfig(config, profile);\n },\n );\n}\n","import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport WebSocket from \"ws\";\n\nimport {\n getClient,\n isJson,\n} from \"@/index\";\nimport {\n outputJson,\n printPost,\n printStreamPost,\n} from \"@/lib/format\";\nimport type {\n JetstreamCommitEvent,\n JetstreamEvent,\n} from \"@/lib/types\";\nimport type {\n AppBskyFeedDefs,\n AppBskyFeedPost,\n} from \"@atproto/api\";\n\nconst DEFAULT_JETSTREAM = \"wss://jetstream1.us-east.bsky.network/subscribe\";\n\nexport function registerTimeline(program: Command): void {\n program\n .command(\"timeline\")\n .alias(\"tl\")\n .description(\"Show timeline\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .option(\"-n <count>\", \"Number of items\", \"30\")\n .action(async (opts: { handle?: string; n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const n = parseInt(opts.n, 10);\n\n let feed: AppBskyFeedDefs.FeedViewPost[] = [];\n let cursor: string | undefined;\n\n while (true) {\n if (opts.handle) {\n const handle =\n opts.handle === \"self\" ? agent.session!.did : opts.handle;\n const resp = await agent.getAuthorFeed({\n actor: handle,\n cursor,\n limit: n,\n });\n feed.push(...resp.data.feed);\n cursor = resp.data.cursor;\n } else {\n const resp = await agent.getTimeline({\n cursor,\n limit: n,\n });\n feed.push(...resp.data.feed);\n cursor = resp.data.cursor;\n }\n\n if (!cursor || feed.length > n) break;\n }\n\n // Sort by date ascending\n feed.sort((a, b) => {\n const ta = new Date(\n (a.post.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n const tb = new Date(\n (b.post.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n return ta - tb;\n });\n\n if (feed.length > n) {\n feed = feed.slice(feed.length - n);\n }\n\n if (json) {\n for (const p of feed) outputJson(p);\n } else {\n for (const p of feed) printPost(p.post);\n }\n });\n}\n\nexport function registerStream(program: Command): void {\n program\n .command(\"stream\")\n .description(\"Stream live posts from the network\")\n .option(\"--cursor <cursor>\", \"Resume cursor (Unix microseconds)\")\n .option(\"-H, --handle <handle>\", \"Filter to a specific user\")\n .option(\"--pattern <regex>\", \"Filter post text by regex\")\n .option(\"--pattern-flags <flags>\", \"Regex flags for --pattern\", \"gi\")\n .option(\"--jetstream <url>\", \"Override Jetstream endpoint\")\n .action(\n async (opts: {\n cursor?: string;\n handle?: string;\n pattern?: string;\n patternFlags: string;\n jetstream?: string;\n }) => {\n const json = isJson(program);\n\n // Validate --pattern-flags\n const VALID_FLAGS = new Set([\"g\", \"i\", \"m\", \"s\", \"u\", \"v\", \"d\", \"y\"]);\n\n if (!opts.pattern && opts.patternFlags !== \"gi\") {\n program.error(`${chalk.bgRed.white(\"Fatal error:\")} --pattern-flags requires --pattern`);\n }\n\n if (opts.pattern) {\n let flagChars = opts.patternFlags.split(\"\");\n\n const unknown = flagChars.filter((f) => !VALID_FLAGS.has(f));\n if (unknown.length > 0) {\n program.error(`unknown regex flag(s): ${unknown.join(\", \")}`);\n }\n\n const uniqueFlags = new Set(flagChars);\n if (uniqueFlags.size !== flagChars.length) {\n const dupes = flagChars.filter((f, i) => flagChars.indexOf(f) !== i);\n console.warn(`\n ${chalk.bgYellow.black(\"Warning:\")} duplicate regex flag(s) removed: ${[...new Set(dupes)].join(\", \")}`,\n );\n flagChars = [...uniqueFlags];\n opts.patternFlags = flagChars.join(\"\");\n }\n\n if (flagChars.includes(\"u\") && flagChars.includes(\"v\")) {\n program.error(`${chalk.bgRed.white(\"Fatal error:\")}regex flags u and v cannot be used together`);\n }\n\n if (flagChars.includes(\"y\") && flagChars.includes(\"g\")) {\n console.warn(`${chalk.bgYellow.black(\"Warning:\")} sticky flag (y) makes global flag (g) meaningless`)\n }\n\n if (flagChars.includes(\"u\") && flagChars.includes(\"d\")) {\n console.warn(`${chalk.bgYellow.black(\"Warning:\")} unicode (u) with hasIndices (d) is valid but rarely needed`)\n }\n }\n\n // Build Jetstream URL\n const wsUrl = new URL(opts.jetstream ?? DEFAULT_JETSTREAM);\n wsUrl.searchParams.set(\"wantedCollections\", \"app.bsky.feed.post\");\n\n // Resolve --handle to DID for server-side filtering\n let filterHandle: string | null = null;\n if (opts.handle) {\n const agent = await getClient(program);\n if (opts.handle === \"self\") {\n wsUrl.searchParams.set(\"wantedDids\", agent.session!.did);\n filterHandle = agent.session!.handle;\n } else if (opts.handle.startsWith(\"did:\")) {\n wsUrl.searchParams.set(\"wantedDids\", opts.handle);\n } else {\n const profile = await agent.getProfile({ actor: opts.handle });\n wsUrl.searchParams.set(\"wantedDids\", profile.data.did);\n filterHandle = opts.handle;\n }\n }\n\n if (opts.cursor) {\n wsUrl.searchParams.set(\"cursor\", opts.cursor);\n }\n\n let re: RegExp | null = null;\n if (opts.pattern) {\n try {\n re = new RegExp(opts.pattern, opts.patternFlags);\n } catch (err) {\n program.error(`invalid regex pattern: ${(err as Error).message}`);\n }\n }\n let lastCursor = \"\";\n\n const ws = new WebSocket(wsUrl.toString());\n\n process.on(\"SIGINT\", () => {\n if (lastCursor) {\n console.error(`\\nCursor: ${lastCursor}`);\n }\n ws.close();\n process.exit(0);\n });\n\n ws.on(\"message\", (data: Buffer) => {\n try {\n const event = JSON.parse(data.toString()) as JetstreamEvent;\n lastCursor = String(event.time_us);\n\n // Only process commit events\n if (event.kind !== \"commit\") return;\n\n const commit = (event as JetstreamCommitEvent).commit;\n\n // Only process new posts\n if (commit.operation !== \"create\") return;\n if (commit.collection !== \"app.bsky.feed.post\") return;\n\n const text = commit.record?.text;\n if (!text) return;\n\n // Apply regex filter\n if (re && !re.test(text)) return;\n\n if (json) {\n outputJson(event);\n } else {\n printStreamPost(\n event.did,\n filterHandle,\n text,\n commit.rkey,\n commit.collection,\n );\n }\n } catch {\n // Skip malformed messages\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n console.error(\"WebSocket error:\", err.message);\n process.exit(1);\n });\n\n ws.on(\"close\", () => {\n if (lastCursor) {\n console.error(`Cursor: ${lastCursor}`);\n }\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {});\n },\n );\n}\n","import chalk from \"chalk\";\nimport type { AppBskyFeedDefs, AppBskyFeedPost } from \"@atproto/api\";\n\nexport function printPost(post: AppBskyFeedDefs.PostView): void {\n const rec = post.record as AppBskyFeedPost.Record;\n\n // Author line\n process.stdout.write(chalk.redBright(post.author.handle));\n process.stdout.write(` [${post.author.displayName ?? \"\"}]`);\n console.log(` (${formatTime(rec.createdAt)})`);\n\n // Post text\n console.log(rec.text);\n\n // Embedded images\n if (post.embed) {\n const images = post.embed as { images?: Array<{ fullsize: string }> };\n if (images.images) {\n for (const img of images.images) {\n console.log(` {${img.fullsize}}`);\n }\n }\n }\n\n // Engagement counts\n console.log(\n ` 👍(${post.likeCount ?? 0})⚡(${post.repostCount ?? 0})↩️ (${post.replyCount ?? 0})`,\n );\n\n // Reply reference\n if (rec.reply?.parent) {\n process.stdout.write(\" > \");\n console.log(chalk.blue(rec.reply.parent.uri));\n }\n\n // Post URI\n process.stdout.write(\" - \");\n console.log(chalk.blue(post.uri));\n console.log();\n}\n\nexport function printActor(actor: {\n handle: string;\n displayName?: string;\n did: string;\n}): void {\n process.stdout.write(chalk.redBright(actor.handle));\n process.stdout.write(` [${actor.displayName ?? \"\"}] `);\n console.log(chalk.blue(actor.did));\n}\n\nexport function formatTime(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toISOString();\n}\n\nexport function printStreamPost(\n did: string,\n handle: string | null,\n text: string,\n rkey: string,\n collection: string,\n): void {\n const author = handle ?? did;\n process.stdout.write(chalk.redBright(author));\n console.log(`: ${text}`);\n console.log(` at://${did}/${collection}/${rkey}`);\n console.log();\n}\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data));\n}\n","import type { Command } from \"commander\";\nimport type { AppBskyFeedDefs } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nfunction normalizeUri(uri: string): string {\n if (!uri.startsWith(\"at://did:plc:\")) {\n return \"at://did:plc:\" + uri;\n }\n return uri;\n}\n\nexport function registerThread(program: Command): void {\n program\n .command(\"thread\")\n .description(\"Show thread\")\n .argument(\"<uri>\", \"Post URI\")\n .option(\"-n <count>\", \"Number of items\", \"30\")\n .action(async (uri: string, opts: { n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const depth = parseInt(opts.n, 10);\n\n const resp = await agent.getPostThread({\n uri: normalizeUri(uri),\n depth,\n });\n\n const thread =\n resp.data.thread as AppBskyFeedDefs.ThreadViewPost;\n\n if (json) {\n outputJson(thread);\n if (thread.replies) {\n for (const r of thread.replies) outputJson(r);\n }\n return;\n }\n\n const replies = (thread.replies ?? []) as AppBskyFeedDefs.ThreadViewPost[];\n replies.reverse();\n\n printPost(thread.post);\n for (const r of replies) {\n if (r.post) printPost(r.post);\n }\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { stdin } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type {\n AppBskyFeedPost,\n AppBskyEmbedImages,\n AppBskyEmbedVideo,\n AppBskyEmbedExternal,\n AppBskyEmbedRecord,\n AppBskyRichtextFacet,\n ComAtprotoRepoStrongRef,\n} from \"@atproto/api\";\nimport { load as cheerioLoad } from \"cheerio\";\nimport { getClient, isJson } from \"@/index\";\nimport { extractLinks, extractMentions, extractTags } from \"@/lib/extract\";\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction detectMimeType(data: Uint8Array): string {\n // Check magic bytes for common formats\n if (data[0] === 0xff && data[1] === 0xd8) return \"image/jpeg\";\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47\n )\n return \"image/png\";\n if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)\n return \"image/gif\";\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46\n )\n return \"image/webp\";\n // Video formats\n if (data[4] === 0x66 && data[5] === 0x74 && data[6] === 0x79)\n return \"video/mp4\";\n return \"application/octet-stream\";\n}\n\nasync function buildFacets(\n agent: Awaited<ReturnType<typeof getClient>>,\n text: string,\n): Promise<AppBskyRichtextFacet.Main[]> {\n const facets: AppBskyRichtextFacet.Main[] = [];\n\n for (const entry of extractLinks(text)) {\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#link\", uri: entry.text },\n ],\n });\n }\n\n for (const entry of extractMentions(text)) {\n try {\n const profile = await agent.getProfile({ actor: entry.text });\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#mention\", did: profile.data.did },\n ],\n });\n } catch {\n // Skip unresolvable mentions\n }\n }\n\n for (const entry of extractTags(text)) {\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#tag\", tag: entry.text },\n ],\n });\n }\n\n return facets;\n}\n\nasync function fetchLinkCard(\n agent: Awaited<ReturnType<typeof getClient>>,\n url: string,\n): Promise<AppBskyEmbedExternal.Main | null> {\n try {\n const resp = await fetch(url);\n if (!resp.ok) return null;\n const html = await resp.text();\n const $ = cheerioLoad(html);\n\n let title = $(\"title\").text();\n let description =\n $('meta[property=\"description\"]').attr(\"content\") ?? \"\";\n const imgURL = $('meta[property=\"og:image\"]').attr(\"content\");\n\n if (!title) title = $('meta[property=\"og:title\"]').attr(\"content\") ?? url;\n if (!description)\n description =\n $('meta[property=\"og:description\"]').attr(\"content\") ?? url;\n\n const external: AppBskyEmbedExternal.External = {\n uri: url,\n title,\n description,\n };\n\n if (imgURL) {\n try {\n const imgResp = await fetch(imgURL);\n if (imgResp.ok) {\n const imgData = new Uint8Array(await imgResp.arrayBuffer());\n const uploadResp = await agent.uploadBlob(imgData, {\n encoding: detectMimeType(imgData),\n });\n external.thumb = uploadResp.data.blob;\n }\n } catch {\n // Skip thumbnail on failure\n }\n }\n\n return { $type: \"app.bsky.embed.external\", external };\n } catch {\n return null;\n }\n}\n\nasync function createPost(\n agent: Awaited<ReturnType<typeof getClient>>,\n text: string,\n opts: {\n reply?: ComAtprotoRepoStrongRef.Main;\n replyRoot?: ComAtprotoRepoStrongRef.Main;\n quote?: ComAtprotoRepoStrongRef.Main;\n images?: string[];\n imageAlts?: string[];\n video?: string;\n videoAlt?: string;\n },\n): Promise<string> {\n const facets = await buildFacets(agent, text);\n\n const post: AppBskyFeedPost.Record = {\n $type: \"app.bsky.feed.post\",\n text,\n createdAt: new Date().toISOString(),\n facets: facets.length > 0 ? facets : undefined,\n };\n\n // Reply\n if (opts.reply) {\n post.reply = {\n root: opts.replyRoot ?? opts.reply,\n parent: opts.reply,\n };\n }\n\n // Embed: images\n if (opts.images && opts.images.length > 0) {\n const images: AppBskyEmbedImages.Image[] = [];\n for (let i = 0; i < opts.images.length; i++) {\n const data = await readFile(opts.images[i]);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n images.push({\n alt: opts.imageAlts?.[i] ?? basename(opts.images[i]),\n image: uploadResp.data.blob,\n });\n }\n (post as Record<string, unknown>).embed = { $type: \"app.bsky.embed.images\", images };\n }\n\n // Embed: video\n if (opts.video) {\n const data = await readFile(opts.video);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n (post as Record<string, unknown>).embed = {\n $type: \"app.bsky.embed.video\",\n video: uploadResp.data.blob,\n alt: opts.videoAlt ?? basename(opts.video),\n };\n }\n\n // Embed: quote\n if (opts.quote) {\n (post as Record<string, unknown>).embed = {\n $type: \"app.bsky.embed.record\",\n record: opts.quote,\n };\n }\n\n // Embed: link card (first link, if no other embed)\n if (!post.embed) {\n const links = extractLinks(text);\n if (links.length > 0) {\n const card = await fetchLinkCard(agent, links[0].text);\n if (card) (post as Record<string, unknown>).embed = card;\n }\n }\n\n const resp = await agent.post(post);\n return resp.uri;\n}\n\nexport function registerPost(program: Command): void {\n program\n .command(\"post\")\n .description(\"Create a new post\")\n .argument(\"[text...]\", \"Post text\")\n .option(\"--stdin\", \"Read text from stdin\")\n .option(\"-i, --image <files...>\", \"Image files to attach\")\n .option(\"--image-alt <alts...>\", \"Alt text for images\")\n .option(\"--video <file>\", \"Video file to attach\")\n .option(\"--video-alt <alt>\", \"Alt text for video\")\n .action(\n async (\n textParts: string[],\n opts: {\n stdin?: boolean;\n image?: string[];\n imageAlt?: string[];\n video?: string;\n videoAlt?: string;\n },\n ) => {\n let text = textParts.join(\" \");\n if (opts.stdin) {\n text = await readStdin();\n }\n if (!text.trim()) {\n console.error(\"Error: post text is required\");\n process.exit(1);\n }\n\n const agent = await getClient(program);\n const uri = await createPost(agent, text, {\n images: opts.image,\n imageAlts: opts.imageAlt,\n video: opts.video,\n videoAlt: opts.videoAlt,\n });\n console.log(uri);\n },\n );\n}\n\nexport function registerReply(program: Command): void {\n program\n .command(\"reply\")\n .description(\"Reply to a post\")\n .argument(\"<uri>\", \"URI of the post to reply to\")\n .argument(\"<text...>\", \"Reply text\")\n .action(async (uri: string, textParts: string[]) => {\n const text = textParts.join(\" \");\n const agent = await getClient(program);\n\n // Fetch parent post\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const parent: ComAtprotoRepoStrongRef.Main = {\n uri: record.data.uri,\n cid: record.data.cid!,\n };\n\n // Check if parent is itself a reply (to get the root)\n const parentPost = record.data.value as AppBskyFeedPost.Record;\n const root =\n parentPost.reply?.root ??\n parent;\n\n const postUri = await createPost(agent, text, {\n reply: parent,\n replyRoot: root as ComAtprotoRepoStrongRef.Main,\n });\n console.log(postUri);\n });\n}\n\nexport function registerQuote(program: Command): void {\n program\n .command(\"quote\")\n .description(\"Quote a post\")\n .argument(\"<uri>\", \"URI of the post to quote\")\n .argument(\"<text...>\", \"Quote text\")\n .action(async (uri: string, textParts: string[]) => {\n const text = textParts.join(\" \");\n const agent = await getClient(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const postUri = await createPost(agent, text, {\n quote: {\n uri: record.data.uri,\n cid: record.data.cid!,\n },\n });\n console.log(postUri);\n });\n}\n","const URL_PATTERN = /https?:\\/\\/[-A-Za-z0-9+&@#/%?=~_|!:,.;()]+/g;\nconst MENTION_PATTERN = /@[a-zA-Z0-9.]+/g;\nconst TAG_PATTERN = /\\B#\\S+/g;\n\nexport interface TextEntry {\n start: number;\n end: number;\n text: string;\n}\n\nfunction byteLength(str: string): number {\n return new TextEncoder().encode(str).byteLength;\n}\n\nfunction extractWithByteOffsets(\n text: string,\n pattern: RegExp,\n stripPrefix?: string,\n): TextEntry[] {\n const results: TextEntry[] = [];\n let match: RegExpExecArray | null;\n\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n while ((match = pattern.exec(text)) !== null) {\n const before = text.slice(0, match.index);\n const matchText = match[0];\n const start = byteLength(before);\n const end = start + byteLength(matchText);\n const entryText = stripPrefix\n ? matchText.replace(new RegExp(`^${stripPrefix}`), \"\")\n : matchText;\n\n results.push({ start, end, text: entryText });\n }\n\n return results;\n}\n\nexport function extractLinks(text: string): TextEntry[] {\n return extractWithByteOffsets(text, URL_PATTERN);\n}\n\nexport function extractMentions(text: string): TextEntry[] {\n return extractWithByteOffsets(text, MENTION_PATTERN, \"@\");\n}\n\nexport function extractTags(text: string): TextEntry[] {\n return extractWithByteOffsets(text, TAG_PATTERN, \"#\");\n}\n","import type { Command } from \"commander\";\nimport { getClient } from \"@/index\";\n\nexport function registerDelete(program: Command): void {\n program\n .command(\"delete\")\n .description(\"Delete a post\")\n .argument(\"<uri...>\", \"Post URI(s) to delete\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n if (parts.length < 3) {\n console.error(`Invalid post URI: ${uri}`);\n continue;\n }\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerLike(program: Command): void {\n program\n .command(\"like\")\n .description(\"Like a post\")\n .argument(\"<uri...>\", \"Post URI(s) to like\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.like(record.data.uri, record.data.cid!);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerLikes(program: Command): void {\n program\n .command(\"likes\")\n .description(\"Show likes on a post\")\n .argument(\"<uri>\", \"Post URI\")\n .action(async (uri: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.getLikes({\n uri: record.data.uri,\n cid: record.data.cid,\n limit: 50,\n });\n\n if (json) {\n for (const v of resp.data.likes) outputJson(v);\n return;\n }\n\n for (const v of resp.data.likes) {\n process.stdout.write(\"👍 \");\n process.stdout.write(chalk.redBright(v.actor.handle));\n process.stdout.write(` [${v.actor.displayName ?? \"\"}]`);\n console.log(` (${v.createdAt})`);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerRepost(program: Command): void {\n program\n .command(\"repost\")\n .description(\"Repost a post\")\n .argument(\"<uri...>\", \"Post URI(s) to repost\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.repost(record.data.uri, record.data.cid!);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerReposts(program: Command): void {\n program\n .command(\"reposts\")\n .description(\"Show reposts of a post\")\n .argument(\"<uri>\", \"Post URI\")\n .action(async (uri: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.getRepostedBy({\n uri: record.data.uri,\n cid: record.data.cid,\n limit: 50,\n });\n\n if (json) {\n for (const r of resp.data.repostedBy) outputJson(r);\n return;\n }\n\n for (const r of resp.data.repostedBy) {\n process.stdout.write(\"⚡ \");\n process.stdout.write(chalk.redBright(r.handle));\n console.log(` [${r.displayName ?? \"\"}]`);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { printActor, outputJson } from \"@/lib/format\";\n\nasync function resolveDid(\n agent: Awaited<ReturnType<typeof getClient>>,\n handleOrDid: string,\n): Promise<string> {\n if (handleOrDid.startsWith(\"did:\")) return handleOrDid;\n const profile = await agent.getProfile({ actor: handleOrDid });\n return profile.data.did;\n}\n\nexport function registerFollow(program: Command): void {\n program\n .command(\"follow\")\n .description(\"Follow user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to follow\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const resp = await agent.follow(profile.data.did);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerUnfollow(program: Command): void {\n program\n .command(\"unfollow\")\n .description(\"Unfollow user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to unfollow\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const followUri = profile.data.viewer?.following;\n if (!followUri) continue;\n\n const parts = followUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n console.log(followUri);\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n\nexport function registerFollows(program: Command): void {\n program\n .command(\"follows\")\n .description(\"Show follows\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.getFollows({\n actor: handle,\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const f of resp.data.follows) outputJson(f);\n } else {\n for (const f of resp.data.follows) printActor(f);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerFollowers(program: Command): void {\n program\n .command(\"followers\")\n .description(\"Show followers\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.getFollowers({\n actor: handle,\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const f of resp.data.followers) outputJson(f);\n } else {\n for (const f of resp.data.followers) printActor(f);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerBlock(program: Command): void {\n program\n .command(\"block\")\n .description(\"Block user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to block\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n\n const resp = await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.block\",\n record: {\n $type: \"app.bsky.graph.block\",\n createdAt: new Date().toISOString(),\n subject: did,\n },\n });\n console.log(resp.data.uri);\n }\n });\n}\n\nexport function registerUnblock(program: Command): void {\n program\n .command(\"unblock\")\n .description(\"Unblock user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to unblock\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const blockUri = profile.data.viewer?.blocking;\n if (!blockUri) continue;\n\n const parts = blockUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n console.log(blockUri);\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n\nexport function registerBlocks(program: Command): void {\n program\n .command(\"blocks\")\n .description(\"Show blocked users\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.app.bsky.graph.getBlocks({\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const b of resp.data.blocks) outputJson(b);\n } else {\n for (const b of resp.data.blocks) printActor(b);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerMute(program: Command): void {\n program\n .command(\"mute\")\n .description(\"Mute user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to mute\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n await agent.mute(did);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { AppBskyFeedDefs, AppBskyFeedPost } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nexport function registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search posts\")\n .argument(\"<terms...>\", \"Search terms\")\n .option(\"-n <count>\", \"Number of results\", \"100\")\n .action(async (terms: string[], opts: { n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const n = parseInt(opts.n, 10);\n const query = terms.join(\" \");\n\n let results: AppBskyFeedDefs.PostView[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const resp = await agent.app.bsky.feed.searchPosts({\n q: query,\n cursor,\n limit: 100,\n });\n\n results.push(...resp.data.posts);\n cursor = resp.data.cursor;\n\n if (!cursor || results.length > n) break;\n }\n\n // Sort by date ascending\n results.sort((a, b) => {\n const ta = new Date(\n (a.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n const tb = new Date(\n (b.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n return ta - tb;\n });\n\n if (results.length > n) {\n results = results.slice(results.length - n);\n }\n\n if (json) {\n for (const p of results) outputJson(p);\n } else {\n for (const p of results) printPost(p);\n }\n });\n}\n\nexport function registerSearchUsers(program: Command): void {\n program\n .command(\"search-users\")\n .description(\"Search for users\")\n .argument(\"<terms...>\", \"Search terms\")\n .option(\"-n <count>\", \"Number of results\", \"100\")\n .action(async (terms: string[], opts: { n: string }) => {\n const agent = await getClient(program);\n const n = parseInt(opts.n, 10);\n const query = terms.join(\" \");\n\n const resp = await agent.searchActors({\n term: query,\n limit: n,\n });\n\n for (const actor of resp.data.actors) {\n outputJson(actor);\n }\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nfunction detectMimeType(data: Uint8Array): string {\n if (data[0] === 0xff && data[1] === 0xd8) return \"image/jpeg\";\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47\n )\n return \"image/png\";\n if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)\n return \"image/gif\";\n return \"application/octet-stream\";\n}\n\nexport function registerProfile(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show profile\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n const resp = await agent.getProfile({ actor: handle });\n const profile = resp.data;\n\n if (json) {\n outputJson(profile);\n return;\n }\n\n console.log(`Did: ${profile.did}`);\n console.log(`Handle: ${profile.handle}`);\n console.log(`DisplayName: ${profile.displayName ?? \"\"}`);\n console.log(`Description: ${profile.description ?? \"\"}`);\n console.log(`Follows: ${profile.followsCount ?? 0}`);\n console.log(`Followers: ${profile.followersCount ?? 0}`);\n console.log(`Avatar: ${profile.avatar ?? \"\"}`);\n console.log(`Banner: ${profile.banner ?? \"\"}`);\n });\n}\n\nexport function registerProfileUpdate(program: Command): void {\n program\n .command(\"profile-update\")\n .description(\"Update profile\")\n .argument(\"[displayname]\", \"Display name\")\n .argument(\"[description]\", \"Description\")\n .option(\"--avatar <file>\", \"Avatar image file\")\n .option(\"--banner <file>\", \"Banner image file\")\n .action(\n async (\n displayName: string | undefined,\n description: string | undefined,\n opts: { avatar?: string; banner?: string },\n ) => {\n if (!displayName && !description && !opts.avatar && !opts.banner) {\n console.error(\"Error: provide at least one field to update\");\n process.exit(1);\n }\n\n const agent = await getClient(program);\n\n // Get current profile\n const current = await agent.getProfile({\n actor: agent.session!.handle,\n });\n\n const name = displayName ?? current.data.displayName;\n const desc = description ?? current.data.description;\n\n let avatar: unknown = undefined;\n if (opts.avatar) {\n const data = await readFile(opts.avatar);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n avatar = uploadResp.data.blob;\n }\n\n let banner: unknown = undefined;\n if (opts.banner) {\n const data = await readFile(opts.banner);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n banner = uploadResp.data.blob;\n }\n\n // Get current record for swap\n const currentRecord = await agent.com.atproto.repo.getRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.actor.profile\",\n rkey: \"self\",\n });\n\n await agent.com.atproto.repo.putRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.actor.profile\",\n rkey: \"self\",\n record: {\n $type: \"app.bsky.actor.profile\",\n displayName: name,\n description: desc,\n ...(avatar ? { avatar } : {}),\n ...(banner ? { banner } : {}),\n },\n swapRecord: currentRecord.data.cid,\n });\n },\n );\n}\n\nexport function registerSession(program: Command): void {\n program\n .command(\"session\")\n .description(\"Show session info\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.getSession();\n const session = resp.data;\n\n if (json) {\n outputJson(session);\n return;\n }\n\n console.log(`Did: ${session.did}`);\n console.log(`Email: ${session.email ?? \"\"}`);\n console.log(`Handle: ${session.handle}`);\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type {\n AppBskyFeedPost,\n AppBskyFeedRepost,\n AppBskyFeedLike,\n AppBskyGraphFollow,\n} from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerNotifs(program: Command): void {\n program\n .command(\"notifs\")\n .alias(\"notification\")\n .description(\"Show notifications\")\n .option(\"-a, --all\", \"Show all (including read)\")\n .action(async (opts: { all?: boolean }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.listNotifications({ limit: 50 });\n const notifs = resp.data.notifications;\n\n if (json) {\n for (const n of notifs) outputJson(n);\n return;\n }\n\n for (const n of notifs) {\n if (!opts.all && n.isRead) continue;\n\n process.stdout.write(chalk.redBright(n.author.handle));\n process.stdout.write(` [${n.author.displayName ?? \"\"}] `);\n console.log(chalk.blue(n.author.did));\n\n const record = n.record as Record<string, unknown>;\n switch (record.$type) {\n case \"app.bsky.feed.post\":\n console.log(` ${n.reason} to ${n.uri}`);\n break;\n case \"app.bsky.feed.repost\": {\n const repost = record as unknown as AppBskyFeedRepost.Record;\n console.log(` reposted ${repost.subject.uri}`);\n break;\n }\n case \"app.bsky.feed.like\": {\n const like = record as unknown as AppBskyFeedLike.Record;\n console.log(` liked ${like.subject.uri}`);\n break;\n }\n case \"app.bsky.graph.follow\":\n console.log(\" followed you\");\n break;\n }\n }\n\n // Mark as seen\n await agent.app.bsky.notification.updateSeen({\n seenAt: new Date().toISOString(),\n });\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient } from \"@/index\";\n\nasync function resolveDid(\n agent: Awaited<ReturnType<typeof getClient>>,\n handleOrDid: string,\n): Promise<string> {\n if (handleOrDid.startsWith(\"did:\")) return handleOrDid;\n const profile = await agent.getProfile({ actor: handleOrDid });\n return profile.data.did;\n}\n\nexport function registerReport(program: Command): void {\n program\n .command(\"report\")\n .description(\"Report a user\")\n .argument(\"<handle>\", \"Handle or DID to report\")\n .option(\"--comment <text>\", \"Report comment\")\n .action(async (handle: string, opts: { comment?: string }) => {\n const agent = await getClient(program);\n const did = await resolveDid(agent, handle);\n\n const resp = await agent.com.atproto.moderation.createReport({\n reasonType: \"com.atproto.moderation.defs#reasonSpam\",\n subject: {\n $type: \"com.atproto.admin.defs#repoRef\",\n did,\n },\n reason: opts.comment,\n });\n\n console.log(\"Report created successfully:\", JSON.stringify(resp.data));\n });\n}\n\nexport function registerModList(program: Command): void {\n program\n .command(\"mod-list\")\n .description(\"Create a moderation list with user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to add\")\n .option(\"--name <name>\", \"List name\", \"NewList\")\n .option(\"--desc <description>\", \"List description\", \"\")\n .action(\n async (\n handles: string[],\n opts: { name: string; desc: string },\n ) => {\n const agent = await getClient(program);\n\n // Create the list\n const listResp = await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.list\",\n record: {\n $type: \"app.bsky.graph.list\",\n name: opts.name,\n purpose: \"app.bsky.graph.defs#modlist\",\n description: opts.desc,\n createdAt: new Date().toISOString(),\n },\n });\n\n console.log(\"List created successfully. URI:\", listResp.data.uri);\n\n // Add users to the list\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n\n await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.listitem\",\n record: {\n $type: \"app.bsky.graph.listitem\",\n subject: did,\n list: listResp.data.uri,\n createdAt: new Date().toISOString(),\n },\n });\n\n console.log(\"User added to moderation list successfully.\");\n }\n },\n );\n}\n","import type { Command } from \"commander\";\nimport { AppBskyFeedDefs } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nexport function registerBookmarks(program: Command): void {\n const bookmarks = program\n .command(\"bookmarks\")\n .description(\"Manage bookmarks\");\n\n bookmarks\n .command(\"create\")\n .description(\"Bookmark a post\")\n .argument(\"<uri...>\", \"Post URI(s) to bookmark\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n await agent.app.bsky.bookmark.createBookmark({\n uri: record.data.uri,\n cid: record.data.cid!,\n });\n console.log(record.data.uri);\n }\n });\n\n bookmarks\n .command(\"delete\")\n .description(\"Remove a bookmark\")\n .argument(\"<uri...>\", \"Post URI(s) to unbookmark\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n await agent.app.bsky.bookmark.deleteBookmark({ uri: atUri });\n console.log(atUri);\n }\n });\n\n bookmarks\n .command(\"get\")\n .description(\"List bookmarked posts\")\n .option(\"-n, --count <number>\", \"Number of bookmarks to show\", \"50\")\n .action(async (opts: { count: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const limit = parseInt(opts.count, 10);\n\n let cursor: string | undefined;\n let remaining = limit;\n\n do {\n const resp = await agent.app.bsky.bookmark.getBookmarks({\n limit: Math.min(remaining, 50),\n cursor,\n });\n\n for (const bookmark of resp.data.bookmarks) {\n if (json) {\n outputJson(bookmark);\n } else if (AppBskyFeedDefs.isPostView(bookmark.item)) {\n printPost(bookmark.item);\n }\n }\n\n remaining -= resp.data.bookmarks.length;\n cursor = resp.data.cursor;\n } while (cursor && remaining > 0);\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerAppPassword(program: Command): void {\n const appPw = program\n .command(\"app-password\")\n .description(\"Manage app passwords\");\n\n appPw\n .command(\"list\")\n .description(\"List app passwords\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.listAppPasswords();\n const passwords = resp.data.passwords;\n\n if (json) {\n for (const pw of passwords) outputJson(pw);\n return;\n }\n\n for (const pw of passwords) {\n console.log(`${pw.name} (${pw.createdAt})`);\n }\n });\n\n appPw\n .command(\"add\")\n .description(\"Create an app password\")\n .argument(\"<name>\", \"Password name\")\n .action(async (name: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.createAppPassword({\n name,\n });\n\n if (json) {\n outputJson(resp.data);\n } else {\n console.log(`${resp.data.name}: ${resp.data.password}`);\n }\n });\n\n appPw\n .command(\"revoke\")\n .description(\"Revoke an app password\")\n .argument(\"<name>\", \"Password name\")\n .action(async (name: string) => {\n const agent = await getClient(program);\n await agent.com.atproto.server.revokeAppPassword({ name });\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerInviteCodes(program: Command): void {\n program\n .command(\"invite-codes\")\n .description(\"Show invite codes\")\n .option(\"--used\", \"Show used codes too\")\n .action(async (opts: { used?: boolean }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.getAccountInviteCodes({\n includeUsed: opts.used ?? false,\n });\n\n const codes = resp.data.codes;\n\n if (json) {\n for (const c of codes) outputJson(c);\n return;\n }\n\n for (const c of codes) {\n if (c.uses.length >= c.available) {\n console.log(chalk.magentaBright(`${c.code} (used)`));\n } else {\n console.log(c.code);\n }\n }\n });\n}\n","import type { Command } from \"commander\";\n\ninterface OptionInfo {\n short?: string;\n long?: string;\n description: string;\n}\n\ninterface CommandInfo {\n name: string;\n aliases: string[];\n description: string;\n options: OptionInfo[];\n}\n\nfunction getCommands(program: Command): CommandInfo[] {\n return program.commands.map((cmd) => ({\n name: cmd.name(),\n aliases: cmd.aliases(),\n description: cmd.description(),\n options: cmd.options.map((opt) => ({\n short: opt.short?.replace(/^-/, \"\") || undefined,\n long: opt.long?.replace(/^--/, \"\") || undefined,\n description: opt.description,\n })),\n }));\n}\n\nfunction getGlobalOptions(program: Command): OptionInfo[] {\n return program.options.map((opt) => ({\n short: opt.short?.replace(/^-/, \"\") || undefined,\n long: opt.long?.replace(/^--/, \"\") || undefined,\n description: opt.description,\n }));\n}\n\nfunction optionFlag(opt: OptionInfo): string {\n return opt.long ? `--${opt.long}` : `-${opt.short}`;\n}\n\nfunction generateBash(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const cmdNames = commands\n .flatMap((c) => [c.name, ...c.aliases])\n .join(\" \");\n\n const globalFlags = globalOpts\n .map((o) => optionFlag(o))\n .join(\" \");\n\n const caseClauses = commands\n .map((cmd) => {\n const names = [cmd.name, ...cmd.aliases];\n const opts = cmd.options.map((o) => optionFlag(o)).join(\" \");\n return names.map((n) => ` ${n}) opts=\"${opts}\" ;;`).join(\"\\n\");\n })\n .join(\"\\n\");\n\n // Check for subcommands (e.g. app-password list|add|revoke)\n const subcommandClauses = commands\n .filter((cmd) => {\n // Find commands registered on the program that themselves have subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n return programCmd && programCmd.commands.length > 0;\n })\n .map((cmd) => {\n const programCmd = program.commands.find((c) => c.name() === cmd.name)!;\n const subNames = programCmd.commands.map((sub) => sub.name()).join(\" \");\n return ` ${cmd.name}) opts=\"${subNames}\" ;;`;\n })\n .join(\"\\n\");\n\n return `#!/bin/bash\n\n_bsky_completions() {\n local cur prev commands global_opts opts\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"${cmdNames}\"\n global_opts=\"${globalFlags} --help --version\"\n\n if [[ \\${COMP_CWORD} -eq 1 ]]; then\n COMPREPLY=( $(compgen -W \"\\${commands} \\${global_opts}\" -- \"\\${cur}\") )\n return 0\n fi\n\n case \"\\${COMP_WORDS[1]}\" in\n${caseClauses}\n${subcommandClauses}\n *) opts=\"\" ;;\n esac\n\n COMPREPLY=( $(compgen -W \"\\${opts} --help\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _bsky_completions bsky\n`;\n}\n\nfunction generateZsh(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const cmdList = commands\n .map((c) => {\n const desc = c.description.replace(/'/g, \"'\\\\''\");\n return ` '${c.name}:${desc}'`;\n })\n .join(\"\\n\");\n\n const globalOptsList = globalOpts\n .map((o) => {\n const desc = o.description.replace(/'/g, \"'\\\\''\");\n return ` '${optionFlag(o)}[${desc}]'`;\n })\n .join(\"\\n\");\n\n const subcmdFunctions = commands\n .map((cmd) => {\n const opts = cmd.options\n .map((o) => {\n const desc = o.description.replace(/'/g, \"'\\\\''\");\n return ` '${optionFlag(o)}[${desc}]'`;\n })\n .join(\"\\n\");\n\n // Check for nested subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n const subCommands = programCmd?.commands ?? [];\n\n if (subCommands.length > 0) {\n const subList = subCommands\n .map((sub) => {\n const desc = sub.description().replace(/'/g, \"'\\\\''\");\n return ` '${sub.name()}:${desc}'`;\n })\n .join(\"\\n\");\n return ` ${cmd.name})\n local -a subcommands\n subcommands=(\n${subList}\n )\n _describe 'subcommand' subcommands\n ;;`;\n }\n\n if (!opts) return ` ${cmd.name}) ;;`;\n return ` ${cmd.name})\n _arguments \\\\\n${opts}\n ;;`;\n })\n .join(\"\\n\");\n\n return `#compdef bsky\n\n_bsky() {\n local -a commands\n commands=(\n${cmdList}\n )\n\n _arguments \\\\\n${globalOptsList} \\\\\n '1:command:->command' \\\\\n '*::arg:->args'\n\n case \\$state in\n command)\n _describe 'command' commands\n ;;\n args)\n case \\$words[1] in\n${subcmdFunctions}\n esac\n ;;\n esac\n}\n\n_bsky \"$@\"\n`;\n}\n\nfunction generateFish(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const lines: string[] = [\n \"# Fish completions for bsky\",\n \"# Generated by: bsky completions fish\",\n \"\",\n \"# Disable file completions by default\",\n \"complete -c bsky -f\",\n \"\",\n ];\n\n // Global options\n for (const opt of globalOpts) {\n const desc = opt.description.replace(/'/g, \"\\\\'\");\n const parts = [`complete -c bsky -n '__fish_use_subcommand'`];\n if (opt.long) parts.push(`-l ${opt.long}`);\n if (opt.short) parts.push(`-s ${opt.short}`);\n parts.push(`-d '${desc}'`);\n lines.push(parts.join(\" \"));\n }\n\n lines.push(\"\");\n\n // Subcommands\n for (const cmd of commands) {\n const desc = cmd.description.replace(/'/g, \"\\\\'\");\n lines.push(\n `complete -c bsky -n '__fish_use_subcommand' -a ${cmd.name} -d '${desc}'`,\n );\n for (const alias of cmd.aliases) {\n lines.push(\n `complete -c bsky -n '__fish_use_subcommand' -a ${alias} -d '${desc}'`,\n );\n }\n\n // Command-specific options\n for (const opt of cmd.options) {\n const optDesc = opt.description.replace(/'/g, \"\\\\'\");\n const parts = [`complete -c bsky -n '__fish_seen_subcommand_from ${cmd.name}'`];\n if (opt.long) parts.push(`-l ${opt.long}`);\n if (opt.short) parts.push(`-s ${opt.short}`);\n parts.push(`-d '${optDesc}'`);\n lines.push(parts.join(\" \"));\n }\n\n // Nested subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n if (programCmd && programCmd.commands.length > 0) {\n for (const sub of programCmd.commands) {\n const subDesc = sub.description().replace(/'/g, \"\\\\'\");\n lines.push(\n `complete -c bsky -n '__fish_seen_subcommand_from ${cmd.name}' -a ${sub.name()} -d '${subDesc}'`,\n );\n }\n }\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function registerCompletions(program: Command): void {\n program\n .command(\"completions\")\n .description(\"Generate shell completion script\")\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish\")\n .action((shell: string) => {\n switch (shell) {\n case \"bash\":\n process.stdout.write(generateBash(program));\n break;\n case \"zsh\":\n process.stdout.write(generateZsh(program));\n break;\n case \"fish\":\n process.stdout.write(generateFish(program));\n break;\n default:\n console.error(\n `Unknown shell: ${shell}. Supported: bash, zsh, fish`,\n );\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["readFile","writeFile","readFile","writeFile","rl","password","program","chalk","program","chalk","program","readFile","stdin","stdin","readFile","program","program","chalk","program","chalk","chalk","program","chalk","program","program","readFile","detectMimeType","program","readFile","chalk","program","chalk","resolveDid","program","program","program","chalk","program","chalk","program","program"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/client.ts","../src/auth.ts","../src/commands/login.ts","../src/commands/timeline.ts","../src/lib/format.ts","../src/commands/thread.ts","../src/commands/post.ts","../src/lib/extract.ts","../src/commands/delete.ts","../src/commands/like.ts","../src/commands/repost.ts","../src/commands/social.ts","../src/commands/search.ts","../src/commands/profile.ts","../src/commands/notification.ts","../src/commands/moderation.ts","../src/commands/bookmark.ts","../src/commands/password.ts","../src/commands/invite.ts","../src/commands/completions.ts","../src/commands/dm.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { loadConfig } from \"@/config\";\nimport { createClient } from \"@/client\";\nimport { registerLogin } from \"@/commands/login\";\nimport { registerTimeline, registerStream } from \"@/commands/timeline\";\nimport { registerThread } from \"@/commands/thread\";\nimport { registerPost, registerReply, registerQuote } from \"@/commands/post\";\nimport { registerDelete } from \"@/commands/delete\";\nimport { registerLike, registerLikes } from \"@/commands/like\";\nimport { registerRepost, registerReposts } from \"@/commands/repost\";\nimport {\n registerFollow,\n registerUnfollow,\n registerFollows,\n registerFollowers,\n registerBlock,\n registerUnblock,\n registerBlocks,\n registerMute,\n} from \"@/commands/social\";\nimport { registerSearch, registerSearchUsers } from \"@/commands/search\";\nimport {\n registerProfile,\n registerProfileUpdate,\n registerSession,\n} from \"@/commands/profile\";\nimport { registerNotifs } from \"@/commands/notification\";\nimport { registerReport, registerModList } from \"@/commands/moderation\";\nimport { registerBookmarks } from \"@/commands/bookmark\";\nimport { registerAppPassword } from \"@/commands/password\";\nimport { registerInviteCodes } from \"@/commands/invite\";\nimport { registerCompletions } from \"@/commands/completions\";\nimport { registerDm } from \"@/commands/dm\";\nimport type { AtpAgent } from \"@atproto/api\";\nimport type { Config } from \"@/lib/types\";\n\nconst program = new Command();\n\nprogram\n .name(\"bsky\")\n .description(\"A CLI client for Bluesky\")\n .version(\"1.1.0\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-p, --profile <name>\", \"Profile name\")\n .option(\"-v, --verbose\", \"Verbose output\");\n\nfunction resolveProfile(program: Command): string | undefined {\n return program.opts().profile ?? process.env.BSKY_PROFILE;\n}\n\n// Helper to get authenticated client within commands\nexport async function getClient(program: Command): Promise<AtpAgent> {\n const profile = resolveProfile(program);\n const config = await loadConfig(profile);\n const prefix = profile ? `${profile}-` : \"\";\n return createClient(config, prefix);\n}\n\nexport async function getConfig(program: Command): Promise<Config> {\n const profile = resolveProfile(program);\n return loadConfig(profile);\n}\n\nexport function isJson(program: Command): boolean {\n return program.opts().json === true;\n}\n\n// Register all commands\nregisterLogin(program);\nregisterTimeline(program);\nregisterStream(program);\nregisterThread(program);\nregisterPost(program);\nregisterReply(program);\nregisterQuote(program);\nregisterDelete(program);\nregisterLike(program);\nregisterLikes(program);\nregisterRepost(program);\nregisterReposts(program);\nregisterFollow(program);\nregisterUnfollow(program);\nregisterFollows(program);\nregisterFollowers(program);\nregisterBlock(program);\nregisterUnblock(program);\nregisterBlocks(program);\nregisterMute(program);\nregisterSearch(program);\nregisterSearchUsers(program);\nregisterProfile(program);\nregisterProfileUpdate(program);\nregisterSession(program);\nregisterNotifs(program);\nregisterReport(program);\nregisterModList(program);\nregisterBookmarks(program);\nregisterAppPassword(program);\nregisterInviteCodes(program);\nregisterCompletions(program);\nregisterDm(program);\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err.message ?? err);\n process.exit(1);\n});\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readdirSync } from \"node:fs\";\nimport type { Config } from \"@/lib/types\";\n\nfunction configDir(): string {\n return join(homedir(), \".config\");\n}\n\nfunction bskyDir(): string {\n return join(configDir(), \"bsky\");\n}\n\nexport function configPath(profile?: string): string {\n if (profile) {\n return join(bskyDir(), `config-${profile}.json`);\n }\n return join(bskyDir(), \"config.json\");\n}\n\nexport function authPath(handle: string, prefix: string = \"\"): string {\n return join(bskyDir(), `${prefix}${handle}.auth`);\n}\n\nexport async function loadConfig(profile?: string): Promise<Config> {\n if (profile === \"?\") {\n listProfiles();\n process.exit(0);\n }\n\n const fp = configPath(profile);\n await mkdir(dirname(fp), { recursive: true });\n\n let cfg: Config = {\n host: \"https://bsky.social\",\n bgs: \"https://bsky.network\",\n handle: \"\",\n password: \"\",\n };\n\n try {\n const data = await readFile(fp, \"utf-8\");\n const fileCfg: Partial<Config> = JSON.parse(data);\n cfg = { ...cfg, ...fileCfg };\n } catch {\n // No config file — env vars or login required\n }\n\n // Env vars override config file values\n if (process.env.BSKY_HANDLE) cfg.handle = process.env.BSKY_HANDLE;\n if (process.env.BSKY_PASSWORD) cfg.password = process.env.BSKY_PASSWORD;\n if (process.env.BSKY_HOST) cfg.host = process.env.BSKY_HOST;\n if (process.env.BSKY_BGS) cfg.bgs = process.env.BSKY_BGS;\n\n if (!cfg.handle || !cfg.password) {\n throw new Error(\n \"No credentials found. Run 'bsky login' or set BSKY_HANDLE and BSKY_PASSWORD.\",\n );\n }\n\n return cfg;\n}\n\nexport async function saveConfig(\n config: Config,\n profile?: string,\n): Promise<void> {\n const fp = configPath(profile);\n await mkdir(dirname(fp), { recursive: true });\n await writeFile(fp, JSON.stringify(config, null, \" \") + \"\\n\", {\n mode: 0o644,\n });\n}\n\nfunction listProfiles(): void {\n const dir = bskyDir();\n if (!existsSync(dir)) return;\n\n const files = readdirSync(dir);\n for (const file of files) {\n if (file.startsWith(\"config-\") && file.endsWith(\".json\")) {\n const name = file.slice(7, -5);\n console.log(name);\n }\n }\n}\n","import { AtpAgent } from \"@atproto/api\";\nimport { readAuth, writeAuth, prompt2FA } from \"@/auth\";\nimport type { Config } from \"@/lib/types\";\n\nexport async function createClient(\n config: Config,\n prefix: string = \"\",\n): Promise<AtpAgent> {\n const agent = new AtpAgent({ service: config.host });\n\n // Try refreshing existing session first\n const auth = await readAuth(config.handle, prefix);\n if (auth) {\n try {\n // Resume session using saved auth, then refresh\n await agent.resumeSession({\n did: auth.did,\n handle: auth.handle,\n accessJwt: auth.refreshJwt,\n refreshJwt: auth.refreshJwt,\n active: true,\n });\n\n const refreshed = await agent.com.atproto.server.refreshSession(\n undefined,\n {\n headers: {\n authorization: `Bearer ${auth.refreshJwt}`,\n },\n },\n );\n\n // Resume with refreshed tokens\n await agent.resumeSession({\n did: refreshed.data.did,\n handle: refreshed.data.handle,\n accessJwt: refreshed.data.accessJwt,\n refreshJwt: refreshed.data.refreshJwt,\n active: true,\n });\n\n await writeAuth(\n {\n did: refreshed.data.did,\n handle: refreshed.data.handle,\n accessJwt: refreshed.data.accessJwt,\n refreshJwt: refreshed.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n } catch {\n // Refresh failed, fall through to full login\n }\n }\n\n // Full login with credentials\n try {\n const loginResponse = await agent.login({\n identifier: config.handle,\n password: config.password,\n });\n\n await writeAuth(\n {\n did: loginResponse.data.did,\n handle: loginResponse.data.handle,\n accessJwt: loginResponse.data.accessJwt,\n refreshJwt: loginResponse.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n } catch (err: unknown) {\n // Handle 2FA\n if (\n err instanceof Error &&\n err.message.includes(\"AuthFactorTokenRequired\")\n ) {\n const token = await prompt2FA();\n const loginResponse = await agent.login({\n identifier: config.handle,\n password: config.password,\n authFactorToken: token,\n });\n\n await writeAuth(\n {\n did: loginResponse.data.did,\n handle: loginResponse.data.handle,\n accessJwt: loginResponse.data.accessJwt,\n refreshJwt: loginResponse.data.refreshJwt,\n },\n config.handle,\n prefix,\n );\n\n return agent;\n }\n\n throw new Error(`Cannot create session: ${err}`);\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport { stdin, stdout, stderr } from \"node:process\";\nimport { authPath } from \"@/config\";\nimport type { AuthInfo, Config } from \"@/lib/types\";\n\nexport async function readAuth(\n handle: string,\n prefix: string = \"\",\n): Promise<AuthInfo | null> {\n try {\n const fp = authPath(handle, prefix);\n const data = await readFile(fp, \"utf-8\");\n return JSON.parse(data) as AuthInfo;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuth(\n auth: AuthInfo,\n handle: string,\n prefix: string = \"\",\n): Promise<void> {\n const fp = authPath(handle, prefix);\n await writeFile(fp, JSON.stringify(auth, null, \" \") + \"\\n\", {\n mode: 0o600,\n });\n}\n\nexport async function promptPassword(): Promise<string> {\n if (stdin.isTTY) {\n // Interactive: hide input by sending output to /dev/null\n stderr.write(\"Password: \");\n const muted = createWriteStream(\"/dev/null\");\n const rl = createInterface({ input: stdin, output: muted });\n const password = await rl.question(\"\");\n rl.close();\n stderr.write(\"\\n\");\n return password.trim();\n }\n\n // Piped: read a single line from stdin\n const rl = createInterface({ input: stdin });\n const password = await rl.question(\"\");\n rl.close();\n return password.trim();\n}\n\nexport async function prompt2FA(): Promise<string> {\n stderr.write(\n \"2FA is enabled. A sign-in code has been sent to your email.\\nEnter the code: \",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n const code = await rl.question(\"\");\n rl.close();\n return code.trim();\n}\n","import type { Command } from \"commander\";\nimport { saveConfig } from \"@/config\";\nimport { promptPassword } from \"@/auth\";\nimport type { Config } from \"@/lib/types\";\n\nexport function registerLogin(program: Command): void {\n program\n .command(\"login\")\n .description(\"Login to Bluesky\")\n .argument(\"<handle>\", \"Your Bluesky handle\")\n .argument(\"[password]\", \"Your app password (prompts if omitted)\")\n .option(\"--host <url>\", \"PDS host URL\", \"https://bsky.social\")\n .option(\"--bgs <url>\", \"BGS host URL\", \"https://bsky.network\")\n .action(\n async (\n handle: string,\n password: string | undefined,\n opts: { host: string; bgs: string },\n ) => {\n const resolvedPassword =\n password ?? process.env.BSKY_PASSWORD ?? (await promptPassword());\n const profile = program.opts().profile;\n const config: Config = {\n host: opts.host,\n bgs: opts.bgs,\n handle,\n password: resolvedPassword,\n };\n await saveConfig(config, profile);\n },\n );\n}\n","import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport WebSocket from \"ws\";\n\nimport {\n getClient,\n isJson,\n} from \"@/index\";\nimport {\n outputJson,\n printPost,\n printStreamPost,\n} from \"@/lib/format\";\nimport type {\n JetstreamCommitEvent,\n JetstreamEvent,\n} from \"@/lib/types\";\nimport type {\n AppBskyFeedDefs,\n AppBskyFeedPost,\n} from \"@atproto/api\";\n\nconst DEFAULT_JETSTREAM = \"wss://jetstream1.us-east.bsky.network/subscribe\";\n\nexport function registerTimeline(program: Command): void {\n program\n .command(\"timeline\")\n .alias(\"tl\")\n .description(\"Show timeline\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .option(\"-n <count>\", \"Number of items\", \"30\")\n .action(async (opts: { handle?: string; n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const n = parseInt(opts.n, 10);\n\n let feed: AppBskyFeedDefs.FeedViewPost[] = [];\n let cursor: string | undefined;\n\n while (true) {\n if (opts.handle) {\n const handle =\n opts.handle === \"self\" ? agent.session!.did : opts.handle;\n const resp = await agent.getAuthorFeed({\n actor: handle,\n cursor,\n limit: n,\n });\n feed.push(...resp.data.feed);\n cursor = resp.data.cursor;\n } else {\n const resp = await agent.getTimeline({\n cursor,\n limit: n,\n });\n feed.push(...resp.data.feed);\n cursor = resp.data.cursor;\n }\n\n if (!cursor || feed.length > n) break;\n }\n\n // Sort by date ascending\n feed.sort((a, b) => {\n const ta = new Date(\n (a.post.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n const tb = new Date(\n (b.post.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n return ta - tb;\n });\n\n if (feed.length > n) {\n feed = feed.slice(feed.length - n);\n }\n\n if (json) {\n for (const p of feed) outputJson(p);\n } else {\n for (const p of feed) printPost(p.post);\n }\n });\n}\n\nexport function registerStream(program: Command): void {\n program\n .command(\"stream\")\n .description(\"Stream live posts from the network\")\n .option(\"--cursor <cursor>\", \"Resume cursor (Unix microseconds)\")\n .option(\"-H, --handle <handle>\", \"Filter to a specific user\")\n .option(\"--pattern <regex>\", \"Filter post text by regex\")\n .option(\"--pattern-flags <flags>\", \"Regex flags for --pattern\", \"gi\")\n .option(\"--jetstream <url>\", \"Override Jetstream endpoint\")\n .action(\n async (opts: {\n cursor?: string;\n handle?: string;\n pattern?: string;\n patternFlags: string;\n jetstream?: string;\n }) => {\n const json = isJson(program);\n\n // Validate --pattern-flags\n const VALID_FLAGS = new Set([\"g\", \"i\", \"m\", \"s\", \"u\", \"v\", \"d\", \"y\"]);\n\n if (!opts.pattern && opts.patternFlags !== \"gi\") {\n program.error(`${chalk.bgRed.white(\"Fatal error:\")} --pattern-flags requires --pattern`);\n }\n\n if (opts.pattern) {\n let flagChars = opts.patternFlags.split(\"\");\n\n const unknown = flagChars.filter((f) => !VALID_FLAGS.has(f));\n if (unknown.length > 0) {\n program.error(`unknown regex flag(s): ${unknown.join(\", \")}`);\n }\n\n const uniqueFlags = new Set(flagChars);\n if (uniqueFlags.size !== flagChars.length) {\n const dupes = flagChars.filter((f, i) => flagChars.indexOf(f) !== i);\n console.warn(`\n ${chalk.bgYellow.black(\"Warning:\")} duplicate regex flag(s) removed: ${[...new Set(dupes)].join(\", \")}`,\n );\n flagChars = [...uniqueFlags];\n opts.patternFlags = flagChars.join(\"\");\n }\n\n if (flagChars.includes(\"u\") && flagChars.includes(\"v\")) {\n program.error(`${chalk.bgRed.white(\"Fatal error:\")}regex flags u and v cannot be used together`);\n }\n\n if (flagChars.includes(\"y\") && flagChars.includes(\"g\")) {\n console.warn(`${chalk.bgYellow.black(\"Warning:\")} sticky flag (y) makes global flag (g) meaningless`)\n }\n\n if (flagChars.includes(\"u\") && flagChars.includes(\"d\")) {\n console.warn(`${chalk.bgYellow.black(\"Warning:\")} unicode (u) with hasIndices (d) is valid but rarely needed`)\n }\n }\n\n // Build Jetstream URL\n const wsUrl = new URL(opts.jetstream ?? DEFAULT_JETSTREAM);\n wsUrl.searchParams.set(\"wantedCollections\", \"app.bsky.feed.post\");\n\n // Resolve --handle to DID for server-side filtering\n let filterHandle: string | null = null;\n if (opts.handle) {\n const agent = await getClient(program);\n if (opts.handle === \"self\") {\n wsUrl.searchParams.set(\"wantedDids\", agent.session!.did);\n filterHandle = agent.session!.handle;\n } else if (opts.handle.startsWith(\"did:\")) {\n wsUrl.searchParams.set(\"wantedDids\", opts.handle);\n } else {\n const profile = await agent.getProfile({ actor: opts.handle });\n wsUrl.searchParams.set(\"wantedDids\", profile.data.did);\n filterHandle = opts.handle;\n }\n }\n\n if (opts.cursor) {\n wsUrl.searchParams.set(\"cursor\", opts.cursor);\n }\n\n let re: RegExp | null = null;\n if (opts.pattern) {\n try {\n re = new RegExp(opts.pattern, opts.patternFlags);\n } catch (err) {\n program.error(`invalid regex pattern: ${(err as Error).message}`);\n }\n }\n let lastCursor = \"\";\n\n const ws = new WebSocket(wsUrl.toString());\n\n process.on(\"SIGINT\", () => {\n if (lastCursor) {\n console.error(`\\nCursor: ${lastCursor}`);\n }\n ws.close();\n process.exit(0);\n });\n\n ws.on(\"message\", (data: Buffer) => {\n try {\n const event = JSON.parse(data.toString()) as JetstreamEvent;\n lastCursor = String(event.time_us);\n\n // Only process commit events\n if (event.kind !== \"commit\") return;\n\n const commit = (event as JetstreamCommitEvent).commit;\n\n // Only process new posts\n if (commit.operation !== \"create\") return;\n if (commit.collection !== \"app.bsky.feed.post\") return;\n\n const text = commit.record?.text;\n if (!text) return;\n\n // Apply regex filter\n if (re && !re.test(text)) return;\n\n if (json) {\n outputJson(event);\n } else {\n printStreamPost(\n event.did,\n filterHandle,\n text,\n commit.rkey,\n commit.collection,\n );\n }\n } catch {\n // Skip malformed messages\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n console.error(\"WebSocket error:\", err.message);\n process.exit(1);\n });\n\n ws.on(\"close\", () => {\n if (lastCursor) {\n console.error(`Cursor: ${lastCursor}`);\n }\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {});\n },\n );\n}\n","import chalk from \"chalk\";\nimport type { AppBskyFeedDefs, AppBskyFeedPost } from \"@atproto/api\";\n\nexport function printPost(post: AppBskyFeedDefs.PostView): void {\n const rec = post.record as AppBskyFeedPost.Record;\n\n // Author line\n process.stdout.write(chalk.redBright(post.author.handle));\n process.stdout.write(` [${post.author.displayName ?? \"\"}]`);\n console.log(` (${formatTime(rec.createdAt)})`);\n\n // Post text\n console.log(rec.text);\n\n // Embedded images\n if (post.embed) {\n const images = post.embed as { images?: Array<{ fullsize: string }> };\n if (images.images) {\n for (const img of images.images) {\n console.log(` {${img.fullsize}}`);\n }\n }\n }\n\n // Engagement counts\n console.log(\n ` 👍(${post.likeCount ?? 0})⚡(${post.repostCount ?? 0})↩️ (${post.replyCount ?? 0})`,\n );\n\n // Reply reference\n if (rec.reply?.parent) {\n process.stdout.write(\" > \");\n console.log(chalk.blue(rec.reply.parent.uri));\n }\n\n // Post URI\n process.stdout.write(\" - \");\n console.log(chalk.blue(post.uri));\n console.log();\n}\n\nexport function printActor(actor: {\n handle: string;\n displayName?: string;\n did: string;\n}): void {\n process.stdout.write(chalk.redBright(actor.handle));\n process.stdout.write(` [${actor.displayName ?? \"\"}] `);\n console.log(chalk.blue(actor.did));\n}\n\nexport function formatTime(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toISOString();\n}\n\nexport function printStreamPost(\n did: string,\n handle: string | null,\n text: string,\n rkey: string,\n collection: string,\n): void {\n const author = handle ?? did;\n process.stdout.write(chalk.redBright(author));\n console.log(`: ${text}`);\n console.log(` at://${did}/${collection}/${rkey}`);\n console.log();\n}\n\nexport function printConvo(\n convo: {\n id: string;\n members: Array<{ handle: string; displayName?: string; did: string }>;\n unreadCount: number;\n muted: boolean;\n status?: string;\n lastMessage?: { $type?: string; text?: string; sentAt?: string };\n },\n myDid: string,\n): void {\n const others = convo.members.filter((m) => m.did !== myDid);\n const names = others.map((m) => m.handle).join(\", \");\n\n process.stdout.write(chalk.redBright(names));\n if (convo.unreadCount > 0) {\n process.stdout.write(chalk.yellow(` (${convo.unreadCount} unread)`));\n }\n if (convo.muted) {\n process.stdout.write(chalk.gray(\" [muted]\"));\n }\n if (convo.status === \"request\") {\n process.stdout.write(chalk.magenta(\" [request]\"));\n }\n console.log();\n\n if (convo.lastMessage && \"text\" in convo.lastMessage && convo.lastMessage.text) {\n const preview =\n convo.lastMessage.text.length > 80\n ? convo.lastMessage.text.slice(0, 80) + \"...\"\n : convo.lastMessage.text;\n console.log(` ${preview}`);\n if (convo.lastMessage.sentAt) {\n console.log(` ${chalk.gray(formatTime(convo.lastMessage.sentAt))}`);\n }\n }\n\n process.stdout.write(\" - \");\n console.log(chalk.blue(convo.id));\n console.log();\n}\n\nexport function printMessage(\n message: {\n $type?: string;\n id: string;\n text?: string;\n sender: { did: string };\n sentAt: string;\n },\n members: Array<{ handle: string; did: string; displayName?: string }>,\n): void {\n const sender = members.find((m) => m.did === message.sender.did);\n const senderName = sender?.handle ?? message.sender.did;\n\n process.stdout.write(chalk.redBright(senderName));\n console.log(` (${formatTime(message.sentAt)})`);\n\n if (\"text\" in message && message.text) {\n console.log(message.text);\n } else {\n console.log(chalk.gray(\"[deleted]\"));\n }\n\n process.stdout.write(\" - \");\n console.log(chalk.blue(message.id));\n console.log();\n}\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data));\n}\n","import type { Command } from \"commander\";\nimport type { AppBskyFeedDefs } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nfunction normalizeUri(uri: string): string {\n if (!uri.startsWith(\"at://did:plc:\")) {\n return \"at://did:plc:\" + uri;\n }\n return uri;\n}\n\nexport function registerThread(program: Command): void {\n program\n .command(\"thread\")\n .description(\"Show thread\")\n .argument(\"<uri>\", \"Post URI\")\n .option(\"-n <count>\", \"Number of items\", \"30\")\n .action(async (uri: string, opts: { n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const depth = parseInt(opts.n, 10);\n\n const resp = await agent.getPostThread({\n uri: normalizeUri(uri),\n depth,\n });\n\n const thread =\n resp.data.thread as AppBskyFeedDefs.ThreadViewPost;\n\n if (json) {\n outputJson(thread);\n if (thread.replies) {\n for (const r of thread.replies) outputJson(r);\n }\n return;\n }\n\n const replies = (thread.replies ?? []) as AppBskyFeedDefs.ThreadViewPost[];\n replies.reverse();\n\n printPost(thread.post);\n for (const r of replies) {\n if (r.post) printPost(r.post);\n }\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { stdin } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type {\n AppBskyFeedPost,\n AppBskyEmbedImages,\n AppBskyEmbedVideo,\n AppBskyEmbedExternal,\n AppBskyEmbedRecord,\n AppBskyRichtextFacet,\n ComAtprotoRepoStrongRef,\n} from \"@atproto/api\";\nimport { load as cheerioLoad } from \"cheerio\";\nimport { getClient, isJson } from \"@/index\";\nimport { extractLinks, extractMentions, extractTags } from \"@/lib/extract\";\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction detectMimeType(data: Uint8Array): string {\n // Check magic bytes for common formats\n if (data[0] === 0xff && data[1] === 0xd8) return \"image/jpeg\";\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47\n )\n return \"image/png\";\n if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)\n return \"image/gif\";\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46\n )\n return \"image/webp\";\n // Video formats\n if (data[4] === 0x66 && data[5] === 0x74 && data[6] === 0x79)\n return \"video/mp4\";\n return \"application/octet-stream\";\n}\n\nasync function buildFacets(\n agent: Awaited<ReturnType<typeof getClient>>,\n text: string,\n): Promise<AppBskyRichtextFacet.Main[]> {\n const facets: AppBskyRichtextFacet.Main[] = [];\n\n for (const entry of extractLinks(text)) {\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#link\", uri: entry.text },\n ],\n });\n }\n\n for (const entry of extractMentions(text)) {\n try {\n const profile = await agent.getProfile({ actor: entry.text });\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#mention\", did: profile.data.did },\n ],\n });\n } catch {\n // Skip unresolvable mentions\n }\n }\n\n for (const entry of extractTags(text)) {\n facets.push({\n index: { byteStart: entry.start, byteEnd: entry.end },\n features: [\n { $type: \"app.bsky.richtext.facet#tag\", tag: entry.text },\n ],\n });\n }\n\n return facets;\n}\n\nasync function fetchLinkCard(\n agent: Awaited<ReturnType<typeof getClient>>,\n url: string,\n): Promise<AppBskyEmbedExternal.Main | null> {\n try {\n const resp = await fetch(url);\n if (!resp.ok) return null;\n const html = await resp.text();\n const $ = cheerioLoad(html);\n\n let title = $(\"title\").text();\n let description =\n $('meta[property=\"description\"]').attr(\"content\") ?? \"\";\n const imgURL = $('meta[property=\"og:image\"]').attr(\"content\");\n\n if (!title) title = $('meta[property=\"og:title\"]').attr(\"content\") ?? url;\n if (!description)\n description =\n $('meta[property=\"og:description\"]').attr(\"content\") ?? url;\n\n const external: AppBskyEmbedExternal.External = {\n uri: url,\n title,\n description,\n };\n\n if (imgURL) {\n try {\n const imgResp = await fetch(imgURL);\n if (imgResp.ok) {\n const imgData = new Uint8Array(await imgResp.arrayBuffer());\n const uploadResp = await agent.uploadBlob(imgData, {\n encoding: detectMimeType(imgData),\n });\n external.thumb = uploadResp.data.blob;\n }\n } catch {\n // Skip thumbnail on failure\n }\n }\n\n return { $type: \"app.bsky.embed.external\", external };\n } catch {\n return null;\n }\n}\n\nasync function createPost(\n agent: Awaited<ReturnType<typeof getClient>>,\n text: string,\n opts: {\n reply?: ComAtprotoRepoStrongRef.Main;\n replyRoot?: ComAtprotoRepoStrongRef.Main;\n quote?: ComAtprotoRepoStrongRef.Main;\n images?: string[];\n imageAlts?: string[];\n video?: string;\n videoAlt?: string;\n },\n): Promise<string> {\n const facets = await buildFacets(agent, text);\n\n const post: AppBskyFeedPost.Record = {\n $type: \"app.bsky.feed.post\",\n text,\n createdAt: new Date().toISOString(),\n facets: facets.length > 0 ? facets : undefined,\n };\n\n // Reply\n if (opts.reply) {\n post.reply = {\n root: opts.replyRoot ?? opts.reply,\n parent: opts.reply,\n };\n }\n\n // Embed: images\n if (opts.images && opts.images.length > 0) {\n const images: AppBskyEmbedImages.Image[] = [];\n for (let i = 0; i < opts.images.length; i++) {\n const data = await readFile(opts.images[i]);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n images.push({\n alt: opts.imageAlts?.[i] ?? basename(opts.images[i]),\n image: uploadResp.data.blob,\n });\n }\n (post as Record<string, unknown>).embed = { $type: \"app.bsky.embed.images\", images };\n }\n\n // Embed: video\n if (opts.video) {\n const data = await readFile(opts.video);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n (post as Record<string, unknown>).embed = {\n $type: \"app.bsky.embed.video\",\n video: uploadResp.data.blob,\n alt: opts.videoAlt ?? basename(opts.video),\n };\n }\n\n // Embed: quote\n if (opts.quote) {\n (post as Record<string, unknown>).embed = {\n $type: \"app.bsky.embed.record\",\n record: opts.quote,\n };\n }\n\n // Embed: link card (first link, if no other embed)\n if (!post.embed) {\n const links = extractLinks(text);\n if (links.length > 0) {\n const card = await fetchLinkCard(agent, links[0].text);\n if (card) (post as Record<string, unknown>).embed = card;\n }\n }\n\n const resp = await agent.post(post);\n return resp.uri;\n}\n\nexport function registerPost(program: Command): void {\n program\n .command(\"post\")\n .description(\"Create a new post\")\n .argument(\"[text...]\", \"Post text\")\n .option(\"--stdin\", \"Read text from stdin\")\n .option(\"-i, --image <files...>\", \"Image files to attach\")\n .option(\"--image-alt <alts...>\", \"Alt text for images\")\n .option(\"--video <file>\", \"Video file to attach\")\n .option(\"--video-alt <alt>\", \"Alt text for video\")\n .action(\n async (\n textParts: string[],\n opts: {\n stdin?: boolean;\n image?: string[];\n imageAlt?: string[];\n video?: string;\n videoAlt?: string;\n },\n ) => {\n let text = textParts.join(\" \");\n if (opts.stdin) {\n text = await readStdin();\n }\n if (!text.trim()) {\n console.error(\"Error: post text is required\");\n process.exit(1);\n }\n\n const agent = await getClient(program);\n const uri = await createPost(agent, text, {\n images: opts.image,\n imageAlts: opts.imageAlt,\n video: opts.video,\n videoAlt: opts.videoAlt,\n });\n console.log(uri);\n },\n );\n}\n\nexport function registerReply(program: Command): void {\n program\n .command(\"reply\")\n .description(\"Reply to a post\")\n .argument(\"<uri>\", \"URI of the post to reply to\")\n .argument(\"<text...>\", \"Reply text\")\n .action(async (uri: string, textParts: string[]) => {\n const text = textParts.join(\" \");\n const agent = await getClient(program);\n\n // Fetch parent post\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const parent: ComAtprotoRepoStrongRef.Main = {\n uri: record.data.uri,\n cid: record.data.cid!,\n };\n\n // Check if parent is itself a reply (to get the root)\n const parentPost = record.data.value as AppBskyFeedPost.Record;\n const root =\n parentPost.reply?.root ??\n parent;\n\n const postUri = await createPost(agent, text, {\n reply: parent,\n replyRoot: root as ComAtprotoRepoStrongRef.Main,\n });\n console.log(postUri);\n });\n}\n\nexport function registerQuote(program: Command): void {\n program\n .command(\"quote\")\n .description(\"Quote a post\")\n .argument(\"<uri>\", \"URI of the post to quote\")\n .argument(\"<text...>\", \"Quote text\")\n .action(async (uri: string, textParts: string[]) => {\n const text = textParts.join(\" \");\n const agent = await getClient(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const postUri = await createPost(agent, text, {\n quote: {\n uri: record.data.uri,\n cid: record.data.cid!,\n },\n });\n console.log(postUri);\n });\n}\n","const URL_PATTERN = /https?:\\/\\/[-A-Za-z0-9+&@#/%?=~_|!:,.;()]+/g;\nconst MENTION_PATTERN = /@[a-zA-Z0-9.]+/g;\nconst TAG_PATTERN = /\\B#\\S+/g;\n\nexport interface TextEntry {\n start: number;\n end: number;\n text: string;\n}\n\nfunction byteLength(str: string): number {\n return new TextEncoder().encode(str).byteLength;\n}\n\nfunction extractWithByteOffsets(\n text: string,\n pattern: RegExp,\n stripPrefix?: string,\n): TextEntry[] {\n const results: TextEntry[] = [];\n let match: RegExpExecArray | null;\n\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n while ((match = pattern.exec(text)) !== null) {\n const before = text.slice(0, match.index);\n const matchText = match[0];\n const start = byteLength(before);\n const end = start + byteLength(matchText);\n const entryText = stripPrefix\n ? matchText.replace(new RegExp(`^${stripPrefix}`), \"\")\n : matchText;\n\n results.push({ start, end, text: entryText });\n }\n\n return results;\n}\n\nexport function extractLinks(text: string): TextEntry[] {\n return extractWithByteOffsets(text, URL_PATTERN);\n}\n\nexport function extractMentions(text: string): TextEntry[] {\n return extractWithByteOffsets(text, MENTION_PATTERN, \"@\");\n}\n\nexport function extractTags(text: string): TextEntry[] {\n return extractWithByteOffsets(text, TAG_PATTERN, \"#\");\n}\n","import type { Command } from \"commander\";\nimport { getClient } from \"@/index\";\n\nexport function registerDelete(program: Command): void {\n program\n .command(\"delete\")\n .description(\"Delete a post\")\n .argument(\"<uri...>\", \"Post URI(s) to delete\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n if (parts.length < 3) {\n console.error(`Invalid post URI: ${uri}`);\n continue;\n }\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerLike(program: Command): void {\n program\n .command(\"like\")\n .description(\"Like a post\")\n .argument(\"<uri...>\", \"Post URI(s) to like\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.like(record.data.uri, record.data.cid!);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerLikes(program: Command): void {\n program\n .command(\"likes\")\n .description(\"Show likes on a post\")\n .argument(\"<uri>\", \"Post URI\")\n .action(async (uri: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.getLikes({\n uri: record.data.uri,\n cid: record.data.cid,\n limit: 50,\n });\n\n if (json) {\n for (const v of resp.data.likes) outputJson(v);\n return;\n }\n\n for (const v of resp.data.likes) {\n process.stdout.write(\"👍 \");\n process.stdout.write(chalk.redBright(v.actor.handle));\n process.stdout.write(` [${v.actor.displayName ?? \"\"}]`);\n console.log(` (${v.createdAt})`);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerRepost(program: Command): void {\n program\n .command(\"repost\")\n .description(\"Repost a post\")\n .argument(\"<uri...>\", \"Post URI(s) to repost\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.repost(record.data.uri, record.data.cid!);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerReposts(program: Command): void {\n program\n .command(\"reposts\")\n .description(\"Show reposts of a post\")\n .argument(\"<uri>\", \"Post URI\")\n .action(async (uri: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n const resp = await agent.getRepostedBy({\n uri: record.data.uri,\n cid: record.data.cid,\n limit: 50,\n });\n\n if (json) {\n for (const r of resp.data.repostedBy) outputJson(r);\n return;\n }\n\n for (const r of resp.data.repostedBy) {\n process.stdout.write(\"⚡ \");\n process.stdout.write(chalk.redBright(r.handle));\n console.log(` [${r.displayName ?? \"\"}]`);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { printActor, outputJson } from \"@/lib/format\";\n\nasync function resolveDid(\n agent: Awaited<ReturnType<typeof getClient>>,\n handleOrDid: string,\n): Promise<string> {\n if (handleOrDid.startsWith(\"did:\")) return handleOrDid;\n const profile = await agent.getProfile({ actor: handleOrDid });\n return profile.data.did;\n}\n\nexport function registerFollow(program: Command): void {\n program\n .command(\"follow\")\n .description(\"Follow user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to follow\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const resp = await agent.follow(profile.data.did);\n console.log(resp.uri);\n }\n });\n}\n\nexport function registerUnfollow(program: Command): void {\n program\n .command(\"unfollow\")\n .description(\"Unfollow user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to unfollow\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const followUri = profile.data.viewer?.following;\n if (!followUri) continue;\n\n const parts = followUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n console.log(followUri);\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n\nexport function registerFollows(program: Command): void {\n program\n .command(\"follows\")\n .description(\"Show follows\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.getFollows({\n actor: handle,\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const f of resp.data.follows) outputJson(f);\n } else {\n for (const f of resp.data.follows) printActor(f);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerFollowers(program: Command): void {\n program\n .command(\"followers\")\n .description(\"Show followers\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.getFollowers({\n actor: handle,\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const f of resp.data.followers) outputJson(f);\n } else {\n for (const f of resp.data.followers) printActor(f);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerBlock(program: Command): void {\n program\n .command(\"block\")\n .description(\"Block user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to block\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n\n const resp = await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.block\",\n record: {\n $type: \"app.bsky.graph.block\",\n createdAt: new Date().toISOString(),\n subject: did,\n },\n });\n console.log(resp.data.uri);\n }\n });\n}\n\nexport function registerUnblock(program: Command): void {\n program\n .command(\"unblock\")\n .description(\"Unblock user(s)\")\n .argument(\"<handles...>\", \"Handle(s) to unblock\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const profile = await agent.getProfile({ actor: handle });\n const blockUri = profile.data.viewer?.blocking;\n if (!blockUri) continue;\n\n const parts = blockUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n\n console.log(blockUri);\n await agent.com.atproto.repo.deleteRecord({\n repo: agent.session!.did,\n collection,\n rkey,\n });\n }\n });\n}\n\nexport function registerBlocks(program: Command): void {\n program\n .command(\"blocks\")\n .description(\"Show blocked users\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n let cursor: string | undefined;\n while (true) {\n const resp = await agent.app.bsky.graph.getBlocks({\n cursor,\n limit: 100,\n });\n\n if (json) {\n for (const b of resp.data.blocks) outputJson(b);\n } else {\n for (const b of resp.data.blocks) printActor(b);\n }\n\n cursor = resp.data.cursor;\n if (!cursor) break;\n }\n });\n}\n\nexport function registerMute(program: Command): void {\n program\n .command(\"mute\")\n .description(\"Mute user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to mute\")\n .action(async (handles: string[]) => {\n const agent = await getClient(program);\n\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n await agent.mute(did);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { AppBskyFeedDefs, AppBskyFeedPost } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nexport function registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search posts\")\n .argument(\"<terms...>\", \"Search terms\")\n .option(\"-n <count>\", \"Number of results\", \"100\")\n .action(async (terms: string[], opts: { n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const n = parseInt(opts.n, 10);\n const query = terms.join(\" \");\n\n let results: AppBskyFeedDefs.PostView[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const resp = await agent.app.bsky.feed.searchPosts({\n q: query,\n cursor,\n limit: 100,\n });\n\n results.push(...resp.data.posts);\n cursor = resp.data.cursor;\n\n if (!cursor || results.length > n) break;\n }\n\n // Sort by date ascending\n results.sort((a, b) => {\n const ta = new Date(\n (a.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n const tb = new Date(\n (b.record as AppBskyFeedPost.Record).createdAt,\n ).getTime();\n return ta - tb;\n });\n\n if (results.length > n) {\n results = results.slice(results.length - n);\n }\n\n if (json) {\n for (const p of results) outputJson(p);\n } else {\n for (const p of results) printPost(p);\n }\n });\n}\n\nexport function registerSearchUsers(program: Command): void {\n program\n .command(\"search-users\")\n .description(\"Search for users\")\n .argument(\"<terms...>\", \"Search terms\")\n .option(\"-n <count>\", \"Number of results\", \"100\")\n .action(async (terms: string[], opts: { n: string }) => {\n const agent = await getClient(program);\n const n = parseInt(opts.n, 10);\n const query = terms.join(\" \");\n\n const resp = await agent.searchActors({\n term: query,\n limit: n,\n });\n\n for (const actor of resp.data.actors) {\n outputJson(actor);\n }\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nfunction detectMimeType(data: Uint8Array): string {\n if (data[0] === 0xff && data[1] === 0xd8) return \"image/jpeg\";\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47\n )\n return \"image/png\";\n if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)\n return \"image/gif\";\n return \"application/octet-stream\";\n}\n\nexport function registerProfile(program: Command): void {\n program\n .command(\"profile\")\n .description(\"Show profile\")\n .option(\"-H, --handle <handle>\", \"User handle\")\n .action(async (opts: { handle?: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const handle = opts.handle ?? agent.session!.handle;\n\n const resp = await agent.getProfile({ actor: handle });\n const profile = resp.data;\n\n if (json) {\n outputJson(profile);\n return;\n }\n\n console.log(`Did: ${profile.did}`);\n console.log(`Handle: ${profile.handle}`);\n console.log(`DisplayName: ${profile.displayName ?? \"\"}`);\n console.log(`Description: ${profile.description ?? \"\"}`);\n console.log(`Follows: ${profile.followsCount ?? 0}`);\n console.log(`Followers: ${profile.followersCount ?? 0}`);\n console.log(`Avatar: ${profile.avatar ?? \"\"}`);\n console.log(`Banner: ${profile.banner ?? \"\"}`);\n });\n}\n\nexport function registerProfileUpdate(program: Command): void {\n program\n .command(\"profile-update\")\n .description(\"Update profile\")\n .argument(\"[displayname]\", \"Display name\")\n .argument(\"[description]\", \"Description\")\n .option(\"--avatar <file>\", \"Avatar image file\")\n .option(\"--banner <file>\", \"Banner image file\")\n .action(\n async (\n displayName: string | undefined,\n description: string | undefined,\n opts: { avatar?: string; banner?: string },\n ) => {\n if (!displayName && !description && !opts.avatar && !opts.banner) {\n console.error(\"Error: provide at least one field to update\");\n process.exit(1);\n }\n\n const agent = await getClient(program);\n\n // Get current profile\n const current = await agent.getProfile({\n actor: agent.session!.handle,\n });\n\n const name = displayName ?? current.data.displayName;\n const desc = description ?? current.data.description;\n\n let avatar: unknown = undefined;\n if (opts.avatar) {\n const data = await readFile(opts.avatar);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n avatar = uploadResp.data.blob;\n }\n\n let banner: unknown = undefined;\n if (opts.banner) {\n const data = await readFile(opts.banner);\n const uploadResp = await agent.uploadBlob(data, {\n encoding: detectMimeType(data),\n });\n banner = uploadResp.data.blob;\n }\n\n // Get current record for swap\n const currentRecord = await agent.com.atproto.repo.getRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.actor.profile\",\n rkey: \"self\",\n });\n\n await agent.com.atproto.repo.putRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.actor.profile\",\n rkey: \"self\",\n record: {\n $type: \"app.bsky.actor.profile\",\n displayName: name,\n description: desc,\n ...(avatar ? { avatar } : {}),\n ...(banner ? { banner } : {}),\n },\n swapRecord: currentRecord.data.cid,\n });\n },\n );\n}\n\nexport function registerSession(program: Command): void {\n program\n .command(\"session\")\n .description(\"Show session info\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.getSession();\n const session = resp.data;\n\n if (json) {\n outputJson(session);\n return;\n }\n\n console.log(`Did: ${session.did}`);\n console.log(`Email: ${session.email ?? \"\"}`);\n console.log(`Handle: ${session.handle}`);\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type {\n AppBskyFeedPost,\n AppBskyFeedRepost,\n AppBskyFeedLike,\n AppBskyGraphFollow,\n} from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerNotifs(program: Command): void {\n program\n .command(\"notifs\")\n .alias(\"notification\")\n .description(\"Show notifications\")\n .option(\"-a, --all\", \"Show all (including read)\")\n .action(async (opts: { all?: boolean }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.listNotifications({ limit: 50 });\n const notifs = resp.data.notifications;\n\n if (json) {\n for (const n of notifs) outputJson(n);\n return;\n }\n\n for (const n of notifs) {\n if (!opts.all && n.isRead) continue;\n\n process.stdout.write(chalk.redBright(n.author.handle));\n process.stdout.write(` [${n.author.displayName ?? \"\"}] `);\n console.log(chalk.blue(n.author.did));\n\n const record = n.record as Record<string, unknown>;\n switch (record.$type) {\n case \"app.bsky.feed.post\":\n console.log(` ${n.reason} to ${n.uri}`);\n break;\n case \"app.bsky.feed.repost\": {\n const repost = record as unknown as AppBskyFeedRepost.Record;\n console.log(` reposted ${repost.subject.uri}`);\n break;\n }\n case \"app.bsky.feed.like\": {\n const like = record as unknown as AppBskyFeedLike.Record;\n console.log(` liked ${like.subject.uri}`);\n break;\n }\n case \"app.bsky.graph.follow\":\n console.log(\" followed you\");\n break;\n }\n }\n\n // Mark as seen\n await agent.app.bsky.notification.updateSeen({\n seenAt: new Date().toISOString(),\n });\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient } from \"@/index\";\n\nasync function resolveDid(\n agent: Awaited<ReturnType<typeof getClient>>,\n handleOrDid: string,\n): Promise<string> {\n if (handleOrDid.startsWith(\"did:\")) return handleOrDid;\n const profile = await agent.getProfile({ actor: handleOrDid });\n return profile.data.did;\n}\n\nexport function registerReport(program: Command): void {\n program\n .command(\"report\")\n .description(\"Report a user\")\n .argument(\"<handle>\", \"Handle or DID to report\")\n .option(\"--comment <text>\", \"Report comment\")\n .action(async (handle: string, opts: { comment?: string }) => {\n const agent = await getClient(program);\n const did = await resolveDid(agent, handle);\n\n const resp = await agent.com.atproto.moderation.createReport({\n reasonType: \"com.atproto.moderation.defs#reasonSpam\",\n subject: {\n $type: \"com.atproto.admin.defs#repoRef\",\n did,\n },\n reason: opts.comment,\n });\n\n console.log(\"Report created successfully:\", JSON.stringify(resp.data));\n });\n}\n\nexport function registerModList(program: Command): void {\n program\n .command(\"mod-list\")\n .description(\"Create a moderation list with user(s)\")\n .argument(\"<handles...>\", \"Handle(s) or DID(s) to add\")\n .option(\"--name <name>\", \"List name\", \"NewList\")\n .option(\"--desc <description>\", \"List description\", \"\")\n .action(\n async (\n handles: string[],\n opts: { name: string; desc: string },\n ) => {\n const agent = await getClient(program);\n\n // Create the list\n const listResp = await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.list\",\n record: {\n $type: \"app.bsky.graph.list\",\n name: opts.name,\n purpose: \"app.bsky.graph.defs#modlist\",\n description: opts.desc,\n createdAt: new Date().toISOString(),\n },\n });\n\n console.log(\"List created successfully. URI:\", listResp.data.uri);\n\n // Add users to the list\n for (const handle of handles) {\n const did = await resolveDid(agent, handle);\n\n await agent.com.atproto.repo.createRecord({\n repo: agent.session!.did,\n collection: \"app.bsky.graph.listitem\",\n record: {\n $type: \"app.bsky.graph.listitem\",\n subject: did,\n list: listResp.data.uri,\n createdAt: new Date().toISOString(),\n },\n });\n\n console.log(\"User added to moderation list successfully.\");\n }\n },\n );\n}\n","import type { Command } from \"commander\";\nimport { AppBskyFeedDefs } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printPost, outputJson } from \"@/lib/format\";\n\nexport function registerBookmarks(program: Command): void {\n const bookmarks = program\n .command(\"bookmarks\")\n .description(\"Manage bookmarks\");\n\n bookmarks\n .command(\"create\")\n .description(\"Bookmark a post\")\n .argument(\"<uri...>\", \"Post URI(s) to bookmark\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n const parts = atUri.split(\"/\");\n const rkey = parts[parts.length - 1];\n const collection = parts[parts.length - 2];\n const did = parts[2];\n\n const record = await agent.com.atproto.repo.getRecord({\n repo: did,\n collection,\n rkey,\n });\n\n await agent.app.bsky.bookmark.createBookmark({\n uri: record.data.uri,\n cid: record.data.cid!,\n });\n console.log(record.data.uri);\n }\n });\n\n bookmarks\n .command(\"delete\")\n .description(\"Remove a bookmark\")\n .argument(\"<uri...>\", \"Post URI(s) to unbookmark\")\n .action(async (uris: string[]) => {\n const agent = await getClient(program);\n\n for (const uri of uris) {\n const atUri = uri.startsWith(\"at://\") ? uri : `at://did:plc:${uri}`;\n await agent.app.bsky.bookmark.deleteBookmark({ uri: atUri });\n console.log(atUri);\n }\n });\n\n bookmarks\n .command(\"get\")\n .description(\"List bookmarked posts\")\n .option(\"-n, --count <number>\", \"Number of bookmarks to show\", \"50\")\n .action(async (opts: { count: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const limit = parseInt(opts.count, 10);\n\n let cursor: string | undefined;\n let remaining = limit;\n\n do {\n const resp = await agent.app.bsky.bookmark.getBookmarks({\n limit: Math.min(remaining, 50),\n cursor,\n });\n\n for (const bookmark of resp.data.bookmarks) {\n if (json) {\n outputJson(bookmark);\n } else if (AppBskyFeedDefs.isPostView(bookmark.item)) {\n printPost(bookmark.item);\n }\n }\n\n remaining -= resp.data.bookmarks.length;\n cursor = resp.data.cursor;\n } while (cursor && remaining > 0);\n });\n}\n","import type { Command } from \"commander\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerAppPassword(program: Command): void {\n const appPw = program\n .command(\"app-password\")\n .description(\"Manage app passwords\");\n\n appPw\n .command(\"list\")\n .description(\"List app passwords\")\n .action(async () => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.listAppPasswords();\n const passwords = resp.data.passwords;\n\n if (json) {\n for (const pw of passwords) outputJson(pw);\n return;\n }\n\n for (const pw of passwords) {\n console.log(`${pw.name} (${pw.createdAt})`);\n }\n });\n\n appPw\n .command(\"add\")\n .description(\"Create an app password\")\n .argument(\"<name>\", \"Password name\")\n .action(async (name: string) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.createAppPassword({\n name,\n });\n\n if (json) {\n outputJson(resp.data);\n } else {\n console.log(`${resp.data.name}: ${resp.data.password}`);\n }\n });\n\n appPw\n .command(\"revoke\")\n .description(\"Revoke an app password\")\n .argument(\"<name>\", \"Password name\")\n .action(async (name: string) => {\n const agent = await getClient(program);\n await agent.com.atproto.server.revokeAppPassword({ name });\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getClient, isJson } from \"@/index\";\nimport { outputJson } from \"@/lib/format\";\n\nexport function registerInviteCodes(program: Command): void {\n program\n .command(\"invite-codes\")\n .description(\"Show invite codes\")\n .option(\"--used\", \"Show used codes too\")\n .action(async (opts: { used?: boolean }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n\n const resp = await agent.com.atproto.server.getAccountInviteCodes({\n includeUsed: opts.used ?? false,\n });\n\n const codes = resp.data.codes;\n\n if (json) {\n for (const c of codes) outputJson(c);\n return;\n }\n\n for (const c of codes) {\n if (c.uses.length >= c.available) {\n console.log(chalk.magentaBright(`${c.code} (used)`));\n } else {\n console.log(c.code);\n }\n }\n });\n}\n","import type { Command } from \"commander\";\n\ninterface OptionInfo {\n short?: string;\n long?: string;\n description: string;\n}\n\ninterface CommandInfo {\n name: string;\n aliases: string[];\n description: string;\n options: OptionInfo[];\n}\n\nfunction getCommands(program: Command): CommandInfo[] {\n return program.commands.map((cmd) => ({\n name: cmd.name(),\n aliases: cmd.aliases(),\n description: cmd.description(),\n options: cmd.options.map((opt) => ({\n short: opt.short?.replace(/^-/, \"\") || undefined,\n long: opt.long?.replace(/^--/, \"\") || undefined,\n description: opt.description,\n })),\n }));\n}\n\nfunction getGlobalOptions(program: Command): OptionInfo[] {\n return program.options.map((opt) => ({\n short: opt.short?.replace(/^-/, \"\") || undefined,\n long: opt.long?.replace(/^--/, \"\") || undefined,\n description: opt.description,\n }));\n}\n\nfunction optionFlag(opt: OptionInfo): string {\n return opt.long ? `--${opt.long}` : `-${opt.short}`;\n}\n\nfunction generateBash(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const cmdNames = commands\n .flatMap((c) => [c.name, ...c.aliases])\n .join(\" \");\n\n const globalFlags = globalOpts\n .map((o) => optionFlag(o))\n .join(\" \");\n\n const caseClauses = commands\n .map((cmd) => {\n const names = [cmd.name, ...cmd.aliases];\n const opts = cmd.options.map((o) => optionFlag(o)).join(\" \");\n return names.map((n) => ` ${n}) opts=\"${opts}\" ;;`).join(\"\\n\");\n })\n .join(\"\\n\");\n\n // Check for subcommands (e.g. app-password list|add|revoke)\n const subcommandClauses = commands\n .filter((cmd) => {\n // Find commands registered on the program that themselves have subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n return programCmd && programCmd.commands.length > 0;\n })\n .map((cmd) => {\n const programCmd = program.commands.find((c) => c.name() === cmd.name)!;\n const subNames = programCmd.commands.map((sub) => sub.name()).join(\" \");\n return ` ${cmd.name}) opts=\"${subNames}\" ;;`;\n })\n .join(\"\\n\");\n\n return `#!/bin/bash\n\n_bsky_completions() {\n local cur prev commands global_opts opts\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"${cmdNames}\"\n global_opts=\"${globalFlags} --help --version\"\n\n if [[ \\${COMP_CWORD} -eq 1 ]]; then\n COMPREPLY=( $(compgen -W \"\\${commands} \\${global_opts}\" -- \"\\${cur}\") )\n return 0\n fi\n\n case \"\\${COMP_WORDS[1]}\" in\n${caseClauses}\n${subcommandClauses}\n *) opts=\"\" ;;\n esac\n\n COMPREPLY=( $(compgen -W \"\\${opts} --help\" -- \"\\${cur}\") )\n return 0\n}\n\ncomplete -F _bsky_completions bsky\n`;\n}\n\nfunction generateZsh(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const cmdList = commands\n .map((c) => {\n const desc = c.description.replace(/'/g, \"'\\\\''\");\n return ` '${c.name}:${desc}'`;\n })\n .join(\"\\n\");\n\n const globalOptsList = globalOpts\n .map((o) => {\n const desc = o.description.replace(/'/g, \"'\\\\''\");\n return ` '${optionFlag(o)}[${desc}]'`;\n })\n .join(\"\\n\");\n\n const subcmdFunctions = commands\n .map((cmd) => {\n const opts = cmd.options\n .map((o) => {\n const desc = o.description.replace(/'/g, \"'\\\\''\");\n return ` '${optionFlag(o)}[${desc}]'`;\n })\n .join(\"\\n\");\n\n // Check for nested subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n const subCommands = programCmd?.commands ?? [];\n\n if (subCommands.length > 0) {\n const subList = subCommands\n .map((sub) => {\n const desc = sub.description().replace(/'/g, \"'\\\\''\");\n return ` '${sub.name()}:${desc}'`;\n })\n .join(\"\\n\");\n return ` ${cmd.name})\n local -a subcommands\n subcommands=(\n${subList}\n )\n _describe 'subcommand' subcommands\n ;;`;\n }\n\n if (!opts) return ` ${cmd.name}) ;;`;\n return ` ${cmd.name})\n _arguments \\\\\n${opts}\n ;;`;\n })\n .join(\"\\n\");\n\n return `#compdef bsky\n\n_bsky() {\n local -a commands\n commands=(\n${cmdList}\n )\n\n _arguments \\\\\n${globalOptsList} \\\\\n '1:command:->command' \\\\\n '*::arg:->args'\n\n case \\$state in\n command)\n _describe 'command' commands\n ;;\n args)\n case \\$words[1] in\n${subcmdFunctions}\n esac\n ;;\n esac\n}\n\n_bsky \"$@\"\n`;\n}\n\nfunction generateFish(program: Command): string {\n const commands = getCommands(program);\n const globalOpts = getGlobalOptions(program);\n\n const lines: string[] = [\n \"# Fish completions for bsky\",\n \"# Generated by: bsky completions fish\",\n \"\",\n \"# Disable file completions by default\",\n \"complete -c bsky -f\",\n \"\",\n ];\n\n // Global options\n for (const opt of globalOpts) {\n const desc = opt.description.replace(/'/g, \"\\\\'\");\n const parts = [`complete -c bsky -n '__fish_use_subcommand'`];\n if (opt.long) parts.push(`-l ${opt.long}`);\n if (opt.short) parts.push(`-s ${opt.short}`);\n parts.push(`-d '${desc}'`);\n lines.push(parts.join(\" \"));\n }\n\n lines.push(\"\");\n\n // Subcommands\n for (const cmd of commands) {\n const desc = cmd.description.replace(/'/g, \"\\\\'\");\n lines.push(\n `complete -c bsky -n '__fish_use_subcommand' -a ${cmd.name} -d '${desc}'`,\n );\n for (const alias of cmd.aliases) {\n lines.push(\n `complete -c bsky -n '__fish_use_subcommand' -a ${alias} -d '${desc}'`,\n );\n }\n\n // Command-specific options\n for (const opt of cmd.options) {\n const optDesc = opt.description.replace(/'/g, \"\\\\'\");\n const parts = [`complete -c bsky -n '__fish_seen_subcommand_from ${cmd.name}'`];\n if (opt.long) parts.push(`-l ${opt.long}`);\n if (opt.short) parts.push(`-s ${opt.short}`);\n parts.push(`-d '${optDesc}'`);\n lines.push(parts.join(\" \"));\n }\n\n // Nested subcommands\n const programCmd = program.commands.find((c) => c.name() === cmd.name);\n if (programCmd && programCmd.commands.length > 0) {\n for (const sub of programCmd.commands) {\n const subDesc = sub.description().replace(/'/g, \"\\\\'\");\n lines.push(\n `complete -c bsky -n '__fish_seen_subcommand_from ${cmd.name}' -a ${sub.name()} -d '${subDesc}'`,\n );\n }\n }\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function registerCompletions(program: Command): void {\n program\n .command(\"completions\")\n .description(\"Generate shell completion script\")\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish\")\n .action((shell: string) => {\n switch (shell) {\n case \"bash\":\n process.stdout.write(generateBash(program));\n break;\n case \"zsh\":\n process.stdout.write(generateZsh(program));\n break;\n case \"fish\":\n process.stdout.write(generateFish(program));\n break;\n default:\n console.error(\n `Unknown shell: ${shell}. Supported: bash, zsh, fish`,\n );\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { ChatBskyConvoDefs } from \"@atproto/api\";\nimport { getClient, isJson } from \"@/index\";\nimport { printConvo, printMessage, outputJson } from \"@/lib/format\";\n\nasync function resolveConvoId(\n agent: Awaited<ReturnType<typeof getClient>>,\n handle: string,\n): Promise<string> {\n const did = handle.startsWith(\"did:\")\n ? handle\n : (await agent.getProfile({ actor: handle })).data.did;\n const resp = await agent.chat.bsky.convo.getConvoForMembers({\n members: [agent.session!.did, did],\n });\n return resp.data.convo.id;\n}\n\nexport function registerDm(program: Command): void {\n const dm = new Command(\"dm\").description(\"Direct messages\");\n\n dm.command(\"list\")\n .description(\"List DM conversations\")\n .option(\"--unread\", \"Show only unread conversations\")\n .option(\"--requests\", \"Show conversation requests\")\n .option(\"-n <count>\", \"Number of conversations\", \"50\")\n .action(async (opts: { unread?: boolean; requests?: boolean; n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const limit = parseInt(opts.n, 10);\n\n let cursor: string | undefined;\n let count = 0;\n while (true) {\n const resp = await agent.chat.bsky.convo.listConvos({\n cursor,\n limit: Math.min(limit - count, 100),\n readState: opts.unread ? \"unread\" : undefined,\n status: opts.requests ? \"request\" : undefined,\n });\n\n for (const convo of resp.data.convos) {\n if (json) {\n outputJson(convo);\n } else {\n printConvo(convo, agent.session!.did);\n }\n count++;\n if (count >= limit) break;\n }\n\n cursor = resp.data.cursor;\n if (!cursor || count >= limit) break;\n }\n });\n\n dm.command(\"read\")\n .description(\"Read messages in a conversation\")\n .argument(\"<handle>\", \"Handle or DID of the other user\")\n .option(\"-n <count>\", \"Number of messages\", \"30\")\n .action(async (handle: string, opts: { n: string }) => {\n const agent = await getClient(program);\n const json = isJson(program);\n const limit = parseInt(opts.n, 10);\n\n const convoId = await resolveConvoId(agent, handle);\n const convoResp = await agent.chat.bsky.convo.getConvo({ convoId });\n const members = convoResp.data.convo.members;\n\n const resp = await agent.chat.bsky.convo.getMessages({\n convoId,\n limit,\n });\n\n const messages = [...resp.data.messages].reverse();\n\n for (const msg of messages) {\n if (json) {\n outputJson(msg);\n } else if (\n ChatBskyConvoDefs.isMessageView(msg) ||\n ChatBskyConvoDefs.isDeletedMessageView(msg)\n ) {\n printMessage(msg, members);\n }\n }\n });\n\n dm.command(\"send\")\n .description(\"Send a direct message\")\n .argument(\"<handle>\", \"Handle or DID of the recipient\")\n .argument(\"<text...>\", \"Message text\")\n .action(async (handle: string, textParts: string[]) => {\n const text = textParts.join(\" \");\n if (!text.trim()) {\n program.error(\"message text is required\");\n }\n\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n const resp = await agent.chat.bsky.convo.sendMessage({\n convoId,\n message: { text },\n });\n console.log(resp.data.id);\n });\n\n dm.command(\"delete\")\n .description(\"Delete a message for yourself\")\n .argument(\"<handle>\", \"Handle or DID of the conversation partner\")\n .argument(\"<messageId>\", \"Message ID to delete\")\n .action(async (handle: string, messageId: string) => {\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n await agent.chat.bsky.convo.deleteMessageForSelf({\n convoId,\n messageId,\n });\n });\n\n dm.command(\"accept\")\n .description(\"Accept a conversation request\")\n .argument(\"<handle>\", \"Handle or DID of the requesting user\")\n .action(async (handle: string) => {\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n await agent.chat.bsky.convo.acceptConvo({ convoId });\n });\n\n dm.command(\"mark-read\")\n .description(\"Mark a conversation as read\")\n .argument(\"<handle>\", \"Handle or DID of the conversation partner\")\n .action(async (handle: string) => {\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n await agent.chat.bsky.convo.updateRead({ convoId });\n });\n\n dm.command(\"mute\")\n .description(\"Mute a conversation\")\n .argument(\"<handle>\", \"Handle or DID of the conversation partner\")\n .action(async (handle: string) => {\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n await agent.chat.bsky.convo.muteConvo({ convoId });\n });\n\n dm.command(\"unmute\")\n .description(\"Unmute a conversation\")\n .argument(\"<handle>\", \"Handle or DID of the conversation partner\")\n .action(async (handle: string) => {\n const agent = await getClient(program);\n const convoId = await resolveConvoId(agent, handle);\n\n await agent.chat.bsky.convo.unmuteConvo({ convoId });\n });\n\n program.addCommand(dm);\n}\n"],"mappings":"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","names":["Command","readFile","writeFile","readFile","writeFile","rl","password","program","chalk","program","chalk","program","readFile","stdin","stdin","readFile","program","program","chalk","program","chalk","chalk","program","chalk","program","program","readFile","detectMimeType","program","readFile","chalk","program","chalk","resolveDid","program","program","program","chalk","program","chalk","program","program","Command","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harveyrandall/bsky-cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A CLI client for Bluesky",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,7 +15,8 @@
15
15
  "test:coverage": "vitest run --coverage",
16
16
  "link:global": "yarn build && npm link",
17
17
  "unlink:global": "npm unlink -g @harveyrandall/bsky-cli",
18
- "prepublishOnly": "yarn typecheck && yarn test:run && yarn build"
18
+ "prepublishOnly": "yarn typecheck && yarn test:run && yarn build",
19
+ "publish:npm": "npm publish --access public"
19
20
  },
20
21
  "engines": {
21
22
  "node": ">=22"