@jackwener/opencli 0.9.6 → 0.9.8

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 (221) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  4. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +57 -0
  5. package/.github/dependabot.yml +27 -0
  6. package/.github/pull_request_template.md +24 -0
  7. package/.github/workflows/ci.yml +14 -8
  8. package/.github/workflows/e2e-headed.yml +6 -2
  9. package/.github/workflows/pkg-pr-new.yml +2 -2
  10. package/.github/workflows/release-please.yml +25 -0
  11. package/.github/workflows/release.yml +2 -2
  12. package/.github/workflows/security.yml +36 -0
  13. package/CLI-ELECTRON.md +89 -36
  14. package/CONTRIBUTING.md +167 -0
  15. package/README.md +98 -32
  16. package/README.zh-CN.md +99 -33
  17. package/dist/browser/discover.js +22 -7
  18. package/dist/browser.test.js +23 -0
  19. package/dist/build-manifest.d.ts +26 -0
  20. package/dist/build-manifest.js +132 -60
  21. package/dist/build-manifest.test.d.ts +1 -0
  22. package/dist/build-manifest.test.js +26 -0
  23. package/dist/cli-manifest.json +1415 -29
  24. package/dist/clis/bilibili/download.d.ts +10 -0
  25. package/dist/clis/bilibili/download.js +135 -0
  26. package/dist/clis/chatwise/ask.d.ts +1 -0
  27. package/dist/clis/chatwise/ask.js +76 -0
  28. package/dist/clis/chatwise/export.d.ts +1 -0
  29. package/dist/clis/chatwise/export.js +46 -0
  30. package/dist/clis/chatwise/history.d.ts +1 -0
  31. package/dist/clis/chatwise/history.js +43 -0
  32. package/dist/clis/chatwise/model.d.ts +1 -0
  33. package/dist/clis/chatwise/model.js +81 -0
  34. package/dist/clis/chatwise/new.d.ts +1 -0
  35. package/dist/clis/chatwise/new.js +18 -0
  36. package/dist/clis/chatwise/read.d.ts +1 -0
  37. package/dist/clis/chatwise/read.js +39 -0
  38. package/dist/clis/chatwise/screenshot.d.ts +1 -0
  39. package/dist/clis/chatwise/screenshot.js +27 -0
  40. package/dist/clis/chatwise/send.d.ts +1 -0
  41. package/dist/clis/chatwise/send.js +45 -0
  42. package/dist/clis/chatwise/status.d.ts +1 -0
  43. package/dist/clis/chatwise/status.js +22 -0
  44. package/dist/clis/discord-app/channels.d.ts +1 -0
  45. package/dist/clis/discord-app/channels.js +45 -0
  46. package/dist/clis/discord-app/members.d.ts +1 -0
  47. package/dist/clis/discord-app/members.js +38 -0
  48. package/dist/clis/discord-app/read.d.ts +1 -0
  49. package/dist/clis/discord-app/read.js +45 -0
  50. package/dist/clis/discord-app/search.d.ts +1 -0
  51. package/dist/clis/discord-app/search.js +56 -0
  52. package/dist/clis/discord-app/send.d.ts +1 -0
  53. package/dist/clis/discord-app/send.js +27 -0
  54. package/dist/clis/discord-app/servers.d.ts +1 -0
  55. package/dist/clis/discord-app/servers.js +36 -0
  56. package/dist/clis/discord-app/status.d.ts +1 -0
  57. package/dist/clis/discord-app/status.js +16 -0
  58. package/dist/clis/feishu/new.d.ts +1 -0
  59. package/dist/clis/feishu/new.js +27 -0
  60. package/dist/clis/feishu/read.d.ts +1 -0
  61. package/dist/clis/feishu/read.js +40 -0
  62. package/dist/clis/feishu/search.d.ts +1 -0
  63. package/dist/clis/feishu/search.js +30 -0
  64. package/dist/clis/feishu/send.d.ts +1 -0
  65. package/dist/clis/feishu/send.js +39 -0
  66. package/dist/clis/feishu/status.d.ts +1 -0
  67. package/dist/clis/feishu/status.js +28 -0
  68. package/dist/clis/grok/ask.d.ts +1 -0
  69. package/dist/clis/grok/ask.js +82 -0
  70. package/dist/clis/grok/debug.d.ts +1 -0
  71. package/dist/clis/grok/debug.js +45 -0
  72. package/dist/clis/jimeng/generate.yaml +84 -0
  73. package/dist/clis/jimeng/history.yaml +47 -0
  74. package/dist/clis/linux-do/categories.yaml +41 -0
  75. package/dist/clis/linux-do/category.yaml +49 -0
  76. package/dist/clis/linux-do/hot.yaml +50 -0
  77. package/dist/clis/linux-do/latest.yaml +40 -0
  78. package/dist/clis/linux-do/search.yaml +45 -0
  79. package/dist/clis/linux-do/topic.yaml +38 -0
  80. package/dist/clis/notion/export.d.ts +1 -0
  81. package/dist/clis/notion/export.js +31 -0
  82. package/dist/clis/notion/favorites.d.ts +1 -0
  83. package/dist/clis/notion/favorites.js +84 -0
  84. package/dist/clis/notion/new.d.ts +1 -0
  85. package/dist/clis/notion/new.js +34 -0
  86. package/dist/clis/notion/read.d.ts +1 -0
  87. package/dist/clis/notion/read.js +30 -0
  88. package/dist/clis/notion/search.d.ts +1 -0
  89. package/dist/clis/notion/search.js +46 -0
  90. package/dist/clis/notion/sidebar.d.ts +1 -0
  91. package/dist/clis/notion/sidebar.js +41 -0
  92. package/dist/clis/notion/status.d.ts +1 -0
  93. package/dist/clis/notion/status.js +16 -0
  94. package/dist/clis/notion/write.d.ts +1 -0
  95. package/dist/clis/notion/write.js +40 -0
  96. package/dist/clis/twitter/download.d.ts +8 -0
  97. package/dist/clis/twitter/download.js +204 -0
  98. package/dist/clis/wechat/chats.d.ts +1 -0
  99. package/dist/clis/wechat/chats.js +28 -0
  100. package/dist/clis/wechat/contacts.d.ts +1 -0
  101. package/dist/clis/wechat/contacts.js +28 -0
  102. package/dist/clis/wechat/read.d.ts +1 -0
  103. package/dist/clis/wechat/read.js +58 -0
  104. package/dist/clis/wechat/search.d.ts +1 -0
  105. package/dist/clis/wechat/search.js +31 -0
  106. package/dist/clis/wechat/send.d.ts +1 -0
  107. package/dist/clis/wechat/send.js +42 -0
  108. package/dist/clis/wechat/status.d.ts +1 -0
  109. package/dist/clis/wechat/status.js +29 -0
  110. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +10 -0
  111. package/dist/clis/xiaohongshu/creator-note-detail.js +88 -0
  112. package/dist/clis/xiaohongshu/creator-notes.d.ts +11 -0
  113. package/dist/clis/xiaohongshu/creator-notes.js +109 -0
  114. package/dist/clis/xiaohongshu/creator-profile.d.ts +10 -0
  115. package/dist/clis/xiaohongshu/creator-profile.js +54 -0
  116. package/dist/clis/xiaohongshu/creator-stats.d.ts +10 -0
  117. package/dist/clis/xiaohongshu/creator-stats.js +74 -0
  118. package/dist/clis/xiaohongshu/download.d.ts +7 -0
  119. package/dist/clis/xiaohongshu/download.js +155 -0
  120. package/dist/clis/xiaohongshu/search.js +1 -1
  121. package/dist/clis/xiaohongshu/user-helpers.d.ts +15 -0
  122. package/dist/clis/xiaohongshu/user-helpers.js +67 -0
  123. package/dist/clis/xiaohongshu/user-helpers.test.d.ts +1 -0
  124. package/dist/clis/xiaohongshu/user-helpers.test.js +81 -0
  125. package/dist/clis/xiaohongshu/user.js +46 -29
  126. package/dist/clis/zhihu/download.d.ts +11 -0
  127. package/dist/clis/zhihu/download.js +186 -0
  128. package/dist/clis/zhihu/download.test.d.ts +1 -0
  129. package/dist/clis/zhihu/download.test.js +10 -0
  130. package/dist/download/index.d.ts +79 -0
  131. package/dist/download/index.js +325 -0
  132. package/dist/download/progress.d.ts +36 -0
  133. package/dist/download/progress.js +111 -0
  134. package/dist/engine.test.js +15 -0
  135. package/dist/main.js +16 -3
  136. package/dist/pipeline/registry.js +2 -0
  137. package/dist/pipeline/steps/download.d.ts +34 -0
  138. package/dist/pipeline/steps/download.js +251 -0
  139. package/dist/pipeline/template.js +28 -0
  140. package/package.json +4 -3
  141. package/scripts/test-site.mjs +70 -0
  142. package/src/browser/discover.ts +23 -7
  143. package/src/browser.test.ts +23 -0
  144. package/src/build-manifest.test.ts +28 -0
  145. package/src/build-manifest.ts +147 -57
  146. package/src/clis/bilibili/download.ts +161 -0
  147. package/src/clis/chatwise/README.md +38 -0
  148. package/src/clis/chatwise/README.zh-CN.md +38 -0
  149. package/src/clis/chatwise/ask.ts +87 -0
  150. package/src/clis/chatwise/export.ts +51 -0
  151. package/src/clis/chatwise/history.ts +47 -0
  152. package/src/clis/chatwise/model.ts +87 -0
  153. package/src/clis/chatwise/new.ts +21 -0
  154. package/src/clis/chatwise/read.ts +42 -0
  155. package/src/clis/chatwise/screenshot.ts +33 -0
  156. package/src/clis/chatwise/send.ts +50 -0
  157. package/src/clis/chatwise/status.ts +25 -0
  158. package/src/clis/discord-app/README.md +28 -0
  159. package/src/clis/discord-app/README.zh-CN.md +28 -0
  160. package/src/clis/discord-app/channels.ts +48 -0
  161. package/src/clis/discord-app/members.ts +41 -0
  162. package/src/clis/discord-app/read.ts +49 -0
  163. package/src/clis/discord-app/search.ts +64 -0
  164. package/src/clis/discord-app/send.ts +32 -0
  165. package/src/clis/discord-app/servers.ts +39 -0
  166. package/src/clis/discord-app/status.ts +18 -0
  167. package/src/clis/feishu/README.md +20 -0
  168. package/src/clis/feishu/README.zh-CN.md +20 -0
  169. package/src/clis/feishu/new.ts +32 -0
  170. package/src/clis/feishu/read.ts +48 -0
  171. package/src/clis/feishu/search.ts +35 -0
  172. package/src/clis/feishu/send.ts +46 -0
  173. package/src/clis/feishu/status.ts +34 -0
  174. package/src/clis/grok/ask.ts +90 -0
  175. package/src/clis/grok/debug.ts +49 -0
  176. package/src/clis/jimeng/generate.yaml +84 -0
  177. package/src/clis/jimeng/history.yaml +47 -0
  178. package/src/clis/linux-do/categories.yaml +41 -0
  179. package/src/clis/linux-do/category.yaml +49 -0
  180. package/src/clis/linux-do/hot.yaml +50 -0
  181. package/src/clis/linux-do/latest.yaml +40 -0
  182. package/src/clis/linux-do/search.yaml +45 -0
  183. package/src/clis/linux-do/topic.yaml +38 -0
  184. package/src/clis/notion/README.md +29 -0
  185. package/src/clis/notion/README.zh-CN.md +29 -0
  186. package/src/clis/notion/export.ts +36 -0
  187. package/src/clis/notion/favorites.ts +87 -0
  188. package/src/clis/notion/new.ts +39 -0
  189. package/src/clis/notion/read.ts +33 -0
  190. package/src/clis/notion/search.ts +54 -0
  191. package/src/clis/notion/sidebar.ts +44 -0
  192. package/src/clis/notion/status.ts +18 -0
  193. package/src/clis/notion/write.ts +45 -0
  194. package/src/clis/twitter/download.ts +227 -0
  195. package/src/clis/wechat/README.md +28 -0
  196. package/src/clis/wechat/README.zh-CN.md +28 -0
  197. package/src/clis/wechat/chats.ts +33 -0
  198. package/src/clis/wechat/contacts.ts +33 -0
  199. package/src/clis/wechat/read.ts +72 -0
  200. package/src/clis/wechat/search.ts +36 -0
  201. package/src/clis/wechat/send.ts +49 -0
  202. package/src/clis/wechat/status.ts +35 -0
  203. package/src/clis/xiaohongshu/creator-note-detail.ts +95 -0
  204. package/src/clis/xiaohongshu/creator-notes.ts +116 -0
  205. package/src/clis/xiaohongshu/creator-profile.ts +60 -0
  206. package/src/clis/xiaohongshu/creator-stats.ts +81 -0
  207. package/src/clis/xiaohongshu/download.ts +173 -0
  208. package/src/clis/xiaohongshu/search.ts +1 -1
  209. package/src/clis/xiaohongshu/user-helpers.test.ts +106 -0
  210. package/src/clis/xiaohongshu/user-helpers.ts +85 -0
  211. package/src/clis/xiaohongshu/user.ts +52 -32
  212. package/src/clis/zhihu/download.test.ts +12 -0
  213. package/src/clis/zhihu/download.ts +223 -0
  214. package/src/download/index.ts +395 -0
  215. package/src/download/progress.ts +125 -0
  216. package/src/engine.test.ts +17 -0
  217. package/src/main.ts +12 -3
  218. package/src/pipeline/registry.ts +2 -0
  219. package/src/pipeline/steps/download.ts +310 -0
  220. package/src/pipeline/template.ts +26 -0
  221. package/tests/e2e/browser-auth.test.ts +25 -0
