@jackwener/opencli 1.7.13 → 1.7.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/cli-manifest.json +326 -44
  2. package/clis/bilibili/subtitle.js +1 -1
  3. package/clis/dianping/cityResolver.js +185 -0
  4. package/clis/dianping/dianping.test.js +154 -0
  5. package/clis/dianping/search.js +6 -3
  6. package/clis/douyin/_shared/browser-fetch.js +14 -2
  7. package/clis/douyin/_shared/browser-fetch.test.js +13 -0
  8. package/clis/douyin/stats.js +1 -1
  9. package/clis/douyin/update.js +1 -1
  10. package/clis/jike/search.js +1 -1
  11. package/clis/reddit/search.js +1 -1
  12. package/clis/reddit/subreddit.js +1 -1
  13. package/clis/reddit/user-comments.js +1 -1
  14. package/clis/reddit/user-posts.js +1 -1
  15. package/clis/reddit/user.js +1 -1
  16. package/clis/twitter/article.js +2 -1
  17. package/clis/twitter/bookmark-folder.js +189 -0
  18. package/clis/twitter/bookmark-folder.test.js +334 -0
  19. package/clis/twitter/bookmark-folders.js +117 -0
  20. package/clis/twitter/bookmark-folders.test.js +150 -0
  21. package/clis/twitter/bookmark.js +15 -6
  22. package/clis/twitter/bookmark.test.js +74 -0
  23. package/clis/twitter/bookmarks.js +7 -5
  24. package/clis/twitter/delete.js +11 -35
  25. package/clis/twitter/delete.test.js +21 -9
  26. package/clis/twitter/download.js +5 -5
  27. package/clis/twitter/followers.js +9 -3
  28. package/clis/twitter/following.js +11 -5
  29. package/clis/twitter/hide-reply.js +24 -5
  30. package/clis/twitter/hide-reply.test.js +76 -0
  31. package/clis/twitter/like.js +21 -11
  32. package/clis/twitter/like.test.js +73 -0
  33. package/clis/twitter/likes.js +8 -6
  34. package/clis/twitter/list-add.js +4 -4
  35. package/clis/twitter/list-remove.js +4 -4
  36. package/clis/twitter/list-tweets.js +6 -4
  37. package/clis/twitter/lists.js +3 -3
  38. package/clis/twitter/notifications.js +2 -2
  39. package/clis/twitter/profile.js +4 -3
  40. package/clis/twitter/quote.js +167 -0
  41. package/clis/twitter/quote.test.js +194 -0
  42. package/clis/twitter/reply.js +24 -178
  43. package/clis/twitter/reply.test.js +29 -11
  44. package/clis/twitter/retweet.js +94 -0
  45. package/clis/twitter/retweet.test.js +73 -0
  46. package/clis/twitter/search.js +175 -23
  47. package/clis/twitter/search.test.js +266 -1
  48. package/clis/twitter/shared.js +81 -0
  49. package/clis/twitter/shared.test.js +134 -1
  50. package/clis/twitter/thread.js +6 -4
  51. package/clis/twitter/timeline.js +8 -6
  52. package/clis/twitter/tweets.js +5 -3
  53. package/clis/twitter/unbookmark.js +13 -6
  54. package/clis/twitter/unbookmark.test.js +73 -0
  55. package/clis/twitter/unlike.js +80 -0
  56. package/clis/twitter/unlike.test.js +75 -0
  57. package/clis/twitter/unretweet.js +94 -0
  58. package/clis/twitter/unretweet.test.js +73 -0
  59. package/clis/twitter/utils.js +286 -0
  60. package/clis/twitter/utils.test.js +169 -0
  61. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  62. package/dist/src/browser/ax-snapshot.js +217 -0
  63. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  64. package/dist/src/browser/ax-snapshot.test.js +91 -0
  65. package/dist/src/browser/base-page.d.ts +51 -0
  66. package/dist/src/browser/base-page.js +545 -2
  67. package/dist/src/browser/base-page.test.js +520 -4
  68. package/dist/src/browser/bridge.js +47 -45
  69. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  70. package/dist/src/browser/cdp-click-fixture.test.js +87 -0
  71. package/dist/src/browser/cdp.js +5 -0
  72. package/dist/src/browser/cdp.test.js +1 -0
  73. package/dist/src/browser/daemon-client.d.ts +3 -1
  74. package/dist/src/browser/find.d.ts +9 -1
  75. package/dist/src/browser/find.js +219 -0
  76. package/dist/src/browser/find.test.js +61 -1
  77. package/dist/src/browser/page.d.ts +2 -1
  78. package/dist/src/browser/page.js +13 -0
  79. package/dist/src/browser/page.test.js +28 -0
  80. package/dist/src/browser/target-errors.d.ts +3 -1
  81. package/dist/src/browser/target-errors.js +2 -0
  82. package/dist/src/browser/target-resolver.d.ts +14 -0
  83. package/dist/src/browser/target-resolver.js +28 -0
  84. package/dist/src/browser/visual-refs.d.ts +11 -0
  85. package/dist/src/browser/visual-refs.js +108 -0
  86. package/dist/src/browser.test.js +18 -0
  87. package/dist/src/build-manifest.d.ts +23 -0
  88. package/dist/src/build-manifest.js +34 -0
  89. package/dist/src/build-manifest.test.js +108 -1
  90. package/dist/src/cli.js +560 -58
  91. package/dist/src/cli.test.js +689 -1
  92. package/dist/src/commanderAdapter.js +23 -4
  93. package/dist/src/help.d.ts +36 -0
  94. package/dist/src/help.js +301 -5
  95. package/dist/src/types.d.ts +82 -0
  96. package/package.json +1 -1
  97. package/scripts/typed-error-lint-baseline.json +18 -18
package/cli-manifest.json CHANGED
@@ -2443,7 +2443,7 @@
2443
2443
  "type": "str",
2444
2444
  "required": true,
2445
2445
  "positional": true,
2446
- "help": ""
2446
+ "help": "Bilibili 视频 BV ID(如 BV1xx411c7mD),或视频 URL / b23.tv 短链"
2447
2447
  },
2448
2448
  {
2449
2449
  "name": "lang",
@@ -6896,7 +6896,7 @@
6896
6896
  "name": "city",
6897
6897
  "type": "str",
6898
6898
  "required": false,
6899
- "help": "城市名(北京/上海/beijing/...)或 cityId 数字。不传则使用 cookie 默认城市"
6899
+ "help": "城市名(北京/上海/汕头/beijing/shantou/...)或 cityId 数字。未在静态表中的城市会通过 dianping.com 在线解析。不传则使用 cookie 默认城市"
6900
6900
  },
6901
6901
  {
6902
6902
  "name": "limit",
@@ -8491,7 +8491,7 @@
8491
8491
  "type": "str",
8492
8492
  "required": true,
8493
8493
  "positional": true,
8494
- "help": ""
8494
+ "help": "抖音作品 ID(aweme_id,可从作品 URL 末尾获取)"
8495
8495
  }
8496
8496
  ],
8497
8497
  "columns": [
@@ -8517,7 +8517,7 @@
8517
8517
  "type": "str",
8518
8518
  "required": true,
8519
8519
  "positional": true,
8520
- "help": ""
8520
+ "help": "抖音作品 ID(aweme_id,可从作品 URL 末尾获取)"
8521
8521
  },
8522
8522
  {
8523
8523
  "name": "reschedule",
@@ -13173,7 +13173,7 @@
13173
13173
  "type": "string",
13174
13174
  "required": true,
13175
13175
  "positional": true,
13176
- "help": ""
13176
+ "help": "即刻搜索关键词"
13177
13177
  },
13178
13178
  {
13179
13179
  "name": "limit",
@@ -19350,7 +19350,7 @@
19350
19350
  "type": "string",
19351
19351
  "required": true,
19352
19352
  "positional": true,
19353
- "help": ""
19353
+ "help": "Reddit search query"
19354
19354
  },
19355
19355
  {
19356
19356
  "name": "subreddit",
@@ -19408,7 +19408,7 @@
19408
19408
  "type": "string",
19409
19409
  "required": true,
19410
19410
  "positional": true,
19411
- "help": ""
19411
+ "help": "Subreddit name (no `r/` prefix; e.g. `python`)"
19412
19412
  },