@@ -149,7 +149,12 @@
149
149
  "type": "str",
150
150
  "default": "all",
151
151
  "required": false,
152
- "help": "Filter: all, call, or put"
152
+ "help": "Filter: all, call, or put",
153
+ "choices": [
154
+ "all",
155
+ "call",
156
+ "put"
157
+ ]
153
158
  },
154
159
  {
155
160
  "name": "limit",
@@ -237,7 +242,11 @@
237
242
  "type": "str",
238
243
  "default": "Call",
239
244
  "required": false,
240
- "help": "Option type: Call or Put"
245
+ "help": "Option type: Call or Put",
246
+ "choices": [
247
+ "Call",
248
+ "Put"
249
+ ]
241
250
  },
242
251
  {
243
252
  "name": "limit",
@@ -325,6 +334,44 @@
325
334
  "url"
326
335
  ]
327
336
  },
337
+ {
338
+ "site": "bilibili",
339
+ "name": "download",
340
+ "description": "下载B站视频(需要 yt-dlp)",
341
+ "strategy": "cookie",
342
+ "browser": true,
343
+ "args": [
344
+ {
345
+ "name": "bvid",
346
+ "type": "str",
347
+ "required": true,
348
+ "help": "Video BV ID (e.g., BV1xxx)"
349
+ },
350
+ {
351
+ "name": "output",
352
+ "type": "str",
353
+ "default": "./bilibili-downloads",
354
+ "required": false,
355
+ "help": "Output directory"
356
+ },
357
+ {
358
+ "name": "quality",
359
+ "type": "str",
360
+ "default": "best",
361
+ "required": false,
362
+ "help": "Video quality (best, 1080p, 720p, 480p)"
363
+ }
364
+ ],
365
+ "type": "ts",
366
+ "modulePath": "bilibili/download.js",
367
+ "domain": "www.bilibili.com",
368
+ "columns": [
369
+ "bvid",
370
+ "title",
371
+ "status",
372
+ "size"
373
+ ]
374
+ },
328
375
  {
329
376
  "site": "bilibili",
330
377
  "name": "dynamic",
@@ -905,6 +952,190 @@
905
952
  "Status"
906
953
  ]
907
954
  },