19413
19413
  {
19414
19414
  "name": "sort",
@@ -19553,7 +19553,7 @@
19553
19553
  "type": "string",
19554
19554
  "required": true,
19555
19555
  "positional": true,
19556
- "help": ""
19556
+ "help": "Reddit username (no `u/` prefix needed)"
19557
19557
  }
19558
19558
  ],
19559
19559
  "columns": [
@@ -19579,7 +19579,7 @@
19579
19579
  "type": "string",
19580
19580
  "required": true,
19581
19581
  "positional": true,
19582
- "help": ""
19582
+ "help": "Reddit username (no `u/` prefix needed)"
19583
19583
  },
19584
19584
  {
19585
19585
  "name": "limit",
@@ -19614,7 +19614,7 @@
19614
19614
  "type": "string",
19615
19615
  "required": true,
19616
19616
  "positional": true,
19617
- "help": ""
19617
+ "help": "Reddit username (no `u/` prefix needed)"
19618
19618
  },
19619
19619
  {
19620
19620
  "name": "limit",
@@ -22229,10 +22229,76 @@
22229
22229
  "sourceFile": "twitter/bookmark.js",
22230
22230
  "navigateBefore": true
22231
22231
  },
22232
+ {
22233
+ "site": "twitter",
22234
+ "name": "bookmark-folder",
22235
+ "description": "Read the tweets inside a single Twitter/X bookmark folder. Get the folder id from `opencli twitter bookmark-folders`.",
22236
+ "access": "read",
22237
+ "domain": "x.com",
22238
+ "strategy": "cookie",
22239
+ "browser": true,
22240
+ "args": [
22241
+ {
22242
+ "name": "folder-id",
22243
+ "type": "string",
22244
+ "required": true,
22245
+ "positional": true,
22246
+ "help": "Folder id from `opencli twitter bookmark-folders`."
22247
+ },
22248
+ {
22249
+ "name": "limit",
22250
+ "type": "int",
22251
+ "default": 20,
22252
+ "required": false,
22253
+ "help": "Maximum number of bookmarks to return (default 20)."
22254
+ },
22255
+ {
22256
+ "name": "top-by-engagement",
22257
+ "type": "int",
22258
+ "default": 0,
22259
+ "required": false,
22260
+ "help": "When set to N>0, re-rank the folder by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (saved-time) ordering."
22261
+ }
22262
+ ],
22263
+ "columns": [
22264
+ "id",
22265
+ "author",
22266
+ "text",
22267
+ "likes",
22268
+ "retweets",
22269
+ "bookmarks",
22270
+ "created_at",
22271
+ "url"
22272
+ ],
22273
+ "type": "js",
22274
+ "modulePath": "twitter/bookmark-folder.js",
22275
+ "sourceFile": "twitter/bookmark-folder.js",
22276
+ "navigateBefore": "https://x.com"
22277
+ },
22278
+ {
22279
+ "site": "twitter",
22280
+ "name": "bookmark-folders",
22281
+ "description": "List your Twitter/X bookmark folders (the user-created collections under Bookmarks). Returns folder id, name, item count, and created_at.",
22282
+ "access": "read",
22283
+ "domain": "x.com",
22284
+ "strategy": "cookie",
22285
+ "browser": true,
22286
+ "args": [],
22287
+ "columns": [
22288
+ "id",
22289
+ "name",
22290
+ "items",
22291
+ "created_at"
22292
+ ],
22293
+ "type": "js",
22294
+ "modulePath": "twitter/bookmark-folders.js",
22295
+ "sourceFile": "twitter/bookmark-folders.js",
22296
+ "navigateBefore": "https://x.com"
22297
+ },
22232
22298
  {
22233
22299
  "site": "twitter",
22234
22300
  "name": "bookmarks",
22235
- "description": "Fetch Twitter/X bookmarks",
22301
+ "description": "Fetch your Twitter/X bookmarks (the logged-in user's saved tweets, newest first)",
22236
22302
  "access": "read",
22237
22303
  "domain": "x.com",
22238
22304
  "strategy": "cookie",
@@ -22243,7 +22309,14 @@
22243
22309
  "type": "int",
22244
22310
  "default": 20,
22245
22311
  "required": false,
22246
- "help": ""
22312
+ "help": "Maximum number of bookmarks to return (default 20)."
22313
+ },
22314
+ {
22315
+ "name": "top-by-engagement",
22316
+ "type": "int",
22317
+ "default": 0,
22318
+ "required": false,
22319
+ "help": "When set to N>0, re-rank the bookmarks by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (saved-time) ordering."
22247
22320
  }
22248
22321
  ],
22249
22322
  "columns": [
@@ -22290,7 +22363,7 @@
22290
22363
  {
22291
22364
  "site": "twitter",
22292
22365
  "name": "download",
22293
- "description": "下载 Twitter/X 媒体(图片和视频)",
22366
+ "description": "Download Twitter/X media (images and videos). Provide either <username> to scan a profile's media tab, or --tweet-url to download a single tweet.",
22294
22367
  "access": "read",
22295
22368
  "domain": "x.com",
22296
22369
  "strategy": "cookie",
@@ -22301,27 +22374,27 @@
22301
22374
  "type": "str",
22302
22375
  "required": false,
22303
22376
  "positional": true,
22304
- "help": "Twitter username (downloads from media tab)"
22377
+ "help": "Twitter username (with or without @) to scan their /media tab. Either <username> or --tweet-url is required."
22305
22378
  },
22306
22379
  {
22307
22380
  "name": "tweet-url",
22308
22381
  "type": "str",
22309
22382
  "required": false,
22310
- "help": "Single tweet URL to download"
22383
+ "help": "Single tweet URL to download. Use this OR <username>, not both required at once."
22311
22384
  },
22312
22385
  {
22313
22386
  "name": "limit",
22314
22387
  "type": "int",
22315
22388
  "default": 10,
22316
22389
  "required": false,
22317
- "help": "Number of tweets to scan"
22390
+ "help": "Maximum number of media items to download when scanning a profile (default 10). Ignored when --tweet-url is used."
22318
22391
  },
22319
22392
  {
22320
22393
  "name": "output",
22321
22394
  "type": "str",
22322
22395
  "default": "./twitter-downloads",
22323
22396
  "required": false,
22324
- "help": "Output directory"
22397
+ "help": "Output directory (default ./twitter-downloads). A per-source subdir is created inside."
22325
22398
  }
22326
22399
  ],
22327
22400
  "columns": [
@@ -22364,7 +22437,7 @@
22364
22437
  {
22365
22438
  "site": "twitter",
22366
22439
  "name": "followers",
22367
- "description": "Get accounts following a Twitter/X user",
22440
+ "description": "Get accounts following a Twitter/X user (defaults to the logged-in user when no user is given)",
22368
22441
  "access": "read",
22369
22442
  "domain": "x.com",
22370
22443
  "strategy": "ui",
@@ -22375,14 +22448,14 @@
22375
22448
  "type": "string",
22376
22449
  "required": false,
22377
22450
  "positional": true,
22378
- "help": ""
22451
+ "help": "Twitter/X handle (with or without @). Omit to fetch followers of the currently logged-in account."
22379
22452
  },
22380
22453
  {
22381
22454
  "name": "limit",
22382
22455
  "type": "int",
22383
22456
  "default": 50,
22384
22457
  "required": false,
22385
- "help": ""
22458
+ "help": "Maximum number of follower rows to return (default 50). Must be a positive integer."
22386
22459
  }
22387
22460
  ],
22388
22461
  "columns": [
@@ -22398,7 +22471,7 @@
22398
22471
  {
22399
22472
  "site": "twitter",
22400
22473
  "name": "following",
22401
- "description": "Get accounts a Twitter/X user is following",
22474
+ "description": "Get accounts a Twitter/X user is following (defaults to the logged-in user when no user is given)",
22402
22475
  "access": "read",
22403
22476
  "domain": "x.com",
22404
22477
  "strategy": "cookie",
@@ -22409,14 +22482,14 @@
22409
22482
  "type": "string",
22410
22483
  "required": false,
22411
22484
  "positional": true,
22412
- "help": ""
22485
+ "help": "Twitter/X handle (with or without @). Omit to fetch the accounts the currently logged-in user follows."
22413
22486
  },
22414
22487
  {
22415
22488
  "name": "limit",
22416
22489
  "type": "int",
22417
22490
  "default": 50,
22418
22491
  "required": false,
22419
- "help": ""
22492
+ "help": "Maximum number of following rows to return (default 50). Must be a positive integer."
22420
22493
  }
22421
22494
  ],