955
+ {
956
+ "site": "chatwise",
957
+ "name": "ask",
958
+ "description": "Send a prompt and wait for the AI response (send + wait + read)",
959
+ "strategy": "ui",
960
+ "browser": true,
961
+ "args": [
962
+ {
963
+ "name": "text",
964
+ "type": "str",
965
+ "required": true,
966
+ "positional": true,
967
+ "help": "Prompt to send"
968
+ },
969
+ {
970
+ "name": "timeout",
971
+ "type": "str",
972
+ "default": "30)",
973
+ "required": false,
974
+ "help": "Max seconds to wait (default: 30)"
975
+ }
976
+ ],
977
+ "type": "ts",
978
+ "modulePath": "chatwise/ask.js",
979
+ "domain": "localhost",
980
+ "columns": [
981
+ "Role",
982
+ "Text"
983
+ ]
984
+ },
985
+ {
986
+ "site": "chatwise",
987
+ "name": "export",
988
+ "description": "Export the current ChatWise conversation to a Markdown file",
989
+ "strategy": "ui",
990
+ "browser": true,
991
+ "args": [
992
+ {
993
+ "name": "output",
994
+ "type": "str",
995
+ "default": "/tmp/chatwise-export.md)",
996
+ "required": false,
997
+ "positional": true,
998
+ "help": "Output file (default: /tmp/chatwise-export.md)"
999
+ }
1000
+ ],
1001
+ "type": "ts",
1002
+ "modulePath": "chatwise/export.js",
1003
+ "domain": "localhost",
1004
+ "columns": [
1005
+ "Status",
1006
+ "File",
1007
+ "Messages"
1008
+ ]
1009
+ },
1010
+ {
1011
+ "site": "chatwise",
1012
+ "name": "history",
1013
+ "description": "List conversation history in ChatWise sidebar",
1014
+ "strategy": "ui",
1015
+ "browser": true,
1016
+ "args": [],
1017
+ "type": "ts",
1018
+ "modulePath": "chatwise/history.js",
1019
+ "domain": "localhost",
1020
+ "columns": [
1021
+ "Index",
1022
+ "Title"
1023
+ ]
1024
+ },
1025
+ {
1026
+ "site": "chatwise",
1027
+ "name": "model",
1028
+ "description": "Get or switch the active AI model in ChatWise",
1029
+ "strategy": "ui",
1030
+ "browser": true,
1031
+ "args": [
1032
+ {
1033
+ "name": "model_name",
1034
+ "type": "str",
1035
+ "required": false,
1036
+ "positional": true,
1037
+ "help": "Model to switch to (e.g. gpt-4, claude-3)"
1038
+ }
1039
+ ],
1040
+ "type": "ts",
1041
+ "modulePath": "chatwise/model.js",
1042
+ "domain": "localhost",
1043
+ "columns": [
1044
+ "Status",
1045
+ "Model"
1046
+ ]
1047
+ },
1048
+ {
1049
+ "site": "chatwise",
1050
+ "name": "new",
1051
+ "description": "Start a new conversation in ChatWise",
1052
+ "strategy": "ui",
1053
+ "browser": true,
1054
+ "args": [],
1055
+ "type": "ts",
1056
+ "modulePath": "chatwise/new.js",
1057
+ "domain": "localhost",
1058
+ "columns": [
1059
+ "Status"
1060
+ ]
1061
+ },
1062
+ {
1063
+ "site": "chatwise",
1064
+ "name": "read",
1065
+ "description": "Read the current ChatWise conversation history",
1066
+ "strategy": "ui",
1067
+ "browser": true,
1068
+ "args": [],
1069
+ "type": "ts",
1070
+ "modulePath": "chatwise/read.js",
1071
+ "domain": "localhost",
1072
+ "columns": [
1073
+ "Content"
1074
+ ]
1075
+ },
1076
+ {
1077
+ "site": "chatwise",
1078
+ "name": "screenshot",
1079
+ "description": "Capture a snapshot of the current ChatWise window (DOM + Accessibility tree)",
1080
+ "strategy": "ui",
1081
+ "browser": true,
1082
+ "args": [
1083
+ {
1084
+ "name": "output",
1085
+ "type": "str",
1086
+ "default": "/tmp/chatwise-snapshot)",
1087
+ "required": false,
1088
+ "positional": true,
1089
+ "help": "Output file path (default: /tmp/chatwise-snapshot)"
1090
+ }
1091
+ ],
1092
+ "type": "ts",
1093
+ "modulePath": "chatwise/screenshot.js",
1094
+ "domain": "localhost",
1095
+ "columns": [
1096
+ "Status",
1097
+ "File"
1098
+ ]
1099
+ },
1100
+ {
1101
+ "site": "chatwise",
1102
+ "name": "send",
1103
+ "description": "Send a message to the active ChatWise conversation",
1104
+ "strategy": "ui",
1105
+ "browser": true,
1106
+ "args": [
1107
+ {
1108
+ "name": "text",
1109
+ "type": "str",
1110
+ "required": true,
1111
+ "positional": true,
1112
+ "help": "Message to send"
1113
+ }
1114
+ ],
1115
+ "type": "ts",
1116
+ "modulePath": "chatwise/send.js",
1117
+ "domain": "localhost",
1118
+ "columns": [
1119
+ "Status",
1120
+ "InjectedText"
1121
+ ]
1122
+ },
1123
+ {
1124
+ "site": "chatwise",
1125
+ "name": "status",
1126
+ "description": "Check active CDP connection to ChatWise Desktop",
1127
+ "strategy": "ui",
1128
+ "browser": true,
1129
+ "args": [],
1130
+ "type": "ts",
1131
+ "modulePath": "chatwise/status.js",
1132
+ "domain": "localhost",
1133
+ "columns": [
1134
+ "Status",
1135
+ "Url",
1136
+ "Title"
1137
+ ]
1138
+ },
908
1139
  {
909
1140
  "site": "codex",
910
1141
  "name": "ask",
@@ -1314,7 +1545,7 @@
1314
1545
  "default": "/tmp/${site",
1315
1546
  "required": false,
1316
1547
  "positional": true,
1317
- "help": ""
1548
+ "help": "Output file (default: /tmp/${site}-export.md)"
1318
1549
  }
1319
1550
  ],
1320
1551
  "type": "ts",
@@ -1420,7 +1651,7 @@
1420
1651
  "default": "/tmp/${site",
1421
1652
  "required": false,
1422
1653
  "positional": true,
1423
- "help": ""
1654
+ "help": "Output file path (default: /tmp/${site}-snapshot.txt)"
1424
1655
  }
1425
1656
  ],
1426
1657
  "type": "ts",
@@ -1471,34 +1702,303 @@
1471
1702
  ]
1472
1703
  },