22422
22495
  "columns": [
@@ -22485,7 +22558,7 @@
22485
22558
  {
22486
22559
  "site": "twitter",
22487
22560
  "name": "likes",
22488
- "description": "Fetch liked tweets of a Twitter user",
22561
+ "description": "Fetch liked tweets of a Twitter user (defaults to the logged-in user when no username is given)",
22489
22562
  "access": "read",
22490
22563
  "domain": "x.com",
22491
22564
  "strategy": "cookie",
@@ -22496,14 +22569,21 @@
22496
22569
  "type": "string",
22497
22570
  "required": false,
22498
22571
  "positional": true,
22499
- "help": "Twitter screen name (without @). Defaults to logged-in user."
22572
+ "help": "Twitter screen name (with or without @). Defaults to the logged-in user when omitted."
22500
22573
  },
22501
22574
  {
22502
22575
  "name": "limit",
22503
22576
  "type": "int",
22504
22577
  "default": 20,
22505
22578
  "required": false,
22506
- "help": ""
22579
+ "help": "Maximum number of liked tweets to return (default 20)."
22580
+ },
22581
+ {
22582
+ "name": "top-by-engagement",
22583
+ "type": "int",
22584
+ "default": 0,
22585
+ "required": false,
22586
+ "help": "When set to N>0, re-rank the liked tweets by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (recency) ordering."
22507
22587
  }
22508
22588
  ],
22509
22589
  "columns": [
@@ -22537,14 +22617,14 @@
22537
22617
  "type": "string",
22538
22618
  "required": true,
22539
22619
  "positional": true,
22540
- "help": ""
22620
+ "help": "Numeric ID of the list you own (e.g. from `opencli twitter lists`)"
22541
22621
  },
22542
22622
  {
22543
22623
  "name": "username",
22544
22624
  "type": "string",
22545
22625
  "required": true,
22546
22626
  "positional": true,
22547
- "help": ""
22627
+ "help": "Twitter/X handle to add (with or without @)"
22548
22628
  }
22549
22629
  ],
22550
22630
  "columns": [
@@ -22573,14 +22653,14 @@
22573
22653
  "type": "string",
22574
22654
  "required": true,
22575
22655
  "positional": true,
22576
- "help": ""
22656
+ "help": "Numeric ID of the list you own (e.g. from `opencli twitter lists`)"
22577
22657
  },
22578
22658
  {
22579
22659
  "name": "username",
22580
22660
  "type": "string",
22581
22661
  "required": true,
22582
22662
  "positional": true,
22583
- "help": ""
22663
+ "help": "Twitter/X handle to remove (with or without @)"
22584
22664
  }
22585
22665
  ],
22586
22666
  "columns": [
@@ -22609,7 +22689,7 @@
22609
22689
  "type": "string",
22610
22690
  "required": true,
22611
22691
  "positional": true,
22612
- "help": ""
22692
+ "help": "Numeric ID of a Twitter/X list (e.g. from `opencli twitter lists`)"
22613
22693
  },
22614
22694
  {
22615
22695
  "name": "limit",
@@ -22617,6 +22697,13 @@
22617
22697
  "default": 50,
22618
22698
  "required": false,
22619
22699
  "help": ""
22700
+ },
22701
+ {
22702
+ "name": "top-by-engagement",
22703
+ "type": "int",
22704
+ "default": 0,
22705
+ "required": false,
22706
+ "help": "When set to N>0, re-rank the list timeline by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the list's native (recency) ordering."
22620
22707
  }
22621
22708
  ],
22622
22709
  "columns": [
@@ -22648,7 +22735,7 @@
22648
22735
  "type": "int",
22649
22736
  "default": 50,
22650
22737
  "required": false,
22651
- "help": ""
22738
+ "help": "Maximum number of lists to return (default 50)."
22652
22739
  }
22653
22740
  ],
22654
22741
  "columns": [
@@ -22666,7 +22753,7 @@
22666
22753
  {
22667
22754
  "site": "twitter",
22668
22755
  "name": "notifications",
22669
- "description": "Get Twitter/X notifications",
22756
+ "description": "Get your Twitter/X notifications (the logged-in user's likes/replies/follows feed, newest first)",
22670
22757
  "access": "read",
22671
22758
  "domain": "x.com",
22672
22759
  "strategy": "intercept",
@@ -22677,7 +22764,7 @@
22677
22764
  "type": "int",
22678
22765
  "default": 20,
22679
22766
  "required": false,
22680
- "help": ""
22767
+ "help": "Maximum number of notifications to return (default 20)."
22681
22768
  }
22682
22769
  ],
22683
22770
  "columns": [
@@ -22728,7 +22815,7 @@
22728
22815
  {
22729
22816
  "site": "twitter",
22730
22817
  "name": "profile",
22731
- "description": "Fetch a Twitter user profile (bio, stats, etc.)",
22818
+ "description": "Fetch a Twitter user profile bio, stats, etc. (defaults to the logged-in user when no username is given)",
22732
22819
  "access": "read",
22733
22820
  "domain": "x.com",
22734
22821
  "strategy": "cookie",
@@ -22739,7 +22826,7 @@
22739
22826
  "type": "string",
22740
22827
  "required": false,
22741
22828
  "positional": true,
22742
- "help": "Twitter screen name (without @). Defaults to logged-in user."
22829
+ "help": "Twitter screen name (with or without @). Defaults to the logged-in user when omitted."
22743
22830
  }
22744
22831
  ],
22745
22832
  "columns": [
@@ -22760,6 +22847,52 @@
22760
22847
  "sourceFile": "twitter/profile.js",
22761
22848
  "navigateBefore": "https://x.com"
22762
22849
  },
22850
+ {
22851
+ "site": "twitter",
22852
+ "name": "quote",
22853
+ "description": "Quote-tweet a specific tweet with your own text, optionally with a local or remote image",
22854
+ "access": "write",
22855
+ "domain": "x.com",
22856
+ "strategy": "ui",
22857
+ "browser": true,
22858
+ "args": [
22859
+ {
22860
+ "name": "url",
22861
+ "type": "string",
22862
+ "required": true,
22863
+ "positional": true,
22864
+ "help": "The URL of the tweet to quote"
22865
+ },
22866
+ {
22867
+ "name": "text",
22868
+ "type": "string",
22869
+ "required": true,
22870
+ "positional": true,
22871
+ "help": "The text content of your quote"
22872
+ },
22873
+ {
22874
+ "name": "image",
22875
+ "type": "str",
22876
+ "required": false,
22877
+ "help": "Optional local image path to attach to the quote tweet"
22878
+ },
22879
+ {
22880
+ "name": "image-url",
22881
+ "type": "str",
22882
+ "required": false,
22883
+ "help": "Optional remote image URL to download and attach to the quote tweet"
22884
+ }
22885
+ ],
22886
+ "columns": [
22887
+ "status",
22888
+ "message",
22889
+ "text"
22890
+ ],
22891
+ "type": "js",
22892
+ "modulePath": "twitter/quote.js",
22893
+ "sourceFile": "twitter/quote.js",
22894
+ "navigateBefore": true
22895
+ },
22763
22896
  {
22764
22897
  "site": "twitter",
22765
22898
  "name": "reply",
@@ -22855,10 +22988,36 @@
22855
22988
  "sourceFile": "twitter/reply-dm.js",
22856
22989
  "navigateBefore": true
22857
22990
  },