1473
1704
  {
1474
- "site": "hackernews",
1475
- "name": "top",
1476
- "description": "Hacker News top stories",
1477
- "domain": "news.ycombinator.com",
1478
- "strategy": "public",
1479
- "browser": false,
1705
+ "site": "discord-app",
1706
+ "name": "channels",
1707
+ "description": "List channels in the current Discord server",
1708
+ "strategy": "ui",
1709
+ "browser": true,
1710
+ "args": [],
1711
+ "type": "ts",
1712
+ "modulePath": "discord-app/channels.js",
1713
+ "domain": "localhost",
1714
+ "columns": [
1715
+ "Index",
1716
+ "Channel",
1717
+ "Type"
1718
+ ]
1719
+ },
1720
+ {
1721
+ "site": "discord-app",
1722
+ "name": "members",
1723
+ "description": "List online members in the current Discord channel",
1724
+ "strategy": "ui",
1725
+ "browser": true,
1726
+ "args": [],
1727
+ "type": "ts",
1728
+ "modulePath": "discord-app/members.js",
1729
+ "domain": "localhost",
1730
+ "columns": [
1731
+ "Index",
1732
+ "Name",
1733
+ "Status"
1734
+ ]
1735
+ },
1736
+ {
1737
+ "site": "discord-app",
1738
+ "name": "read",
1739
+ "description": "Read recent messages from the active Discord channel",
1740
+ "strategy": "ui",
1741
+ "browser": true,
1480
1742
  "args": [
1481
1743
  {
1482
- "name": "limit",
1483
- "type": "int",
1484
- "default": 20,
1744
+ "name": "count",
1745
+ "type": "str",
1746
+ "default": "20)",
1485
1747
  "required": false,
1486
- "help": "Number of stories"
1748
+ "help": "Number of messages to read (default: 20)"
1487
1749
  }
1488
1750
  ],
1751
+ "type": "ts",
1752
+ "modulePath": "discord-app/read.js",
1753
+ "domain": "localhost",
1489
1754
  "columns": [
1490
- "rank",
1491
- "title",
1492
- "score",
1493
- "author",
1494
- "comments"
1755
+ "Author",
1756
+ "Time",
1757
+ "Message"
1758
+ ]
1759
+ },
1760
+ {
1761
+ "site": "discord-app",
1762
+ "name": "search",
1763
+ "description": "Search messages in the current Discord server/channel (Cmd+F)",
1764
+ "strategy": "ui",
1765
+ "browser": true,
1766
+ "args": [
1767
+ {
1768
+ "name": "query",
1769
+ "type": "str",
1770
+ "required": true,
1771
+ "positional": true,
1772
+ "help": "Search query"
1773
+ }
1495
1774
  ],
1496
- "pipeline": [
1775
+ "type": "ts",
1776
+ "modulePath": "discord-app/search.js",
1777
+ "domain": "localhost",
1778
+ "columns": [
1779
+ "Index",
1780
+ "Author",
1781
+ "Message"
1782
+ ]
1783
+ },
1784
+ {
1785
+ "site": "discord-app",
1786
+ "name": "send",
1787
+ "description": "Send a message in the active Discord channel",
1788
+ "strategy": "ui",
1789
+ "browser": true,
1790
+ "args": [
1497
1791
  {
1498
- "fetch": {
1499
- "url": "https://hacker-news.firebaseio.com/v0/topstories.json"
1500
- }
1501
- },
1792
+ "name": "text",
1793
+ "type": "str",
1794
+ "required": true,
1795
+ "positional": true,
1796
+ "help": "Message to send"
1797
+ }
1798
+ ],
1799
+ "type": "ts",
1800
+ "modulePath": "discord-app/send.js",
1801
+ "domain": "localhost",
1802
+ "columns": [
1803
+ "Status"
1804
+ ]
1805
+ },
1806
+ {
1807
+ "site": "discord-app",
1808
+ "name": "servers",
1809
+ "description": "List all Discord servers (guilds) in the sidebar",
1810
+ "strategy": "ui",
1811
+ "browser": true,
1812
+ "args": [],
1813
+ "type": "ts",
1814
+ "modulePath": "discord-app/servers.js",
1815
+ "domain": "localhost",
1816
+ "columns": [
1817
+ "Index",
1818
+ "Server"
1819
+ ]
1820
+ },
1821
+ {
1822
+ "site": "discord-app",
1823
+ "name": "status",
1824
+ "description": "Check active CDP connection to Discord Desktop",
1825
+ "strategy": "ui",
1826
+ "browser": true,
1827
+ "args": [],
1828
+ "type": "ts",
1829
+ "modulePath": "discord-app/status.js",
1830
+ "domain": "localhost",
1831
+ "columns": [
1832
+ "Status",
1833
+ "Url",
1834
+ "Title"
1835
+ ]
1836
+ },
1837
+ {
1838
+ "site": "feishu",
1839
+ "name": "new",
1840
+ "description": "Create a new message or document in Feishu",
1841
+ "strategy": "public",
1842
+ "browser": false,
1843
+ "args": [],
1844
+ "type": "ts",
1845
+ "modulePath": "feishu/new.js",
1846
+ "domain": "localhost",
1847
+ "columns": [
1848
+ "Status"
1849
+ ]
1850
+ },
1851
+ {
1852
+ "site": "feishu",
1853
+ "name": "read",
1854
+ "description": "Read the current chat content by selecting all and copying",
1855
+ "strategy": "public",
1856
+ "browser": false,
1857
+ "args": [],
1858
+ "type": "ts",
1859
+ "modulePath": "feishu/read.js",
1860
+ "domain": "localhost",
1861
+ "columns": [
1862
+ "Content"
1863
+ ]
1864
+ },
1865
+ {
1866
+ "site": "feishu",
1867
+ "name": "search",
1868
+ "description": "Open Feishu global search and type a query (Cmd+K)",
1869
+ "strategy": "public",
1870
+ "browser": false,
1871
+ "args": [
1872
+ {
1873
+ "name": "query",
1874
+ "type": "str",
1875
+ "required": true,
1876
+ "positional": true,
1877
+ "help": "Search query"
1878
+ }
1879
+ ],
1880
+ "type": "ts",
1881
+ "modulePath": "feishu/search.js",
1882
+ "domain": "localhost",
1883
+ "columns": [
1884
+ "Status"
1885
+ ]
1886
+ },
1887
+ {
1888
+ "site": "feishu",
1889
+ "name": "send",
1890
+ "description": "Send a message in the active Feishu (Lark) conversation",
1891
+ "strategy": "public",
1892
+ "browser": false,
1893
+ "args": [
1894
+ {
1895
+ "name": "text",
1896
+ "type": "str",
1897
+ "required": true,
1898
+ "positional": true,
1899
+ "help": "Message to send"
1900
+ }
1901
+ ],
1902
+ "type": "ts",
1903
+ "modulePath": "feishu/send.js",
1904
+ "domain": "localhost",
1905
+ "columns": [
1906
+ "Status"
1907
+ ]
1908
+ },
1909
+ {
1910
+ "site": "feishu",
1911
+ "name": "status",
1912
+ "description": "Check if Feishu (Lark) Desktop is running on macOS",
1913
+ "strategy": "public",
1914
+ "browser": false,
1915
+ "args": [],
1916
+ "type": "ts",
1917
+ "modulePath": "feishu/status.js",
1918
+ "domain": "localhost",
1919
+ "columns": [
1920
+ "Status",
1921
+ "Detail"
1922
+ ]
1923
+ },
1924
+ {
1925
+ "site": "grok",
1926
+ "name": "ask",
1927
+ "description": "Send a message to Grok and get response",
1928
+ "strategy": "cookie",
1929
+ "browser": true,
1930
+ "args": [
1931
+ {
1932
+ "name": "prompt",
1933
+ "type": "string",
1934
+ "required": true,
1935
+ "help": ""
1936
+ },
1937
+ {
1938
+ "name": "timeout",
1939
+ "type": "int",
1940
+ "default": 120,
1941
+ "required": false,
1942
+ "help": ""
1943
+ },
1944
+ {
1945
+ "name": "new",
1946
+ "type": "boolean",
1947
+ "default": false,
1948
+ "required": false,
1949
+ "help": ""
1950
+ }
1951
+ ],
1952
+ "type": "ts",
1953
+ "modulePath": "grok/ask.js",
1954
+ "domain": "grok.com",
1955
+ "columns": [
1956
+ "response"
1957
+ ]
1958
+ },
1959
+ {
1960
+ "site": "grok",
1961
+ "name": "debug",
1962
+ "description": "Debug grok page structure",
1963
+ "strategy": "cookie",
1964
+ "browser": true,
1965
+ "args": [],
1966
+ "type": "ts",
1967
+ "modulePath": "grok/debug.js",
1968
+ "domain": "grok.com",
1969
+ "columns": [
1970
+ "data"
1971
+ ]
1972
+ },
1973
+ {
1974
+ "site": "hackernews",
1975
+ "name": "top",
1976
+ "description": "Hacker News top stories",
1977
+ "domain": "news.ycombinator.com",
1978
+ "strategy": "public",
1979
+ "browser": false,
1980
+ "args": [
1981
+ {
1982
+ "name": "limit",
1983
+ "type": "int",
1984
+ "default": 20,
1985
+ "required": false,
1986
+ "help": "Number of stories"
1987
+ }
1988
+ ],
1989
+ "columns": [
1990
+ "rank",
1991
+ "title",
1992
+ "score",
1993
+ "author",
1994
+ "comments"
1995
+ ],
1996
+ "pipeline": [
1997
+ {
1998
+ "fetch": {
1999
+ "url": "https://hacker-news.firebaseio.com/v0/topstories.json"
2000
+ }
2001
+ },
1502
2002
  {
1503
2003
  "limit": 30
1504
2004
  },
@@ -1528,6 +2028,110 @@
1528
2028
  ],
1529
2029
  "type": "yaml"
1530
2030
  },