22991
+ {
22992
+ "site": "twitter",
22993
+ "name": "retweet",
22994
+ "description": "Retweet a specific tweet",
22995
+ "access": "write",
22996
+ "domain": "x.com",
22997
+ "strategy": "ui",
22998
+ "browser": true,
22999
+ "args": [
23000
+ {
23001
+ "name": "url",
23002
+ "type": "string",
23003
+ "required": true,
23004
+ "positional": true,
23005
+ "help": "The URL of the tweet to retweet"
23006
+ }
23007
+ ],
23008
+ "columns": [
23009
+ "status",
23010
+ "message"
23011
+ ],
23012
+ "type": "js",
23013
+ "modulePath": "twitter/retweet.js",
23014
+ "sourceFile": "twitter/retweet.js",
23015
+ "navigateBefore": true
23016
+ },
22858
23017
  {
22859
23018
  "site": "twitter",
22860
23019
  "name": "search",
22861
- "description": "Search Twitter/X for tweets",
23020
+ "description": "Search Twitter/X for tweets, with optional --from / --has / --exclude / --product filters mapped to X's search operators",
22862
23021
  "access": "read",
22863
23022
  "domain": "x.com",
22864
23023
  "strategy": "intercept",
@@ -22869,25 +23028,75 @@
22869
23028
  "type": "string",
22870
23029
  "required": true,
22871
23030
  "positional": true,
22872
- "help": ""
23031
+ "help": "Search query. Raw X operators (e.g. \"exact phrase\", #tag, OR, lang:en, since:YYYY-MM-DD, from:, since:) are passed through unchanged."
22873
23032
  },
22874
23033
  {
22875
23034
  "name": "filter",
22876
23035
  "type": "string",
22877
23036
  "default": "top",
22878
23037
  "required": false,
22879
- "help": "",
23038
+ "help": "Legacy alias for --product. Kept for backwards compatibility; if --product is set it wins.",
22880
23039
  "choices": [
22881
23040
  "top",
22882
23041
  "live"
22883
23042
  ]
22884
23043
  },
23044
+ {
23045
+ "name": "product",
23046
+ "type": "string",
23047
+ "required": false,
23048
+ "help": "Which X search tab to read: top (default), live (Latest), photos, videos. Maps to the f= URL param.",
23049
+ "choices": [
23050
+ "top",
23051
+ "live",
23052
+ "photos",
23053
+ "videos"
23054
+ ]
23055
+ },
23056
+ {
23057
+ "name": "from",
23058
+ "type": "string",
23059
+ "required": false,
23060
+ "help": "Restrict to tweets authored by <user>. Leading @ is stripped. Equivalent to appending `from:<user>` to the query."
23061
+ },
23062
+ {
23063
+ "name": "has",
23064
+ "type": "string",
23065
+ "required": false,
23066
+ "help": "Restrict to tweets that have media|images|videos|links|replies. Maps to X's `filter:<has>` operator.",
23067
+ "choices": [
23068
+ "media",
23069
+ "images",
23070
+ "videos",
23071
+ "links",
23072
+ "replies"
23073
+ ]
23074
+ },
23075
+ {
23076
+ "name": "exclude",
23077
+ "type": "string",
23078
+ "required": false,
23079
+ "help": "Exclude tweets matching <type>: replies|retweets|media|links. Maps to X's `-filter:<x>` operator (retweets → -filter:nativeretweets).",
23080
+ "choices": [
23081
+ "replies",
23082
+ "retweets",
23083
+ "media",
23084
+ "links"
23085
+ ]
23086
+ },
22885
23087
  {
22886
23088
  "name": "limit",
22887
23089
  "type": "int",
22888
23090
  "default": 15,
22889
23091
  "required": false,
22890
- "help": ""
23092
+ "help": "Maximum number of tweets to return (default 15). Result count after server-side filtering."
23093
+ },
23094
+ {
23095
+ "name": "top-by-engagement",
23096
+ "type": "int",
23097
+ "default": 0,
23098
+ "required": false,
23099
+ "help": "When set to N>0, re-rank the results by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps X's native ordering."
22891
23100
  }
22892
23101
  ],
22893
23102
  "columns": [
@@ -22920,7 +23129,7 @@
22920
23129
  "type": "string",
22921
23130
  "required": true,
22922
23131
  "positional": true,
22923
- "help": ""
23132
+ "help": "Tweet numeric ID (e.g. 1234567890) or full status URL"
22924
23133
  },
22925
23134
  {
22926
23135
  "name": "limit",
@@ -22928,6 +23137,13 @@
22928
23137
  "default": 50,
22929
23138
  "required": false,
22930
23139
  "help": ""
23140
+ },
23141
+ {
23142
+ "name": "top-by-engagement",
23143
+ "type": "int",
23144
+ "default": 0,
23145
+ "required": false,
23146
+ "help": "When set to N>0, re-rank the thread by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the conversation's structural ordering."
22931
23147
  }