2031
+ {
2032
+ "site": "jimeng",
2033
+ "name": "generate",
2034
+ "description": "即梦AI 文生图 — 输入 prompt 生成图片",
2035
+ "domain": "jimeng.jianying.com",
2036
+ "strategy": "cookie",
2037
+ "browser": true,
2038
+ "args": [
2039
+ {
2040
+ "name": "prompt",
2041
+ "type": "string",
2042
+ "required": true,
2043
+ "help": "图片描述 prompt"
2044
+ },
2045
+ {
2046
+ "name": "model",
2047
+ "type": "string",
2048
+ "default": "high_aes_general_v50",
2049
+ "required": false,
2050
+ "help": "模型: high_aes_general_v50 (5.0 Lite), high_aes_general_v42 (4.6), high_aes_general_v40 (4.0)"
2051
+ },
2052
+ {
2053
+ "name": "wait",
2054
+ "type": "int",
2055
+ "default": 40,
2056
+ "required": false,
2057
+ "help": "等待生成完成的秒数"
2058
+ }
2059
+ ],
2060
+ "columns": [
2061
+ "status",
2062
+ "prompt",
2063
+ "image_count",
2064
+ "image_urls"
2065
+ ],
2066
+ "pipeline": [
2067
+ {
2068
+ "navigate": "https://jimeng.jianying.com/ai-tool/generate?type=image&workspace=0"
2069
+ },
2070
+ {
2071
+ "wait": 3
2072
+ },
2073
+ {
2074
+ "evaluate": "(async () => {\n const prompt = ${{ args.prompt | json }};\n const waitSec = ${{ args.wait }};\n \n // Step 1: Count existing images before generation\n const beforeImgs = document.querySelectorAll('img[src*=\"dreamina-sign\"], img[src*=\"tb4s082cfz\"]').length;\n \n // Step 2: Clear and set prompt\n const editors = document.querySelectorAll('[contenteditable=\"true\"]');\n const editor = editors[0];\n if (!editor) return [{ status: 'failed', prompt: prompt, image_count: 0, image_urls: 'Editor not found' }];\n \n editor.focus();\n await new Promise(r => setTimeout(r, 200));\n document.execCommand('selectAll');\n await new Promise(r => setTimeout(r, 100));\n document.execCommand('delete');\n await new Promise(r => setTimeout(r, 200));\n document.execCommand('insertText', false, prompt);\n await new Promise(r => setTimeout(r, 500));\n \n // Step 3: Click generate\n const btn = document.querySelector('.lv-btn.lv-btn-primary[class*=\"circle\"]');\n if (!btn) return [{ status: 'failed', prompt: prompt, image_count: 0, image_urls: 'Generate button not found' }];\n btn.click();\n \n // Step 4: Wait for new images to appear\n let newImgs = [];\n for (let i = 0; i < waitSec; i++) {\n await new Promise(r => setTimeout(r, 1000));\n const allImgs = document.querySelectorAll('img[src*=\"dreamina-sign\"], img[src*=\"tb4s082cfz\"]');\n if (allImgs.length > beforeImgs) {\n // New images appeared — generation complete\n newImgs = Array.from(allImgs).slice(0, allImgs.length - beforeImgs);\n break;\n }\n }\n \n if (newImgs.length === 0) {\n return [{ status: 'timeout', prompt: prompt, image_count: 0, image_urls: 'Generation may still be in progress' }];\n }\n \n // Step 5: Extract image URLs (use thumbnail URLs which are accessible)\n const urls = newImgs.map(img => img.src);\n \n return [{ \n status: 'success', \n prompt: prompt.substring(0, 80), \n image_count: urls.length, \n image_urls: urls.join('\\n')\n }];\n})()\n"
2075
+ },
2076
+ {
2077
+ "map": {
2078
+ "status": "${{ item.status }}",
2079
+ "prompt": "${{ item.prompt }}",
2080
+ "image_count": "${{ item.image_count }}",
2081
+ "image_urls": "${{ item.image_urls }}"
2082
+ }
2083
+ }
2084
+ ],
2085
+ "type": "yaml"
2086
+ },
2087
+ {
2088
+ "site": "jimeng",
2089
+ "name": "history",
2090
+ "description": "即梦AI 查看最近生成的作品",
2091
+ "domain": "jimeng.jianying.com",
2092
+ "strategy": "cookie",
2093
+ "browser": true,
2094
+ "args": [
2095
+ {
2096
+ "name": "limit",
2097
+ "type": "int",
2098
+ "default": 5,
2099
+ "required": false,
2100
+ "help": ""
2101
+ }
2102
+ ],
2103
+ "columns": [
2104
+ "prompt",
2105
+ "model",
2106
+ "status",
2107
+ "image_url",
2108
+ "created_at"
2109
+ ],
2110
+ "pipeline": [
2111
+ {
2112
+ "navigate": "https://jimeng.jianying.com/ai-tool/generate?type=image&workspace=0"
2113
+ },
2114
+ {
2115
+ "wait": 3
2116
+ },
2117
+ {
2118
+ "evaluate": "(async () => {\n const limit = ${{ args.limit }};\n const res = await fetch('/mweb/v1/get_history?aid=513695&device_platform=web&region=cn&da_version=3.3.11&web_version=7.5.0&aigc_features=app_lip_sync', {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ cursor: '', count: limit, need_page_item: true, need_aigc_data: true, aigc_mode_list: ['workbench'] })\n });\n const data = await res.json();\n const items = data?.data?.history_list || [];\n return items.slice(0, limit).map(item => {\n const params = item.aigc_image_params?.text2image_params || {};\n const images = item.image?.large_images || [];\n return {\n prompt: params.prompt || item.common_attr?.title || 'N/A',\n model: params.model_config?.model_name || 'unknown',\n status: item.common_attr?.status === 102 ? 'completed' : 'pending',\n image_url: images[0]?.image_url || '',\n created_at: new Date((item.common_attr?.create_time || 0) * 1000).toLocaleString('zh-CN'),\n };\n });\n})()\n"
2119
+ },
2120
+ {
2121
+ "map": {
2122
+ "prompt": "${{ item.prompt }}",
2123
+ "model": "${{ item.model }}",
2124
+ "status": "${{ item.status }}",
2125
+ "image_url": "${{ item.image_url }}",
2126
+ "created_at": "${{ item.created_at }}"
2127
+ }
2128
+ },
2129
+ {
2130
+ "limit": "${{ args.limit }}"
2131
+ }
2132
+ ],
2133
+ "type": "yaml"
2134
+ },
1531
2135
  {
1532
2136
  "site": "linkedin",
1533
2137
  "name": "search",
@@ -1612,6 +2216,457 @@
1612
2216
  "url"
1613
2217
  ]
1614
2218
  },