22932
23148
  ],
22933
23149
  "columns": [
@@ -22948,7 +23164,7 @@
22948
23164
  {
22949
23165
  "site": "twitter",
22950
23166
  "name": "timeline",
22951
- "description": "Fetch Twitter timeline (for-you or following)",
23167
+ "description": "Fetch the logged-in user's home timeline (for-you algorithmic feed by default; pass --type following for the chronological feed of accounts you follow)",
22952
23168
  "access": "read",
22953
23169
  "domain": "x.com",
22954
23170
  "strategy": "cookie",
@@ -22959,7 +23175,7 @@
22959
23175
  "type": "str",
22960
23176
  "default": "for-you",
22961
23177
  "required": false,
22962
- "help": "Timeline type: for-you (algorithmic) or following (chronological)",
23178
+ "help": "Which home-timeline feed to read. Default for-you (algorithmic). Use following for the chronological feed of accounts you follow.",
22963
23179
  "choices": [
22964
23180
  "for-you",
22965
23181
  "following"
@@ -22970,7 +23186,14 @@
22970
23186
  "type": "int",
22971
23187
  "default": 20,
22972
23188
  "required": false,
22973
- "help": ""
23189
+ "help": "Maximum number of tweets to return (default 20)."
23190
+ },
23191
+ {
23192
+ "name": "top-by-engagement",
23193
+ "type": "int",
23194
+ "default": 0,
23195
+ "required": false,
23196
+ "help": "When set to N>0, re-rank the timeline by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps X's native ordering."
22974
23197
  }
22975
23198
  ],
22976
23199
  "columns": [
@@ -23040,6 +23263,13 @@
23040
23263
  "default": 20,
23041
23264
  "required": false,
23042
23265
  "help": "Max tweets to return"
23266
+ },
23267
+ {
23268
+ "name": "top-by-engagement",
23269
+ "type": "int",
23270
+ "default": 0,
23271
+ "required": false,
23272
+ "help": "When set to N>0, re-rank the tweets by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the chronological ordering."
23043
23273
  }
23044
23274
  ],
23045
23275
  "columns": [
@@ -23139,6 +23369,58 @@
23139
23369
  "sourceFile": "twitter/unfollow.js",
23140
23370
  "navigateBefore": true
23141
23371
  },
23372
+ {
23373
+ "site": "twitter",
23374
+ "name": "unlike",
23375
+ "description": "Remove a like from a specific tweet",
23376
+ "access": "write",
23377
+ "domain": "x.com",
23378
+ "strategy": "ui",
23379
+ "browser": true,
23380
+ "args": [
23381
+ {
23382
+ "name": "url",
23383
+ "type": "string",
23384
+ "required": true,
23385
+ "positional": true,
23386
+ "help": "The URL of the tweet to unlike"
23387
+ }
23388
+ ],
23389
+ "columns": [
23390
+ "status",
23391
+ "message"
23392
+ ],
23393
+ "type": "js",
23394
+ "modulePath": "twitter/unlike.js",
23395
+ "sourceFile": "twitter/unlike.js",
23396
+ "navigateBefore": true
23397
+ },
23398
+ {
23399
+ "site": "twitter",
23400
+ "name": "unretweet",
23401
+ "description": "Undo a retweet on a specific tweet",
23402
+ "access": "write",
23403
+ "domain": "x.com",
23404
+ "strategy": "ui",
23405
+ "browser": true,
23406
+ "args": [
23407
+ {
23408
+ "name": "url",
23409
+ "type": "string",
23410
+ "required": true,
23411
+ "positional": true,
23412
+ "help": "The URL of the tweet to unretweet"
23413
+ }
23414
+ ],
23415
+ "columns": [
23416
+ "status",
23417
+ "message"
23418
+ ],
23419
+ "type": "js",
23420
+ "modulePath": "twitter/unretweet.js",
23421
+ "sourceFile": "twitter/unretweet.js",
23422
+ "navigateBefore": true
23423
+ },
23142
23424
  {
23143
23425
  "site": "uisdc",
23144
23426
  "name": "news",