2219
+ {
2220
+ "site": "linux-do",
2221
+ "name": "categories",
2222
+ "description": "linux.do 分类列表",
2223
+ "domain": "linux.do",
2224
+ "strategy": "cookie",
2225
+ "browser": true,
2226
+ "args": [
2227
+ {
2228
+ "name": "limit",
2229
+ "type": "int",
2230
+ "default": 20,
2231
+ "required": false,
2232
+ "help": "Number of categories"
2233
+ }
2234
+ ],
2235
+ "columns": [
2236
+ "name",
2237
+ "slug",
2238
+ "id",
2239
+ "topics",
2240
+ "description"
2241
+ ],
2242
+ "pipeline": [
2243
+ {
2244
+ "navigate": "https://linux.do"
2245
+ },
2246
+ {
2247
+ "evaluate": "(async () => {\n const res = await fetch('/categories.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const cats = data?.category_list?.categories || [];\n return cats.slice(0, ${{ args.limit }}).map(c => ({\n name: c.name,\n slug: c.slug,\n id: c.id,\n topics: c.topic_count,\n description: (c.description_text || '').slice(0, 80),\n }));\n})()\n"
2248
+ },
2249
+ {
2250
+ "map": {
2251
+ "name": "${{ item.name }}",
2252
+ "slug": "${{ item.slug }}",
2253
+ "id": "${{ item.id }}",
2254
+ "topics": "${{ item.topics }}",
2255
+ "description": "${{ item.description }}"
2256
+ }
2257
+ },
2258
+ {
2259
+ "limit": "${{ args.limit }}"
2260
+ }
2261
+ ],
2262
+ "type": "yaml"
2263
+ },
2264
+ {
2265
+ "site": "linux-do",
2266
+ "name": "category",
2267
+ "description": "linux.do 分类内话题",
2268
+ "domain": "linux.do",
2269
+ "strategy": "cookie",
2270
+ "browser": true,
2271
+ "args": [
2272
+ {
2273
+ "name": "slug",
2274
+ "type": "str",
2275
+ "required": true,
2276
+ "help": "Category slug (use 'categories' command to find)"
2277
+ },
2278
+ {
2279
+ "name": "id",
2280
+ "type": "int",
2281
+ "required": true,
2282
+ "help": "Category ID (use 'categories' command to find)"
2283
+ },
2284
+ {
2285
+ "name": "limit",
2286
+ "type": "int",
2287
+ "default": 20,
2288
+ "required": false,
2289
+ "help": "Number of topics"
2290
+ }
2291
+ ],
2292
+ "columns": [
2293
+ "rank",
2294
+ "title",
2295
+ "replies",
2296
+ "views",
2297
+ "likes"
2298
+ ],
2299
+ "pipeline": [
2300
+ {
2301
+ "navigate": "https://linux.do"
2302
+ },
2303
+ {
2304
+ "evaluate": "(async () => {\n const slug = ${{ args.slug | json }};\n const res = await fetch('/c/' + encodeURIComponent(slug) + '/${{ args.id }}.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n }));\n})()\n"
2305
+ },
2306
+ {
2307
+ "map": {
2308
+ "rank": "${{ index + 1 }}",
2309
+ "title": "${{ item.title }}",
2310
+ "replies": "${{ item.replies }}",
2311
+ "views": "${{ item.views }}",
2312
+ "likes": "${{ item.likes }}"
2313
+ }
2314
+ },
2315
+ {
2316
+ "limit": "${{ args.limit }}"
2317
+ }
2318
+ ],
2319
+ "type": "yaml"
2320
+ },
2321
+ {
2322
+ "site": "linux-do",
2323
+ "name": "hot",
2324
+ "description": "linux.do 热门话题",
2325
+ "domain": "linux.do",
2326
+ "strategy": "cookie",
2327
+ "browser": true,
2328
+ "args": [
2329
+ {
2330
+ "name": "limit",
2331
+ "type": "int",
2332
+ "default": 20,
2333
+ "required": false,
2334
+ "help": "Number of topics"
2335
+ },
2336
+ {
2337
+ "name": "period",
2338
+ "type": "str",
2339
+ "default": "weekly",
2340
+ "required": false,
2341
+ "help": "Time period",
2342
+ "choices": [
2343
+ "all",
2344
+ "daily",
2345
+ "weekly",
2346
+ "monthly",
2347
+ "yearly"
2348
+ ]
2349
+ }
2350
+ ],
2351
+ "columns": [
2352
+ "rank",
2353
+ "title",
2354
+ "replies",
2355
+ "views",
2356
+ "likes",
2357
+ "category"
2358
+ ],
2359
+ "pipeline": [
2360
+ {
2361
+ "navigate": "https://linux.do"
2362
+ },
2363
+ {
2364
+ "evaluate": "(async () => {\n const period = ${{ args.period | json }};\n const res = await fetch('/top.json?period=' + encodeURIComponent(period), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n const cats = data?.topic_list?.categories || data?.categories || [];\n const catMap = Object.fromEntries(cats.map(c => [c.id, c.name]));\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n category: catMap[t.category_id] || String(t.category_id),\n }));\n})()\n"
2365
+ },
2366
+ {
2367
+ "map": {
2368
+ "rank": "${{ index + 1 }}",
2369
+ "title": "${{ item.title }}",
2370
+ "replies": "${{ item.replies }}",
2371
+ "views": "${{ item.views }}",
2372
+ "likes": "${{ item.likes }}",
2373
+ "category": "${{ item.category }}"
2374
+ }
2375
+ },
2376
+ {
2377
+ "limit": "${{ args.limit }}"
2378
+ }
2379
+ ],
2380
+ "type": "yaml"
2381
+ },
2382
+ {
2383
+ "site": "linux-do",
2384
+ "name": "latest",
2385
+ "description": "linux.do 最新话题",
2386
+ "domain": "linux.do",
2387
+ "strategy": "cookie",
2388
+ "browser": true,
2389
+ "args": [
2390
+ {
2391
+ "name": "limit",
2392
+ "type": "int",
2393
+ "default": 20,
2394
+ "required": false,
2395
+ "help": "Number of topics"
2396
+ }
2397
+ ],
2398
+ "columns": [
2399
+ "rank",
2400
+ "title",
2401
+ "replies",
2402
+ "views",
2403
+ "likes"
2404
+ ],
2405
+ "pipeline": [
2406
+ {
2407
+ "navigate": "https://linux.do"
2408
+ },
2409
+ {
2410
+ "evaluate": "(async () => {\n const res = await fetch('/latest.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n }));\n})()\n"
2411
+ },
2412
+ {
2413
+ "map": {
2414
+ "rank": "${{ index + 1 }}",
2415
+ "title": "${{ item.title }}",
2416
+ "replies": "${{ item.replies }}",
2417
+ "views": "${{ item.views }}",
2418
+ "likes": "${{ item.likes }}"
2419
+ }
2420
+ },
2421
+ {
2422
+ "limit": "${{ args.limit }}"
2423
+ }
2424
+ ],
2425
+ "type": "yaml"
2426
+ },
2427
+ {
2428
+ "site": "linux-do",
2429
+ "name": "search",
2430
+ "description": "搜索 linux.do",
2431
+ "domain": "linux.do",
2432
+ "strategy": "cookie",
2433
+ "browser": true,
2434
+ "args": [
2435
+ {
2436
+ "name": "keyword",
2437
+ "type": "str",
2438
+ "required": true,
2439
+ "help": "Search keyword"
2440
+ },
2441
+ {
2442
+ "name": "limit",
2443
+ "type": "int",
2444
+ "default": 20,
2445
+ "required": false,
2446
+ "help": "Number of results"
2447
+ }
2448
+ ],
2449
+ "columns": [
2450
+ "rank",
2451
+ "title",
2452
+ "views",
2453
+ "likes",
2454
+ "replies"
2455
+ ],
2456
+ "pipeline": [
2457
+ {
2458
+ "navigate": "https://linux.do"
2459
+ },
2460
+ {
2461
+ "evaluate": "(async () => {\n const keyword = ${{ args.keyword | json }};\n const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n views: t.views,\n likes: t.like_count,\n replies: (t.posts_count || 1) - 1,\n }));\n})()\n"
2462
+ },
2463
+ {
2464
+ "map": {
2465
+ "rank": "${{ index + 1 }}",
2466
+ "title": "${{ item.title }}",
2467
+ "views": "${{ item.views }}",
2468
+ "likes": "${{ item.likes }}",
2469
+ "replies": "${{ item.replies }}"
2470
+ }
2471
+ },
2472
+ {
2473
+ "limit": "${{ args.limit }}"
2474
+ }
2475
+ ],
2476
+ "type": "yaml"
2477
+ },
2478
+ {
2479
+ "site": "linux-do",
2480
+ "name": "topic",
2481
+ "description": "linux.do 帖子详情和回复(首页)",
2482
+ "domain": "linux.do",
2483
+ "strategy": "cookie",
2484
+ "browser": true,
2485
+ "args": [
2486
+ {
2487
+ "name": "id",
2488
+ "type": "int",
2489
+ "required": true,
2490
+ "help": "Topic ID"
2491
+ }
2492
+ ],
2493
+ "columns": [
2494
+ "author",
2495
+ "content",
2496
+ "likes",
2497
+ "created_at"
2498
+ ],
2499
+ "pipeline": [
2500
+ {
2501
+ "navigate": "https://linux.do"
2502
+ },
2503
+ {
2504
+ "evaluate": "(async () => {\n const res = await fetch('/t/${{ args.id }}.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const strip = (html) => (html || '').replace(/<br\\s*\\/?>/gi, ' ').replace(/<\\/(p|div|li|blockquote|h[1-6])>/gi, ' ').replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&#(?:(\\d+)|x([0-9a-fA-F]+));/g, (_, dec, hex) => { try { return String.fromCodePoint(dec !== undefined ? Number(dec) : parseInt(hex, 16)); } catch { return ''; } }).replace(/\\s+/g, ' ').trim();\n const posts = data?.post_stream?.posts || [];\n return posts.map(p => ({\n author: p.username,\n content: strip(p.cooked).slice(0, 200),\n likes: p.like_count,\n created_at: p.created_at,\n }));\n})()\n"
2505
+ },
2506
+ {
2507
+ "map": {
2508
+ "author": "${{ item.author }}",
2509
+ "content": "${{ item.content }}",
2510
+ "likes": "${{ item.likes }}",
2511
+ "created_at": "${{ item.created_at }}"
2512
+ }
2513
+ }
2514
+ ],
2515
+ "type": "yaml"
2516
+ },
2517
+ {
2518
+ "site": "notion",
2519
+ "name": "export",
2520
+ "description": "Export the current Notion page as Markdown",
2521
+ "strategy": "ui",
2522
+ "browser": true,
2523
+ "args": [
2524
+ {
2525
+ "name": "output",
2526
+ "type": "str",
2527
+ "default": "/tmp/notion-export.md)",
2528
+ "required": false,
2529
+ "positional": true,
2530
+ "help": "Output file (default: /tmp/notion-export.md)"
2531
+ }
2532
+ ],
2533
+ "type": "ts",
2534
+ "modulePath": "notion/export.js",
2535
+ "domain": "localhost",
2536
+ "columns": [
2537
+ "Status",
2538
+ "File"
2539
+ ]
2540
+ },
2541
+ {
2542
+ "site": "notion",
2543
+ "name": "favorites",
2544
+ "description": "List pages from the Notion Favorites section in the sidebar",
2545
+ "strategy": "ui",
2546
+ "browser": true,
2547
+ "args": [],
2548
+ "type": "ts",
2549
+ "modulePath": "notion/favorites.js",
2550
+ "domain": "localhost",
2551
+ "columns": [
2552
+ "Index",
2553
+ "Title",
2554
+ "Icon"
2555
+ ]
2556
+ },
2557
+ {
2558
+ "site": "notion",
2559
+ "name": "new",
2560
+ "description": "Create a new page in Notion",
2561
+ "strategy": "ui",
2562
+ "browser": true,
2563
+ "args": [
2564
+ {
2565
+ "name": "title",
2566
+ "type": "str",
2567
+ "required": false,
2568
+ "positional": true,
2569
+ "help": "Page title (optional)"
2570
+ }
2571
+ ],
2572
+ "type": "ts",
2573
+ "modulePath": "notion/new.js",
2574
+ "domain": "localhost",
2575
+ "columns": [
2576
+ "Status"
2577
+ ]
2578
+ },
2579
+ {
2580
+ "site": "notion",
2581
+ "name": "read",
2582
+ "description": "Read the content of the currently open Notion page",
2583
+ "strategy": "ui",
2584
+ "browser": true,
2585
+ "args": [],
2586
+ "type": "ts",
2587
+ "modulePath": "notion/read.js",
2588
+ "domain": "localhost",
2589
+ "columns": [
2590
+ "Title",
2591
+ "Content"
2592
+ ]
2593
+ },
2594
+ {
2595
+ "site": "notion",
2596
+ "name": "search",
2597
+ "description": "Search pages and databases in Notion via Quick Find (Cmd+P)",
2598
+ "strategy": "ui",
2599
+ "browser": true,
2600
+ "args": [
2601
+ {
2602
+ "name": "query",
2603
+ "type": "str",
2604
+ "required": true,
2605
+ "positional": true,
2606
+ "help": "Search query"
2607
+ }
2608
+ ],
2609
+ "type": "ts",
2610
+ "modulePath": "notion/search.js",
2611
+ "domain": "localhost",
2612
+ "columns": [
2613
+ "Index",
2614
+ "Title"
2615
+ ]
2616
+ },
2617
+ {
2618
+ "site": "notion",
2619
+ "name": "sidebar",
2620
+ "description": "List pages and databases from the Notion sidebar",
2621
+ "strategy": "ui",
2622
+ "browser": true,
2623
+ "args": [],
2624
+ "type": "ts",
2625
+ "modulePath": "notion/sidebar.js",
2626
+ "domain": "localhost",
2627
+ "columns": [
2628
+ "Index",
2629
+ "Title"
2630
+ ]
2631
+ },
2632
+ {
2633
+ "site": "notion",
2634
+ "name": "status",
2635
+ "description": "Check active CDP connection to Notion Desktop",
2636
+ "strategy": "ui",
2637
+ "browser": true,
2638
+ "args": [],
2639
+ "type": "ts",
2640
+ "modulePath": "notion/status.js",
2641
+ "domain": "localhost",
2642
+ "columns": [
2643
+ "Status",
2644
+ "Url",
2645
+ "Title"
2646
+ ]
2647
+ },
2648
+ {
2649
+ "site": "notion",
2650
+ "name": "write",
2651
+ "description": "Append text content to the currently open Notion page",
2652
+ "strategy": "ui",
2653
+ "browser": true,
2654
+ "args": [
2655
+ {
2656
+ "name": "text",
2657
+ "type": "str",
2658
+ "required": true,
2659
+ "positional": true,
2660
+ "help": "Text to append to the page"
2661
+ }
2662
+ ],
2663
+ "type": "ts",
2664
+ "modulePath": "notion/write.js",
2665
+ "domain": "localhost",
2666
+ "columns": [
2667
+ "Status"
2668
+ ]
2669
+ },
1615
2670
  {
1616
2671
  "site": "reddit",
1617
2672
  "name": "comment",
@@ -2418,6 +3473,44 @@
2418
3473
  "message"
2419
3474
  ]
2420
3475
  },
3476
+ {
3477
+ "site": "twitter",
3478
+ "name": "download",
3479
+ "description": "下载 Twitter/X 媒体(图片和视频)",
3480
+ "strategy": "cookie",
3481
+ "browser": true,
3482
+ "args": [
3483
+ {
3484
+ "name": "username",
3485
+ "type": "str",
3486
+ "required": false,
3487
+ "help": "Twitter username (downloads from media tab)"
3488
+ },
3489
+ {
3490
+ "name": "limit",
3491
+ "type": "int",
3492
+ "default": 10,
3493
+ "required": false,
3494
+ "help": "Number of tweets to scan"
3495
+ },
3496
+ {
3497
+ "name": "output",
3498
+ "type": "str",
3499
+ "default": "./twitter-downloads",
3500
+ "required": false,
3501
+ "help": "Output directory"
3502
+ }
3503
+ ],
3504
+ "type": "ts",
3505
+ "modulePath": "twitter/download.js",
3506
+ "domain": "x.com",
3507
+ "columns": [
3508
+ "index",
3509
+ "type",
3510
+ "status",
3511
+ "size"
3512
+ ]
3513
+ },
2421
3514
  {
2422
3515
  "site": "twitter",
2423
3516
  "name": "follow",
@@ -2996,6 +4089,107 @@
2996
4089
  ],
2997
4090
  "type": "yaml"
2998
4091
  },
4092
+ {
4093
+ "site": "wechat",
4094
+ "name": "chats",
4095
+ "description": "Open the WeChat chats panel (conversation list)",
4096
+ "strategy": "public",
4097
+ "browser": false,
4098
+ "args": [],
4099
+ "type": "ts",
4100
+ "modulePath": "wechat/chats.js",
4101
+ "domain": "localhost",
4102
+ "columns": [
4103
+ "Status"
4104
+ ]
4105
+ },
4106
+ {
4107
+ "site": "wechat",
4108
+ "name": "contacts",
4109
+ "description": "Open the WeChat contacts panel",
4110
+ "strategy": "public",
4111
+ "browser": false,
4112
+ "args": [],
4113
+ "type": "ts",
4114
+ "modulePath": "wechat/contacts.js",
4115
+ "domain": "localhost",
4116
+ "columns": [
4117
+ "Status"
4118
+ ]
4119
+ },
4120
+ {
4121
+ "site": "wechat",
4122
+ "name": "read",
4123
+ "description": "Read the current chat content by selecting all and copying",
4124
+ "strategy": "public",
4125
+ "browser": false,
4126
+ "args": [],
4127
+ "type": "ts",
4128
+ "modulePath": "wechat/read.js",
4129
+ "domain": "localhost",
4130
+ "columns": [
4131
+ "Content"
4132
+ ]
4133
+ },
4134
+ {
4135
+ "site": "wechat",
4136
+ "name": "search",
4137
+ "description": "Open WeChat search and type a query (find contacts or messages)",
4138
+ "strategy": "public",
4139
+ "browser": false,
4140
+ "args": [
4141
+ {
4142
+ "name": "query",
4143
+ "type": "str",
4144
+ "required": true,
4145
+ "positional": true,
4146
+ "help": "Search query (contact name or keyword)"
4147
+ }
4148
+ ],
4149
+ "type": "ts",
4150
+ "modulePath": "wechat/search.js",
4151
+ "domain": "localhost",
4152
+ "columns": [
4153
+ "Status"
4154
+ ]
4155
+ },
4156
+ {
4157
+ "site": "wechat",
4158
+ "name": "send",
4159
+ "description": "Send a message in the active WeChat conversation via clipboard paste",
4160
+ "strategy": "public",
4161
+ "browser": false,
4162
+ "args": [
4163
+ {
4164
+ "name": "text",
4165
+ "type": "str",
4166
+ "required": true,
4167
+ "positional": true,
4168
+ "help": "Message to send"
4169
+ }
4170
+ ],
4171
+ "type": "ts",
4172
+ "modulePath": "wechat/send.js",
4173
+ "domain": "localhost",
4174
+ "columns": [
4175
+ "Status"
4176
+ ]
4177
+ },
4178
+ {
4179
+ "site": "wechat",
4180
+ "name": "status",
4181
+ "description": "Check if WeChat Desktop is running on macOS",
4182
+ "strategy": "public",
4183
+ "browser": false,
4184
+ "args": [],
4185
+ "type": "ts",
4186
+ "modulePath": "wechat/status.js",
4187
+ "domain": "localhost",
4188
+ "columns": [
4189
+ "Status",
4190
+ "Detail"
4191
+ ]
4192
+ },
2999
4193
  {
3000
4194
  "site": "weibo",
3001
4195
  "name": "hot",
@@ -3023,6 +4217,137 @@
3023
4217
  "url"
3024
4218
  ]
3025
4219
  },
4220
+ {
4221
+ "site": "xiaohongshu",
4222
+ "name": "creator-note-detail",
4223
+ "description": "小红书单篇笔记详细数据 (阅读/互动/点赞/收藏/评论/分享,区分自然流量/推广/视频)",
4224
+ "strategy": "cookie",
4225
+ "browser": true,
4226
+ "args": [
4227
+ {
4228
+ "name": "note_id",
4229
+ "type": "string",
4230
+ "required": true,
4231
+ "help": "Note ID (from note URL or creator-notes command)"
4232
+ }
4233
+ ],
4234
+ "type": "ts",
4235
+ "modulePath": "xiaohongshu/creator-note-detail.js",
4236
+ "domain": "creator.xiaohongshu.com",
4237
+ "columns": [
4238
+ "channel",
4239
+ "reads",
4240
+ "engagement",
4241
+ "likes",
4242
+ "collects",
4243
+ "comments",
4244
+ "shares"
4245
+ ]
4246
+ },
4247
+ {
4248
+ "site": "xiaohongshu",
4249
+ "name": "creator-notes",
4250
+ "description": "小红书创作者笔记列表 + 每篇数据 (标题/日期/观看/点赞/收藏/评论)",
4251
+ "strategy": "cookie",
4252
+ "browser": true,
4253
+ "args": [
4254
+ {
4255
+ "name": "limit",
4256
+ "type": "int",
4257
+ "default": 20,
4258
+ "required": false,
4259
+ "help": "Number of notes to return"
4260
+ }
4261
+ ],
4262
+ "type": "ts",
4263
+ "modulePath": "xiaohongshu/creator-notes.js",
4264
+ "domain": "creator.xiaohongshu.com",
4265
+ "columns": [
4266
+ "rank",
4267
+ "id",
4268
+ "title",
4269
+ "date",
4270
+ "views",
4271
+ "likes",
4272
+ "collects",
4273
+ "comments",
4274
+ "url"
4275
+ ]
4276
+ },
4277
+ {
4278
+ "site": "xiaohongshu",
4279
+ "name": "creator-profile",
4280
+ "description": "小红书创作者账号信息 (粉丝/关注/获赞/成长等级)",
4281
+ "strategy": "cookie",
4282
+ "browser": true,
4283
+ "args": [],
4284
+ "type": "ts",
4285
+ "modulePath": "xiaohongshu/creator-profile.js",
4286
+ "domain": "creator.xiaohongshu.com",
4287
+ "columns": [
4288
+ "field",
4289
+ "value"
4290
+ ]
4291
+ },
4292
+ {
4293
+ "site": "xiaohongshu",
4294
+ "name": "creator-stats",
4295
+ "description": "小红书创作者数据总览 (观看/点赞/收藏/评论/分享/涨粉,含每日趋势)",
4296
+ "strategy": "cookie",
4297
+ "browser": true,
4298
+ "args": [
4299
+ {
4300
+ "name": "period",
4301
+ "type": "string",
4302
+ "default": "seven",
4303
+ "required": false,
4304
+ "help": "Stats period: seven or thirty",
4305
+ "choices": [
4306
+ "seven",
4307
+ "thirty"
4308
+ ]
4309
+ }
4310
+ ],
4311
+ "type": "ts",
4312
+ "modulePath": "xiaohongshu/creator-stats.js",
4313
+ "domain": "creator.xiaohongshu.com",
4314
+ "columns": [
4315
+ "metric",
4316
+ "total",
4317
+ "trend"
4318
+ ]
4319
+ },
4320
+ {
4321
+ "site": "xiaohongshu",
4322
+ "name": "download",
4323
+ "description": "下载小红书笔记中的图片和视频",
4324
+ "strategy": "cookie",
4325
+ "browser": true,
4326
+ "args": [
4327
+ {
4328
+ "name": "note_id",
4329
+ "type": "str",
4330
+ "required": true,
4331
+ "help": "Note ID (from URL)"
4332
+ },
4333
+ {
4334
+ "name": "output",
4335
+ "type": "str",
4336
+ "default": "./xiaohongshu-downloads",
4337
+ "required": false,
4338
+ "help": "Output directory"
4339
+ }
4340
+ ],
4341
+ "type": "ts",
4342
+ "modulePath": "xiaohongshu/download.js",
4343
+ "domain": "www.xiaohongshu.com",
4344
+ "columns": [
4345
+ "index",
4346
+ "type",
4347
+ "status",
4348
+ "size"
4349
+ ]
4350
+ },
3026
4351
  {
3027
4352
  "site": "xiaohongshu",
3028
4353
  "name": "feed",
@@ -3175,30 +4500,50 @@
3175
4500
  "likes"
3176
4501
  ]
3177
4502
  },
4503
+ {
4504
+ "site": "xiaohongshu",
4505
+ "name": "user-helpers",
4506
+ "description": "",
4507
+ "strategy": "cookie",
4508
+ "browser": true,
4509
+ "args": [],
4510
+ "type": "ts",
4511
+ "modulePath": "xiaohongshu/user-helpers.js"
4512
+ },
4513
+ {
4514
+ "site": "xiaohongshu",
4515
+ "name": "user-helpers.test",
4516
+ "description": "",
4517
+ "strategy": "cookie",
4518
+ "browser": true,
4519
+ "args": [],
4520
+ "type": "ts",
4521
+ "modulePath": "xiaohongshu/user-helpers.test.js"
4522
+ },
3178
4523
  {
3179
4524
  "site": "xiaohongshu",
3180
4525
  "name": "user",
3181
- "description": "Get user notes from Xiaohongshu",
3182
- "strategy": "intercept",
4526
+ "description": "Get public notes from a Xiaohongshu user profile",
4527
+ "strategy": "cookie",
3183
4528
  "browser": true,
3184
4529
  "args": [
3185
4530
  {
3186
4531
  "name": "id",
3187
4532
  "type": "string",
3188
4533
  "required": true,
3189
- "help": ""
4534
+ "help": "User id or profile URL"
3190
4535
  },
3191
4536
  {
3192
4537
  "name": "limit",
3193
4538
  "type": "int",
3194
4539
  "default": 15,
3195
4540
  "required": false,
3196
- "help": ""
4541
+ "help": "Number of notes to return"
3197
4542
  }
3198
4543
  ],
3199
4544
  "type": "ts",
3200
4545
  "modulePath": "xiaohongshu/user.js",
3201
- "domain": "xiaohongshu.com",
4546
+ "domain": "www.xiaohongshu.com",
3202
4547
  "columns": [
3203
4548
  "id",
3204
4549
  "title",
@@ -3754,6 +5099,47 @@
3754
5099
  "value"
3755
5100
  ]
3756
5101
  },
5102
+ {
5103
+ "site": "zhihu",
5104
+ "name": "download",
5105
+ "description": "导出知乎文章为 Markdown 格式",
5106
+ "strategy": "cookie",
5107
+ "browser": true,
5108
+ "args": [
5109
+ {
5110
+ "name": "url",
5111
+ "type": "str",
5112
+ "required": true,
5113
+ "help": "Article URL (zhuanlan.zhihu.com/p/xxx)"
5114
+ },
5115
+ {
5116
+ "name": "output",
5117
+ "type": "str",
5118
+ "default": "./zhihu-articles",
5119
+ "required": false,
5120
+ "help": "Output directory"
5121
+ }
5122
+ ],
5123
+ "type": "ts",
5124
+ "modulePath": "zhihu/download.js",
5125
+ "domain": "zhuanlan.zhihu.com",
5126
+ "columns": [
5127
+ "title",
5128
+ "author",
5129
+ "status",
5130
+ "size"
5131
+ ]
5132
+ },
5133
+ {
5134
+ "site": "zhihu",
5135
+ "name": "download.test",
5136
+ "description": "",
5137
+ "strategy": "cookie",
5138
+ "browser": true,
5139
+ "args": [],
5140
+ "type": "ts",
5141
+ "modulePath": "zhihu/download.test.js"
5142
+ },
3757
5143
  {
3758
5144
  "site": "zhihu",
3759
5145
  "name": "hot",