@zenalexa/unicli 0.218.1 → 0.220.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/AGENTS.md +42 -2
  2. package/README.md +169 -95
  3. package/README.zh-CN.md +169 -95
  4. package/bin/unicli-mcp +14 -0
  5. package/dist/adapters/1point3acres/forum.d.ts +58 -0
  6. package/dist/adapters/1point3acres/forum.d.ts.map +1 -0
  7. package/dist/adapters/1point3acres/forum.js +708 -0
  8. package/dist/adapters/1point3acres/forum.js.map +1 -0
  9. package/dist/adapters/aibase/news.d.ts +21 -0
  10. package/dist/adapters/aibase/news.d.ts.map +1 -0
  11. package/dist/adapters/aibase/news.js +96 -0
  12. package/dist/adapters/aibase/news.js.map +1 -0
  13. package/dist/adapters/arxiv/papers.d.ts +27 -0
  14. package/dist/adapters/arxiv/papers.d.ts.map +1 -0
  15. package/dist/adapters/arxiv/papers.js +193 -0
  16. package/dist/adapters/arxiv/papers.js.map +1 -0
  17. package/dist/adapters/bbc/topic.d.ts +24 -0
  18. package/dist/adapters/bbc/topic.d.ts.map +1 -0
  19. package/dist/adapters/bbc/topic.js +122 -0
  20. package/dist/adapters/bbc/topic.js.map +1 -0
  21. package/dist/adapters/chatgpt/web.d.ts +24 -0
  22. package/dist/adapters/chatgpt/web.d.ts.map +1 -0
  23. package/dist/adapters/chatgpt/web.js +242 -0
  24. package/dist/adapters/chatgpt/web.js.map +1 -0
  25. package/dist/adapters/claude/web.d.ts +24 -0
  26. package/dist/adapters/claude/web.d.ts.map +1 -0
  27. package/dist/adapters/claude/web.js +575 -0
  28. package/dist/adapters/claude/web.js.map +1 -0
  29. package/dist/adapters/codex/projects.d.ts +27 -0
  30. package/dist/adapters/codex/projects.d.ts.map +1 -0
  31. package/dist/adapters/codex/projects.js +147 -0
  32. package/dist/adapters/codex/projects.js.map +1 -0
  33. package/dist/adapters/coingecko/markets.d.ts +19 -0
  34. package/dist/adapters/coingecko/markets.d.ts.map +1 -0
  35. package/dist/adapters/coingecko/markets.js +474 -0
  36. package/dist/adapters/coingecko/markets.js.map +1 -0
  37. package/dist/adapters/coupang/product.d.ts +27 -0
  38. package/dist/adapters/coupang/product.d.ts.map +1 -0
  39. package/dist/adapters/coupang/product.js +211 -0
  40. package/dist/adapters/coupang/product.js.map +1 -0
  41. package/dist/adapters/crates/registry.d.ts +44 -0
  42. package/dist/adapters/crates/registry.d.ts.map +1 -0
  43. package/dist/adapters/crates/registry.js +186 -0
  44. package/dist/adapters/crates/registry.js.map +1 -0
  45. package/dist/adapters/ctrip/travel.d.ts +83 -0
  46. package/dist/adapters/ctrip/travel.d.ts.map +1 -0
  47. package/dist/adapters/ctrip/travel.js +630 -0
  48. package/dist/adapters/ctrip/travel.js.map +1 -0
  49. package/dist/adapters/dblp/publications.d.ts +41 -0
  50. package/dist/adapters/dblp/publications.d.ts.map +1 -0
  51. package/dist/adapters/dblp/publications.js +409 -0
  52. package/dist/adapters/dblp/publications.js.map +1 -0
  53. package/dist/adapters/deepseek/web.d.ts +1 -1
  54. package/dist/adapters/deepseek/web.d.ts.map +1 -1
  55. package/dist/adapters/deepseek/web.js +66 -1
  56. package/dist/adapters/deepseek/web.js.map +1 -1
  57. package/dist/adapters/defillama/protocols.d.ts +13 -0
  58. package/dist/adapters/defillama/protocols.d.ts.map +1 -0
  59. package/dist/adapters/defillama/protocols.js +218 -0
  60. package/dist/adapters/defillama/protocols.js.map +1 -0
  61. package/dist/adapters/devto/read.d.ts +26 -0
  62. package/dist/adapters/devto/read.d.ts.map +1 -0
  63. package/dist/adapters/devto/read.js +110 -0
  64. package/dist/adapters/devto/read.js.map +1 -0
  65. package/dist/adapters/dianping/shop.d.ts +38 -0
  66. package/dist/adapters/dianping/shop.d.ts.map +1 -0
  67. package/dist/adapters/dianping/shop.js +194 -0
  68. package/dist/adapters/dianping/shop.js.map +1 -0
  69. package/dist/adapters/dockerhub/registry.d.ts +36 -0
  70. package/dist/adapters/dockerhub/registry.d.ts.map +1 -0
  71. package/dist/adapters/dockerhub/registry.js +172 -0
  72. package/dist/adapters/dockerhub/registry.js.map +1 -0
  73. package/dist/adapters/endoflife/product.d.ts +11 -0
  74. package/dist/adapters/endoflife/product.d.ts.map +1 -0
  75. package/dist/adapters/endoflife/product.js +113 -0
  76. package/dist/adapters/endoflife/product.js.map +1 -0
  77. package/dist/adapters/facebook/marketplace-extra.d.ts +9 -0
  78. package/dist/adapters/facebook/marketplace-extra.d.ts.map +1 -0
  79. package/dist/adapters/facebook/marketplace-extra.js +170 -0
  80. package/dist/adapters/facebook/marketplace-extra.js.map +1 -0
  81. package/dist/adapters/flathub/apps.d.ts +17 -0
  82. package/dist/adapters/flathub/apps.d.ts.map +1 -0
  83. package/dist/adapters/flathub/apps.js +220 -0
  84. package/dist/adapters/flathub/apps.js.map +1 -0
  85. package/dist/adapters/goproxy/module.d.ts +24 -0
  86. package/dist/adapters/goproxy/module.d.ts.map +1 -0
  87. package/dist/adapters/goproxy/module.js +221 -0
  88. package/dist/adapters/goproxy/module.js.map +1 -0
  89. package/dist/adapters/grok/web.d.ts +29 -0
  90. package/dist/adapters/grok/web.d.ts.map +1 -0
  91. package/dist/adapters/grok/web.js +553 -0
  92. package/dist/adapters/grok/web.js.map +1 -0
  93. package/dist/adapters/hackernews/read.d.ts +31 -0
  94. package/dist/adapters/hackernews/read.d.ts.map +1 -0
  95. package/dist/adapters/hackernews/read.js +201 -0
  96. package/dist/adapters/hackernews/read.js.map +1 -0
  97. package/dist/adapters/hf/paper.d.ts +22 -0
  98. package/dist/adapters/hf/paper.d.ts.map +1 -0
  99. package/dist/adapters/hf/paper.js +112 -0
  100. package/dist/adapters/hf/paper.js.map +1 -0
  101. package/dist/adapters/homebrew/packages.d.ts +52 -0
  102. package/dist/adapters/homebrew/packages.d.ts.map +1 -0
  103. package/dist/adapters/homebrew/packages.js +240 -0
  104. package/dist/adapters/homebrew/packages.js.map +1 -0
  105. package/dist/adapters/indeed/jobs.d.ts +38 -0
  106. package/dist/adapters/indeed/jobs.d.ts.map +1 -0
  107. package/dist/adapters/indeed/jobs.js +300 -0
  108. package/dist/adapters/indeed/jobs.js.map +1 -0
  109. package/dist/adapters/instagram/collections.d.ts +9 -0
  110. package/dist/adapters/instagram/collections.d.ts.map +1 -0
  111. package/dist/adapters/instagram/collections.js +174 -0
  112. package/dist/adapters/instagram/collections.js.map +1 -0
  113. package/dist/adapters/lichess/players.d.ts +46 -0
  114. package/dist/adapters/lichess/players.d.ts.map +1 -0
  115. package/dist/adapters/lichess/players.js +221 -0
  116. package/dist/adapters/lichess/players.js.map +1 -0
  117. package/dist/adapters/lobsters/read-domain.d.ts +35 -0
  118. package/dist/adapters/lobsters/read-domain.d.ts.map +1 -0
  119. package/dist/adapters/lobsters/read-domain.js +306 -0
  120. package/dist/adapters/lobsters/read-domain.js.map +1 -0
  121. package/dist/adapters/maven/artifact.d.ts +30 -0
  122. package/dist/adapters/maven/artifact.d.ts.map +1 -0
  123. package/dist/adapters/maven/artifact.js +121 -0
  124. package/dist/adapters/maven/artifact.js.map +1 -0
  125. package/dist/adapters/mdn/search.d.ts +11 -0
  126. package/dist/adapters/mdn/search.d.ts.map +1 -0
  127. package/dist/adapters/mdn/search.js +115 -0
  128. package/dist/adapters/mdn/search.js.map +1 -0
  129. package/dist/adapters/medium/tag.d.ts +15 -0
  130. package/dist/adapters/medium/tag.d.ts.map +1 -0
  131. package/dist/adapters/medium/tag.js +148 -0
  132. package/dist/adapters/medium/tag.js.map +1 -0
  133. package/dist/adapters/npm/package.d.ts +32 -0
  134. package/dist/adapters/npm/package.d.ts.map +1 -0
  135. package/dist/adapters/npm/package.js +141 -0
  136. package/dist/adapters/npm/package.js.map +1 -0
  137. package/dist/adapters/nuget/package.d.ts +34 -0
  138. package/dist/adapters/nuget/package.d.ts.map +1 -0
  139. package/dist/adapters/nuget/package.js +135 -0
  140. package/dist/adapters/nuget/package.js.map +1 -0
  141. package/dist/adapters/nvd/cve.d.ts +42 -0
  142. package/dist/adapters/nvd/cve.d.ts.map +1 -0
  143. package/dist/adapters/nvd/cve.js +132 -0
  144. package/dist/adapters/nvd/cve.js.map +1 -0
  145. package/dist/adapters/oeis/sequences.d.ts +14 -0
  146. package/dist/adapters/oeis/sequences.d.ts.map +1 -0
  147. package/dist/adapters/oeis/sequences.js +219 -0
  148. package/dist/adapters/oeis/sequences.js.map +1 -0
  149. package/dist/adapters/openalex/works.d.ts +43 -0
  150. package/dist/adapters/openalex/works.d.ts.map +1 -0
  151. package/dist/adapters/openalex/works.js +267 -0
  152. package/dist/adapters/openalex/works.js.map +1 -0
  153. package/dist/adapters/openfda/records.d.ts +18 -0
  154. package/dist/adapters/openfda/records.d.ts.map +1 -0
  155. package/dist/adapters/openfda/records.js +209 -0
  156. package/dist/adapters/openfda/records.js.map +1 -0
  157. package/dist/adapters/openreview/papers.d.ts +34 -0
  158. package/dist/adapters/openreview/papers.d.ts.map +1 -0
  159. package/dist/adapters/openreview/papers.js +463 -0
  160. package/dist/adapters/openreview/papers.js.map +1 -0
  161. package/dist/adapters/osv/security.d.ts +36 -0
  162. package/dist/adapters/osv/security.d.ts.map +1 -0
  163. package/dist/adapters/osv/security.js +247 -0
  164. package/dist/adapters/osv/security.js.map +1 -0
  165. package/dist/adapters/packagist/package.d.ts +31 -0
  166. package/dist/adapters/packagist/package.d.ts.map +1 -0
  167. package/dist/adapters/packagist/package.js +108 -0
  168. package/dist/adapters/packagist/package.js.map +1 -0
  169. package/dist/adapters/pubmed/articles.d.ts +31 -0
  170. package/dist/adapters/pubmed/articles.d.ts.map +1 -0
  171. package/dist/adapters/pubmed/articles.js +385 -0
  172. package/dist/adapters/pubmed/articles.js.map +1 -0
  173. package/dist/adapters/pypi/package.d.ts +38 -0
  174. package/dist/adapters/pypi/package.d.ts.map +1 -0
  175. package/dist/adapters/pypi/package.js +235 -0
  176. package/dist/adapters/pypi/package.js.map +1 -0
  177. package/dist/adapters/qwen/web.d.ts +26 -0
  178. package/dist/adapters/qwen/web.d.ts.map +1 -0
  179. package/dist/adapters/qwen/web.js +672 -0
  180. package/dist/adapters/qwen/web.js.map +1 -0
  181. package/dist/adapters/reddit/account.d.ts +12 -0
  182. package/dist/adapters/reddit/account.d.ts.map +1 -0
  183. package/dist/adapters/reddit/account.js +409 -0
  184. package/dist/adapters/reddit/account.js.map +1 -0
  185. package/dist/adapters/rednote/web.d.ts +30 -0
  186. package/dist/adapters/rednote/web.d.ts.map +1 -0
  187. package/dist/adapters/rednote/web.js +858 -0
  188. package/dist/adapters/rednote/web.js.map +1 -0
  189. package/dist/adapters/rest-countries/countries.d.ts +14 -0
  190. package/dist/adapters/rest-countries/countries.d.ts.map +1 -0
  191. package/dist/adapters/rest-countries/countries.js +231 -0
  192. package/dist/adapters/rest-countries/countries.js.map +1 -0
  193. package/dist/adapters/reuters/article-detail.d.ts +37 -0
  194. package/dist/adapters/reuters/article-detail.d.ts.map +1 -0
  195. package/dist/adapters/reuters/article-detail.js +139 -0
  196. package/dist/adapters/reuters/article-detail.js.map +1 -0
  197. package/dist/adapters/rfc/rfc.d.ts +11 -0
  198. package/dist/adapters/rfc/rfc.d.ts.map +1 -0
  199. package/dist/adapters/rfc/rfc.js +121 -0
  200. package/dist/adapters/rfc/rfc.js.map +1 -0
  201. package/dist/adapters/rubygems/gem.d.ts +26 -0
  202. package/dist/adapters/rubygems/gem.d.ts.map +1 -0
  203. package/dist/adapters/rubygems/gem.js +96 -0
  204. package/dist/adapters/rubygems/gem.js.map +1 -0
  205. package/dist/adapters/stackoverflow/questions.d.ts +79 -0
  206. package/dist/adapters/stackoverflow/questions.d.ts.map +1 -0
  207. package/dist/adapters/stackoverflow/questions.js +504 -0
  208. package/dist/adapters/stackoverflow/questions.js.map +1 -0
  209. package/dist/adapters/steam/app.d.ts +39 -0
  210. package/dist/adapters/steam/app.d.ts.map +1 -0
  211. package/dist/adapters/steam/app.js +165 -0
  212. package/dist/adapters/steam/app.js.map +1 -0
  213. package/dist/adapters/tiktok/creator-videos.d.ts +52 -0
  214. package/dist/adapters/tiktok/creator-videos.d.ts.map +1 -0
  215. package/dist/adapters/tiktok/creator-videos.js +267 -0
  216. package/dist/adapters/tiktok/creator-videos.js.map +1 -0
  217. package/dist/adapters/tvmaze/shows.d.ts +13 -0
  218. package/dist/adapters/tvmaze/shows.d.ts.map +1 -0
  219. package/dist/adapters/tvmaze/shows.js +240 -0
  220. package/dist/adapters/tvmaze/shows.js.map +1 -0
  221. package/dist/adapters/twitter/bookmark-folders.d.ts +33 -0
  222. package/dist/adapters/twitter/bookmark-folders.d.ts.map +1 -0
  223. package/dist/adapters/twitter/bookmark-folders.js +290 -0
  224. package/dist/adapters/twitter/bookmark-folders.js.map +1 -0
  225. package/dist/adapters/twitter/quote.d.ts +18 -0
  226. package/dist/adapters/twitter/quote.d.ts.map +1 -0
  227. package/dist/adapters/twitter/quote.js +285 -0
  228. package/dist/adapters/twitter/quote.js.map +1 -0
  229. package/dist/adapters/twitter/tweet-actions.d.ts +12 -0
  230. package/dist/adapters/twitter/tweet-actions.d.ts.map +1 -0
  231. package/dist/adapters/twitter/tweet-actions.js +145 -0
  232. package/dist/adapters/twitter/tweet-actions.js.map +1 -0
  233. package/dist/adapters/twitter/tweet-url.d.ts +15 -0
  234. package/dist/adapters/twitter/tweet-url.d.ts.map +1 -0
  235. package/dist/adapters/twitter/tweet-url.js +57 -0
  236. package/dist/adapters/twitter/tweet-url.js.map +1 -0
  237. package/dist/adapters/uisdc/news.d.ts +22 -0
  238. package/dist/adapters/uisdc/news.d.ts.map +1 -0
  239. package/dist/adapters/uisdc/news.js +91 -0
  240. package/dist/adapters/uisdc/news.js.map +1 -0
  241. package/dist/adapters/weibo/favorites-publish.d.ts +28 -0
  242. package/dist/adapters/weibo/favorites-publish.d.ts.map +1 -0
  243. package/dist/adapters/weibo/favorites-publish.js +356 -0
  244. package/dist/adapters/weibo/favorites-publish.js.map +1 -0
  245. package/dist/adapters/wikidata/entities.d.ts +15 -0
  246. package/dist/adapters/wikidata/entities.d.ts.map +1 -0
  247. package/dist/adapters/wikidata/entities.js +219 -0
  248. package/dist/adapters/wikidata/entities.js.map +1 -0
  249. package/dist/adapters/wikipedia/page.d.ts +21 -0
  250. package/dist/adapters/wikipedia/page.d.ts.map +1 -0
  251. package/dist/adapters/wikipedia/page.js +116 -0
  252. package/dist/adapters/wikipedia/page.js.map +1 -0
  253. package/dist/adapters/wttr/weather.d.ts +12 -0
  254. package/dist/adapters/wttr/weather.d.ts.map +1 -0
  255. package/dist/adapters/wttr/weather.js +207 -0
  256. package/dist/adapters/wttr/weather.js.map +1 -0
  257. package/dist/adapters/xianyu/publish.d.ts +31 -0
  258. package/dist/adapters/xianyu/publish.d.ts.map +1 -0
  259. package/dist/adapters/xianyu/publish.js +349 -0
  260. package/dist/adapters/xianyu/publish.js.map +1 -0
  261. package/dist/adapters/xiaohongshu/user-helpers.d.ts +2 -2
  262. package/dist/adapters/xiaohongshu/user-helpers.d.ts.map +1 -1
  263. package/dist/adapters/xiaohongshu/user-helpers.js +5 -4
  264. package/dist/adapters/xiaohongshu/user-helpers.js.map +1 -1
  265. package/dist/adapters/yuanbao/web.d.ts +27 -0
  266. package/dist/adapters/yuanbao/web.d.ts.map +1 -0
  267. package/dist/adapters/yuanbao/web.js +365 -0
  268. package/dist/adapters/yuanbao/web.js.map +1 -0
  269. package/dist/adapters/zhihu/collection.d.ts +33 -0
  270. package/dist/adapters/zhihu/collection.d.ts.map +1 -0
  271. package/dist/adapters/zhihu/collection.js +185 -0
  272. package/dist/adapters/zhihu/collection.js.map +1 -0
  273. package/dist/adapters/zlibrary/web.d.ts +19 -0
  274. package/dist/adapters/zlibrary/web.d.ts.map +1 -0
  275. package/dist/adapters/zlibrary/web.js +153 -0
  276. package/dist/adapters/zlibrary/web.js.map +1 -0
  277. package/dist/browser/daemon-client.js +2 -2
  278. package/dist/browser/daemon-client.js.map +1 -1
  279. package/dist/cli.js +1 -1
  280. package/dist/cli.js.map +1 -1
  281. package/dist/commands/adapter-authoring.d.ts +28 -0
  282. package/dist/commands/adapter-authoring.d.ts.map +1 -0
  283. package/dist/commands/adapter-authoring.js +231 -0
  284. package/dist/commands/adapter-authoring.js.map +1 -0
  285. package/dist/commands/browser/actions.d.ts +13 -0
  286. package/dist/commands/browser/actions.d.ts.map +1 -0
  287. package/dist/commands/{browser-operator.js → browser/actions.js} +19 -12
  288. package/dist/commands/browser/actions.js.map +1 -0
  289. package/dist/commands/browser/adapter.d.ts +10 -0
  290. package/dist/commands/browser/adapter.d.ts.map +1 -0
  291. package/dist/commands/{browser-adapter-authoring.js → browser/adapter.js} +14 -7
  292. package/dist/commands/browser/adapter.js.map +1 -0
  293. package/dist/commands/browser/authoring.d.ts +10 -0
  294. package/dist/commands/browser/authoring.d.ts.map +1 -0
  295. package/dist/commands/{browser-authoring-operator.js → browser/authoring.js} +12 -5
  296. package/dist/commands/browser/authoring.js.map +1 -0
  297. package/dist/commands/browser/index.d.ts +10 -0
  298. package/dist/commands/browser/index.d.ts.map +1 -0
  299. package/dist/commands/{browser.js → browser/index.js} +13 -14
  300. package/dist/commands/browser/index.js.map +1 -0
  301. package/dist/commands/{browser-operator-runtime.d.ts → browser/runtime.d.ts} +9 -2
  302. package/dist/commands/browser/runtime.d.ts.map +1 -0
  303. package/dist/commands/{browser-operator-runtime.js → browser/runtime.js} +16 -9
  304. package/dist/commands/browser/runtime.js.map +1 -0
  305. package/dist/commands/explore.d.ts +5 -5
  306. package/dist/commands/explore.d.ts.map +1 -1
  307. package/dist/commands/explore.js +7 -97
  308. package/dist/commands/explore.js.map +1 -1
  309. package/dist/commands/generate.d.ts +5 -5
  310. package/dist/commands/generate.d.ts.map +1 -1
  311. package/dist/commands/generate.js +8 -179
  312. package/dist/commands/generate.js.map +1 -1
  313. package/dist/commands/operate.js +1 -1
  314. package/dist/commands/operate.js.map +1 -1
  315. package/dist/commands/synthesize.d.ts +5 -5
  316. package/dist/commands/synthesize.d.ts.map +1 -1
  317. package/dist/commands/synthesize.js +8 -161
  318. package/dist/commands/synthesize.js.map +1 -1
  319. package/dist/discovery/aliases.d.ts +5 -10
  320. package/dist/discovery/aliases.d.ts.map +1 -1
  321. package/dist/discovery/aliases.js +10 -10
  322. package/dist/discovery/aliases.js.map +1 -1
  323. package/dist/discovery/macos-dynamic.d.ts.map +1 -1
  324. package/dist/discovery/macos-dynamic.js +17 -3
  325. package/dist/discovery/macos-dynamic.js.map +1 -1
  326. package/dist/engine/browser/action-evidence.js +1 -1
  327. package/dist/engine/browser/action-evidence.js.map +1 -1
  328. package/dist/engine/steps/map.d.ts +7 -0
  329. package/dist/engine/steps/map.d.ts.map +1 -1
  330. package/dist/engine/steps/map.js +16 -2
  331. package/dist/engine/steps/map.js.map +1 -1
  332. package/dist/manifest-compact.txt +10 -10
  333. package/dist/manifest-search.json +1 -1
  334. package/dist/manifest.json +5437 -247
  335. package/dist/transport/refs.d.ts +5 -3
  336. package/dist/transport/refs.d.ts.map +1 -1
  337. package/dist/transport/refs.js +8 -1
  338. package/dist/transport/refs.js.map +1 -1
  339. package/dist/transport/sidecar-binary.d.ts +7 -0
  340. package/dist/transport/sidecar-binary.d.ts.map +1 -1
  341. package/dist/transport/sidecar-binary.js +28 -8
  342. package/dist/transport/sidecar-binary.js.map +1 -1
  343. package/package.json +8 -6
  344. package/server.json +3 -3
  345. package/skills/unicli/SKILL.md +1 -1
  346. package/skills/unicli-claude-code/SKILL.md +1 -1
  347. package/skills/unicli-hermes/SKILL.md +1 -1
  348. package/src/adapters/1point3acres/forum.test.ts +300 -0
  349. package/src/adapters/1point3acres/forum.ts +852 -0
  350. package/src/adapters/36kr/hot.yaml +1 -0
  351. package/src/adapters/36kr/search.yaml +1 -0
  352. package/src/adapters/_archived/README.md +12 -0
  353. package/src/adapters/{apple-music → _archived/apple-music}/rate-album.yaml +5 -12
  354. package/src/adapters/_archived/archive.json +44 -0
  355. package/src/adapters/{az → _archived/az}/account.yaml +5 -1
  356. package/src/adapters/{ctrip → _archived/ctrip}/hot.yaml +5 -1
  357. package/src/adapters/{ctrip → _archived/ctrip}/search.yaml +6 -2
  358. package/src/adapters/{gcloud → _archived/gcloud}/projects.yaml +5 -1
  359. package/src/adapters/aibase/news.test.ts +42 -0
  360. package/src/adapters/aibase/news.ts +118 -0
  361. package/src/adapters/amazon/new-releases.yaml +1 -0
  362. package/src/adapters/amazon/search.yaml +1 -0
  363. package/src/adapters/apple-podcasts/search.yaml +1 -0
  364. package/src/adapters/apple-podcasts/top.yaml +1 -0
  365. package/src/adapters/arxiv/papers.test.ts +59 -0
  366. package/src/adapters/arxiv/papers.ts +226 -0
  367. package/src/adapters/arxiv/search.yaml +1 -0
  368. package/src/adapters/arxiv/trending.yaml +1 -0
  369. package/src/adapters/baidu/hot.yaml +1 -0
  370. package/src/adapters/baidu/search.yaml +1 -0
  371. package/src/adapters/bbc/top.yaml +1 -0
  372. package/src/adapters/bbc/topic.test.ts +52 -0
  373. package/src/adapters/bbc/topic.ts +149 -0
  374. package/src/adapters/bilibili/feed.yaml +1 -0
  375. package/src/adapters/bilibili/hot.yaml +1 -0
  376. package/src/adapters/bilibili/trending.yaml +1 -0
  377. package/src/adapters/binance/hot.yaml +1 -0
  378. package/src/adapters/binance/top.yaml +1 -0
  379. package/src/adapters/bluesky/search.yaml +1 -0
  380. package/src/adapters/bluesky/trending.yaml +1 -0
  381. package/src/adapters/chatgpt/web.test.ts +121 -0
  382. package/src/adapters/chatgpt/web.ts +286 -0
  383. package/src/adapters/claude/web.test.ts +206 -0
  384. package/src/adapters/claude/web.ts +684 -0
  385. package/src/adapters/cnki/search.yaml +1 -0
  386. package/src/adapters/cnn/top.yaml +1 -0
  387. package/src/adapters/codex/projects.test.ts +77 -0
  388. package/src/adapters/codex/projects.ts +178 -0
  389. package/src/adapters/coingecko/markets.test.ts +156 -0
  390. package/src/adapters/coingecko/markets.ts +574 -0
  391. package/src/adapters/coupang/hot.yaml +1 -0
  392. package/src/adapters/coupang/product.test.ts +111 -0
  393. package/src/adapters/coupang/product.ts +256 -0
  394. package/src/adapters/coupang/search.yaml +1 -0
  395. package/src/adapters/crates/registry.test.ts +89 -0
  396. package/src/adapters/crates/registry.ts +247 -0
  397. package/src/adapters/ctrip/travel.test.ts +359 -0
  398. package/src/adapters/ctrip/travel.ts +792 -0
  399. package/src/adapters/dangdang/hot.yaml +1 -0
  400. package/src/adapters/dangdang/search.yaml +1 -0
  401. package/src/adapters/dblp/publications.test.ts +123 -0
  402. package/src/adapters/dblp/publications.ts +494 -0
  403. package/src/adapters/deepseek/web.test.ts +69 -0
  404. package/src/adapters/deepseek/web.ts +78 -1
  405. package/src/adapters/defillama/protocols.test.ts +75 -0
  406. package/src/adapters/defillama/protocols.ts +253 -0
  407. package/src/adapters/devto/read.test.ts +49 -0
  408. package/src/adapters/devto/read.ts +145 -0
  409. package/src/adapters/devto/search.yaml +1 -0
  410. package/src/adapters/devto/top.yaml +1 -0
  411. package/src/adapters/dianping/hot.yaml +1 -0
  412. package/src/adapters/dianping/search.yaml +1 -0
  413. package/src/adapters/dianping/shop.test.ts +134 -0
  414. package/src/adapters/dianping/shop.ts +261 -0
  415. package/src/adapters/dictionary/search.yaml +1 -0
  416. package/src/adapters/dockerhub/registry.test.ts +97 -0
  417. package/src/adapters/dockerhub/registry.ts +223 -0
  418. package/src/adapters/douban/new-movies.yaml +1 -0
  419. package/src/adapters/douban/search.yaml +1 -0
  420. package/src/adapters/doubao/new.yaml +1 -0
  421. package/src/adapters/douyu/hot.yaml +1 -0
  422. package/src/adapters/douyu/search.yaml +1 -0
  423. package/src/adapters/eastmoney/hot.yaml +1 -0
  424. package/src/adapters/eastmoney/search.yaml +1 -0
  425. package/src/adapters/ele/hot.yaml +1 -0
  426. package/src/adapters/ele/search.yaml +1 -0
  427. package/src/adapters/endoflife/product.test.ts +50 -0
  428. package/src/adapters/endoflife/product.ts +128 -0
  429. package/src/adapters/exchangerate/list.yaml +1 -0
  430. package/src/adapters/facebook/feed.yaml +1 -0
  431. package/src/adapters/facebook/marketplace-extra.test.ts +132 -0
  432. package/src/adapters/facebook/marketplace-extra.ts +213 -0
  433. package/src/adapters/facebook/search.yaml +1 -0
  434. package/src/adapters/flathub/apps.test.ts +85 -0
  435. package/src/adapters/flathub/apps.ts +254 -0
  436. package/src/adapters/futu/hot.yaml +1 -0
  437. package/src/adapters/gemini/deep-research-result.yaml +1 -0
  438. package/src/adapters/gemini/new.yaml +1 -0
  439. package/src/adapters/gh/search-repos.yaml +1 -0
  440. package/src/adapters/gitee/search.yaml +1 -0
  441. package/src/adapters/gitee/trending.yaml +1 -0
  442. package/src/adapters/gitlab/search.yaml +1 -0
  443. package/src/adapters/gitlab/trending.yaml +1 -0
  444. package/src/adapters/google/search.yaml +1 -0
  445. package/src/adapters/goproxy/module.test.ts +72 -0
  446. package/src/adapters/goproxy/module.ts +258 -0
  447. package/src/adapters/grok/web.test.ts +181 -0
  448. package/src/adapters/grok/web.ts +640 -0
  449. package/src/adapters/hackernews/read.test.ts +68 -0
  450. package/src/adapters/hackernews/read.ts +265 -0
  451. package/src/adapters/hf/paper.test.ts +48 -0
  452. package/src/adapters/hf/paper.ts +138 -0
  453. package/src/adapters/hf/top.yaml +1 -0
  454. package/src/adapters/homebrew/packages.test.ts +109 -0
  455. package/src/adapters/homebrew/packages.ts +304 -0
  456. package/src/adapters/huggingface-papers/search.yaml +1 -0
  457. package/src/adapters/imdb/search.yaml +1 -0
  458. package/src/adapters/imdb/top.yaml +1 -0
  459. package/src/adapters/imdb/trending.yaml +1 -0
  460. package/src/adapters/imessage/recent.yaml +1 -0
  461. package/src/adapters/imessage/search.yaml +1 -0
  462. package/src/adapters/indeed/jobs.test.ts +230 -0
  463. package/src/adapters/indeed/jobs.ts +375 -0
  464. package/src/adapters/instagram/collections.test.ts +94 -0
  465. package/src/adapters/instagram/collections.ts +206 -0
  466. package/src/adapters/instagram/search.yaml +1 -0
  467. package/src/adapters/itch-io/popular.yaml +1 -0
  468. package/src/adapters/itch-io/search.yaml +1 -0
  469. package/src/adapters/itch-io/top.yaml +1 -0
  470. package/src/adapters/ithome/hot.yaml +1 -0
  471. package/src/adapters/jianyu/search.yaml +1 -0
  472. package/src/adapters/jike/feed.yaml +1 -0
  473. package/src/adapters/jike/search.yaml +1 -0
  474. package/src/adapters/juejin/hot.yaml +1 -0
  475. package/src/adapters/juejin/search.yaml +1 -0
  476. package/src/adapters/kuaishou/hot.yaml +1 -0
  477. package/src/adapters/kuaishou/search.yaml +1 -0
  478. package/src/adapters/leetcode/discuss-search.yaml +1 -0
  479. package/src/adapters/lichess/players.test.ts +99 -0
  480. package/src/adapters/lichess/players.ts +277 -0
  481. package/src/adapters/linear/issue-list.yaml +1 -0
  482. package/src/adapters/linkedin/search.yaml +1 -0
  483. package/src/adapters/linkedin/timeline.yaml +1 -0
  484. package/src/adapters/linux-do/feed.yaml +1 -0
  485. package/src/adapters/linux-do/hot.yaml +1 -0
  486. package/src/adapters/lobsters/hot.yaml +1 -0
  487. package/src/adapters/lobsters/read-domain.test.ts +121 -0
  488. package/src/adapters/lobsters/read-domain.ts +400 -0
  489. package/src/adapters/lobsters/search.yaml +1 -0
  490. package/src/adapters/macos/apps-list.yaml +1 -0
  491. package/src/adapters/macos/calendar-list.yaml +1 -0
  492. package/src/adapters/macos/contacts-search.yaml +1 -0
  493. package/src/adapters/macos/notes-list.yaml +1 -0
  494. package/src/adapters/macos/notes-search.yaml +1 -0
  495. package/src/adapters/macos/photos-search.yaml +1 -0
  496. package/src/adapters/macos/reminders-list.yaml +1 -0
  497. package/src/adapters/macos/shortcuts-list.yaml +1 -0
  498. package/src/adapters/maimai/search.yaml +1 -0
  499. package/src/adapters/maoyan/hot.yaml +1 -0
  500. package/src/adapters/maoyan/search.yaml +1 -0
  501. package/src/adapters/mastodon/search.yaml +1 -0
  502. package/src/adapters/mastodon/timeline.yaml +1 -0
  503. package/src/adapters/mastodon/trending.yaml +1 -0
  504. package/src/adapters/maven/artifact.test.ts +67 -0
  505. package/src/adapters/maven/artifact.ts +155 -0
  506. package/src/adapters/maven/info.yaml +46 -0
  507. package/src/adapters/maven/search.yaml +44 -0
  508. package/src/adapters/mdn/search.test.ts +39 -0
  509. package/src/adapters/mdn/search.ts +133 -0
  510. package/src/adapters/medium/feed.yaml +1 -0
  511. package/src/adapters/medium/search.yaml +1 -0
  512. package/src/adapters/medium/tag.test.ts +64 -0
  513. package/src/adapters/medium/tag.ts +164 -0
  514. package/src/adapters/medium/trending.yaml +1 -0
  515. package/src/adapters/meituan/search.yaml +1 -0
  516. package/src/adapters/mubu/list.yaml +1 -0
  517. package/src/adapters/mubu/search.yaml +1 -0
  518. package/src/adapters/netease-music/hot.yaml +1 -0
  519. package/src/adapters/netease-music/search.yaml +1 -0
  520. package/src/adapters/netease-music/top.yaml +1 -0
  521. package/src/adapters/notion/search.yaml +1 -0
  522. package/src/adapters/npm/package.test.ts +53 -0
  523. package/src/adapters/npm/package.ts +177 -0
  524. package/src/adapters/npm-trends/trending.yaml +1 -0
  525. package/src/adapters/nuget/info.yaml +41 -0
  526. package/src/adapters/nuget/package.test.ts +102 -0
  527. package/src/adapters/nuget/package.ts +193 -0
  528. package/src/adapters/nuget/search.yaml +43 -0
  529. package/src/adapters/nvd/cve.test.ts +66 -0
  530. package/src/adapters/nvd/cve.ts +182 -0
  531. package/src/adapters/nytimes/search.yaml +1 -0
  532. package/src/adapters/nytimes/top.yaml +1 -0
  533. package/src/adapters/obs/stream-start.yaml +1 -0
  534. package/src/adapters/obs/stream-stop.yaml +1 -0
  535. package/src/adapters/obsidian/search.yaml +1 -0
  536. package/src/adapters/oeis/sequences.test.ts +71 -0
  537. package/src/adapters/oeis/sequences.ts +234 -0
  538. package/src/adapters/ollama/list.yaml +1 -0
  539. package/src/adapters/openalex/works.test.ts +99 -0
  540. package/src/adapters/openalex/works.ts +319 -0
  541. package/src/adapters/openfda/records.test.ts +90 -0
  542. package/src/adapters/openfda/records.ts +239 -0
  543. package/src/adapters/openreview/papers.test.ts +139 -0
  544. package/src/adapters/openreview/papers.ts +560 -0
  545. package/src/adapters/openrouter/search.yaml +1 -0
  546. package/src/adapters/osv/security.test.ts +91 -0
  547. package/src/adapters/osv/security.ts +298 -0
  548. package/src/adapters/packagist/info.yaml +34 -0
  549. package/src/adapters/packagist/package.test.ts +62 -0
  550. package/src/adapters/packagist/package.ts +146 -0
  551. package/src/adapters/packagist/search.yaml +41 -0
  552. package/src/adapters/pexels/search.yaml +1 -0
  553. package/src/adapters/pinduoduo/hot.yaml +1 -0
  554. package/src/adapters/pinduoduo/search.yaml +1 -0
  555. package/src/adapters/powerpoint/list.yaml +1 -0
  556. package/src/adapters/producthunt/browse.yaml +1 -0
  557. package/src/adapters/producthunt/hot.yaml +1 -0
  558. package/src/adapters/producthunt/search.yaml +1 -0
  559. package/src/adapters/pub-dev/info.yaml +34 -0
  560. package/src/adapters/pub-dev/search.yaml +43 -0
  561. package/src/adapters/pubmed/articles.test.ts +96 -0
  562. package/src/adapters/pubmed/articles.ts +497 -0
  563. package/src/adapters/pypi/package.test.ts +131 -0
  564. package/src/adapters/pypi/package.ts +297 -0
  565. package/src/adapters/quark/search.yaml +1 -0
  566. package/src/adapters/qwen/web.test.ts +176 -0
  567. package/src/adapters/qwen/web.ts +758 -0
  568. package/src/adapters/reddit/account.test.ts +56 -0
  569. package/src/adapters/reddit/account.ts +493 -0
  570. package/src/adapters/rednote/web.test.ts +354 -0
  571. package/src/adapters/rednote/web.ts +968 -0
  572. package/src/adapters/replicate/search.yaml +1 -0
  573. package/src/adapters/replicate/trending.yaml +1 -0
  574. package/src/adapters/rest-countries/countries.test.ts +80 -0
  575. package/src/adapters/rest-countries/countries.ts +271 -0
  576. package/src/adapters/reuters/article-detail.test.ts +65 -0
  577. package/src/adapters/reuters/article-detail.ts +186 -0
  578. package/src/adapters/reuters/search.yaml +1 -0
  579. package/src/adapters/reuters/top.yaml +1 -0
  580. package/src/adapters/rfc/rfc.test.ts +37 -0
  581. package/src/adapters/rfc/rfc.ts +133 -0
  582. package/src/adapters/rubygems/gem.test.ts +43 -0
  583. package/src/adapters/rubygems/gem.ts +126 -0
  584. package/src/adapters/rubygems/info.yaml +27 -0
  585. package/src/adapters/rubygems/search.yaml +39 -0
  586. package/src/adapters/sinablog/hot.yaml +1 -0
  587. package/src/adapters/sinablog/search.yaml +1 -0
  588. package/src/adapters/slack/search.yaml +1 -0
  589. package/src/adapters/smzdm/hot.yaml +1 -0
  590. package/src/adapters/smzdm/search.yaml +1 -0
  591. package/src/adapters/spotify/search.yaml +1 -0
  592. package/src/adapters/spotify/top-tracks.yaml +1 -0
  593. package/src/adapters/sspai/hot.yaml +1 -0
  594. package/src/adapters/stackoverflow/hot.yaml +1 -0
  595. package/src/adapters/stackoverflow/questions.test.ts +207 -0
  596. package/src/adapters/stackoverflow/questions.ts +765 -0
  597. package/src/adapters/stackoverflow/search.yaml +1 -0
  598. package/src/adapters/steam/app.test.ts +68 -0
  599. package/src/adapters/steam/app.ts +218 -0
  600. package/src/adapters/steam/new-releases.yaml +1 -0
  601. package/src/adapters/steam/search.yaml +1 -0
  602. package/src/adapters/steam/top-sellers.yaml +1 -0
  603. package/src/adapters/substack/feed.yaml +1 -0
  604. package/src/adapters/substack/search.yaml +1 -0
  605. package/src/adapters/substack/trending.yaml +1 -0
  606. package/src/adapters/taobao/hot.yaml +1 -0
  607. package/src/adapters/taobao/search.yaml +1 -0
  608. package/src/adapters/techcrunch/search.yaml +1 -0
  609. package/src/adapters/theverge/search.yaml +1 -0
  610. package/src/adapters/threads/hot.yaml +1 -0
  611. package/src/adapters/threads/search.yaml +1 -0
  612. package/src/adapters/tiktok/creator-videos.test.ts +158 -0
  613. package/src/adapters/tiktok/creator-videos.ts +370 -0
  614. package/src/adapters/tiktok/search.yaml +1 -0
  615. package/src/adapters/tiktok/trending.yaml +1 -0
  616. package/src/adapters/toutiao/hot.yaml +1 -0
  617. package/src/adapters/toutiao/search.yaml +1 -0
  618. package/src/adapters/tvmaze/shows.test.ts +93 -0
  619. package/src/adapters/tvmaze/shows.ts +271 -0
  620. package/src/adapters/twitch/search.yaml +1 -0
  621. package/src/adapters/twitch/top.yaml +1 -0
  622. package/src/adapters/twitter/bookmark-folders.test.ts +164 -0
  623. package/src/adapters/twitter/bookmark-folders.ts +366 -0
  624. package/src/adapters/twitter/quote.test.ts +157 -0
  625. package/src/adapters/twitter/quote.ts +332 -0
  626. package/src/adapters/twitter/tweet-actions.test.ts +51 -0
  627. package/src/adapters/twitter/tweet-actions.ts +187 -0
  628. package/src/adapters/twitter/tweet-url.ts +65 -0
  629. package/src/adapters/uisdc/news.test.ts +46 -0
  630. package/src/adapters/uisdc/news.ts +111 -0
  631. package/src/adapters/unsplash/search.yaml +1 -0
  632. package/src/adapters/v2ex/hot.yaml +1 -0
  633. package/src/adapters/v2ex/search.yaml +1 -0
  634. package/src/adapters/vercel/list.yaml +1 -0
  635. package/src/adapters/wechat-channels/hot.yaml +1 -0
  636. package/src/adapters/wechat-channels/search.yaml +1 -0
  637. package/src/adapters/weibo/favorites-publish.test.ts +177 -0
  638. package/src/adapters/weibo/favorites-publish.ts +426 -0
  639. package/src/adapters/weibo/feed.yaml +1 -0
  640. package/src/adapters/weibo/hot.yaml +1 -0
  641. package/src/adapters/weibo/search.yaml +1 -0
  642. package/src/adapters/weibo/timeline.yaml +1 -0
  643. package/src/adapters/weibo/trending.yaml +1 -0
  644. package/src/adapters/weixin/hot.yaml +1 -0
  645. package/src/adapters/weixin/search.yaml +1 -0
  646. package/src/adapters/weread/search.yaml +1 -0
  647. package/src/adapters/wikidata/entities.test.ts +103 -0
  648. package/src/adapters/wikidata/entities.ts +253 -0
  649. package/src/adapters/wikipedia/page.test.ts +49 -0
  650. package/src/adapters/wikipedia/page.ts +158 -0
  651. package/src/adapters/wikipedia/search.yaml +1 -0
  652. package/src/adapters/wikipedia/trending.yaml +1 -0
  653. package/src/adapters/wrangler/list.yaml +1 -0
  654. package/src/adapters/wttr/weather.test.ts +99 -0
  655. package/src/adapters/wttr/weather.ts +239 -0
  656. package/src/adapters/xianyu/publish.test.ts +210 -0
  657. package/src/adapters/xianyu/publish.ts +420 -0
  658. package/src/adapters/xiaohongshu/feed.yaml +1 -0
  659. package/src/adapters/xiaohongshu/hot.yaml +1 -0
  660. package/src/adapters/xiaohongshu/trending.yaml +1 -0
  661. package/src/adapters/xiaohongshu/user-helpers.ts +5 -2
  662. package/src/adapters/xueqiu/feed.yaml +1 -0
  663. package/src/adapters/xueqiu/hot-stock.yaml +1 -0
  664. package/src/adapters/xueqiu/hot.yaml +1 -0
  665. package/src/adapters/xueqiu/search.yaml +1 -0
  666. package/src/adapters/yahoo-finance/search.yaml +1 -0
  667. package/src/adapters/yahoo-finance/trending.yaml +1 -0
  668. package/src/adapters/youtube/trending.yaml +1 -0
  669. package/src/adapters/yuanbao/new.yaml +1 -0
  670. package/src/adapters/yuanbao/web.test.ts +144 -0
  671. package/src/adapters/yuanbao/web.ts +435 -0
  672. package/src/adapters/zhihu/collection.test.ts +96 -0
  673. package/src/adapters/zhihu/collection.ts +239 -0
  674. package/src/adapters/zhihu/feed.yaml +1 -0
  675. package/src/adapters/zhihu/hot.yaml +1 -0
  676. package/src/adapters/zhihu/search.yaml +1 -0
  677. package/src/adapters/zhihu/trending.yaml +1 -0
  678. package/src/adapters/zlibrary/web.test.ts +104 -0
  679. package/src/adapters/zlibrary/web.ts +192 -0
  680. package/src/adapters/zotero/search.yaml +1 -0
  681. package/src/adapters/zsxq/search.yaml +1 -0
  682. package/dist/commands/browser-adapter-authoring.d.ts +0 -3
  683. package/dist/commands/browser-adapter-authoring.d.ts.map +0 -1
  684. package/dist/commands/browser-adapter-authoring.js.map +0 -1
  685. package/dist/commands/browser-authoring-operator.d.ts +0 -3
  686. package/dist/commands/browser-authoring-operator.d.ts.map +0 -1
  687. package/dist/commands/browser-authoring-operator.js.map +0 -1
  688. package/dist/commands/browser-operator-runtime.d.ts.map +0 -1
  689. package/dist/commands/browser-operator-runtime.js.map +0 -1
  690. package/dist/commands/browser-operator.d.ts +0 -6
  691. package/dist/commands/browser-operator.d.ts.map +0 -1
  692. package/dist/commands/browser-operator.js.map +0 -1
  693. package/dist/commands/browser.d.ts +0 -11
  694. package/dist/commands/browser.d.ts.map +0 -1
  695. package/dist/commands/browser.js.map +0 -1
  696. package/dist/mcp/sse-transport.d.ts +0 -34
  697. package/dist/mcp/sse-transport.d.ts.map +0 -1
  698. package/dist/mcp/sse-transport.js +0 -182
  699. package/dist/mcp/sse-transport.js.map +0 -1
@@ -4,6 +4,7 @@ description: 36Kr hot/trending articles
4
4
  domain: 36kr.com
5
5
  type: web-api
6
6
  strategy: public
7
+ lint_listing_detail: skip
7
8
 
8
9
  args:
9
10
  limit:
@@ -4,6 +4,7 @@ description: Search 36Kr articles
4
4
  domain: 36kr.com
5
5
  type: web-api
6
6
  strategy: public
7
+ lint_listing_detail: skip
7
8
 
8
9
  args:
9
10
  query:
@@ -0,0 +1,12 @@
1
+ # Archived Adapters
2
+
3
+ These adapters are preserved for provenance but are outside active discovery.
4
+ The loader, manifest builder, conformance report, and quarantine repair list
5
+ skip underscore-prefixed adapter directories.
6
+
7
+ | Site | Commands | Archived on | Replacement |
8
+ | ----------- | ----------- | ----------- | ----------------------------------------------------------------------- |
9
+ | apple-music | rate-album | 2026-05-06 | `unicli macos music-now`; `unicli macos music-control <action>` |
10
+ | az | account | 2026-05-06 | `az account list --output json` through external CLI passthrough |
11
+ | ctrip | hot, search | 2026-05-06 | `unicli web read` or browser/CUA against an authenticated Ctrip session |
12
+ | gcloud | projects | 2026-05-06 | `gcloud projects list --format=json` through external CLI passthrough |
@@ -1,14 +1,8 @@
1
- # AX-first demo with CUA fallback — rate the current Apple Music album.
2
- #
3
- # Strategy:
4
- # 1. desktop-ax → launch and focus Music
5
- # 2. desktop-ax → open the "Album" AppleScript menu (cheap & exact)
6
- # 3. cua → take a screenshot so the VLM can verify the stars
7
- # UI is visible before we click it
8
- # 4. cua → click the star coordinate (caller-provided)
9
- #
10
- # Real UI coordinates vary by screen size — callers either pass x/y or
11
- # let the pipeline use the VLM snapshot to locate the stars themselves.
1
+ # @owner src/adapters/_archived/apple-music/rate-album.yaml
2
+ # @does Preserve the archived Apple Music CUA rating demo outside active discovery.
3
+ # @needs macOS Music app, desktop AX transport, CUA backend, caller-provided star coordinates
4
+ # @feeds src/adapters/_archived/archive.json provenance, historical adapter review
5
+ # @breaks Moving back under an active site would reintroduce an archive-only discovered site.
12
6
  site: apple-music
13
7
  name: rate-album
14
8
  description: Rate the currently-playing Apple Music album via AX menu + CUA click
@@ -56,7 +50,6 @@ pipeline:
56
50
 
57
51
  columns: [backend, stars]
58
52
 
59
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
60
53
  capabilities:
61
54
  [
62
55
  "cua.ask",
@@ -0,0 +1,44 @@
1
+ {
2
+ "archived_on": "2026-05-06",
3
+ "reason": "Feature 3.2 dead-site archive: each listed site had zero active commands and only quarantined adapters.",
4
+ "sites": [
5
+ {
6
+ "site": "apple-music",
7
+ "commands": ["rate-album"],
8
+ "original_paths": ["src/adapters/apple-music/rate-album.yaml"],
9
+ "archived_paths": ["src/adapters/_archived/apple-music/rate-album.yaml"],
10
+ "reason": "Host-app CUA demo requires the macOS Music app and a CUA backend; active Apple Music controls remain under the macos adapter.",
11
+ "replacement": "unicli macos music-now; unicli macos music-control <action>"
12
+ },
13
+ {
14
+ "site": "az",
15
+ "commands": ["account"],
16
+ "original_paths": ["src/adapters/az/account.yaml"],
17
+ "archived_paths": ["src/adapters/_archived/az/account.yaml"],
18
+ "reason": "Dedicated Azure account adapter cannot run in CI without interactive az login; az remains available through external CLI passthrough when installed.",
19
+ "replacement": "az account list --output json"
20
+ },
21
+ {
22
+ "site": "ctrip",
23
+ "commands": ["hot", "search"],
24
+ "original_paths": [
25
+ "src/adapters/ctrip/hot.yaml",
26
+ "src/adapters/ctrip/search.yaml"
27
+ ],
28
+ "archived_paths": [
29
+ "src/adapters/_archived/ctrip/hot.yaml",
30
+ "src/adapters/_archived/ctrip/search.yaml"
31
+ ],
32
+ "reason": "Public Ctrip endpoints were verified broken or CAPTCHA-gated on 2026-05-05, with no stable public replacement captured.",
33
+ "replacement": "Use the web adapter or browser/CUA flow against an authenticated Ctrip session."
34
+ },
35
+ {
36
+ "site": "gcloud",
37
+ "commands": ["projects"],
38
+ "original_paths": ["src/adapters/gcloud/projects.yaml"],
39
+ "archived_paths": ["src/adapters/_archived/gcloud/projects.yaml"],
40
+ "reason": "Dedicated Google Cloud projects adapter cannot run in CI without interactive gcloud auth; gcloud remains available through external CLI passthrough when installed.",
41
+ "replacement": "gcloud projects list --format=json"
42
+ }
43
+ ]
44
+ }
@@ -1,3 +1,8 @@
1
+ # @owner src/adapters/_archived/az/account.yaml
2
+ # @does Preserve the archived Azure account-list adapter outside active discovery.
3
+ # @needs Azure CLI installed and authenticated with az login
4
+ # @feeds src/adapters/_archived/archive.json provenance, historical adapter review
5
+ # @breaks Moving back under an active site would reintroduce an archive-only discovered site.
1
6
  site: az
2
7
  name: account
3
8
  description: List Azure subscriptions
@@ -20,7 +25,6 @@ pipeline:
20
25
 
21
26
  columns: [name, id, state, isDefault]
22
27
 
23
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
24
28
  capabilities: ["subprocess.exec"]
25
29
  minimum_capability: subprocess.exec
26
30
  trust: user
@@ -1,3 +1,8 @@
1
+ # @owner src/adapters/_archived/ctrip/hot.yaml
2
+ # @does Preserve the archived Ctrip hot-destination adapter outside active discovery.
3
+ # @needs Historical m.ctrip.com hotcity endpoint
4
+ # @feeds src/adapters/_archived/archive.json provenance, historical adapter review
5
+ # @breaks Moving back under an active site would reintroduce an archive-only discovered site.
1
6
  site: ctrip
2
7
  name: hot
3
8
  description: Ctrip popular travel destinations
@@ -27,7 +32,6 @@ pipeline:
27
32
 
28
33
  columns: [rank, name, type]
29
34
 
30
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
31
35
  capabilities: ["http.fetch"]
32
36
  minimum_capability: http.fetch
33
37
  trust: public
@@ -1,3 +1,8 @@
1
+ # @owner src/adapters/_archived/ctrip/search.yaml
2
+ # @does Preserve the archived Ctrip flight-search adapter outside active discovery.
3
+ # @needs Historical flights.ctrip.com batchSearch endpoint without CAPTCHA
4
+ # @feeds src/adapters/_archived/archive.json provenance, historical adapter review
5
+ # @breaks Moving back under an active site would reintroduce an archive-only discovered site.
1
6
  site: ctrip
2
7
  name: search
3
8
  description: Search flights on Ctrip
@@ -52,11 +57,10 @@ args:
52
57
 
53
58
  columns: [airline, flight, depart, arrive, price]
54
59
 
55
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
56
60
  capabilities: ["http.fetch"]
57
61
  minimum_capability: http.fetch
58
62
  trust: public
59
63
  confidentiality: public
60
64
  quarantine: true
61
- quarantineReason: "flights.ctrip.com search endpoint now requires CAPTCHA (showAuthCode=true on every public hit, verified 2026-05-05) needs cookie/UI strategy with anti-bot solve"
65
+ quarantineReason: "flights.ctrip.com search endpoint now requires CAPTCHA (showAuthCode=true on every public hit, verified 2026-05-05) - needs cookie/UI strategy with anti-bot solve"
62
66
  schema_version: v2
@@ -1,3 +1,8 @@
1
+ # @owner src/adapters/_archived/gcloud/projects.yaml
2
+ # @does Preserve the archived Google Cloud projects adapter outside active discovery.
3
+ # @needs Google Cloud CLI installed and authenticated with gcloud auth login
4
+ # @feeds src/adapters/_archived/archive.json provenance, historical adapter review
5
+ # @breaks Moving back under an active site would reintroduce an archive-only discovered site.
1
6
  site: gcloud
2
7
  name: projects
3
8
  description: List Google Cloud projects
@@ -18,7 +23,6 @@ pipeline:
18
23
 
19
24
  columns: [projectId, name, projectNumber, lifecycleState]
20
25
 
21
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
22
26
  capabilities: ["subprocess.exec"]
23
27
  minimum_capability: subprocess.exec
24
28
  trust: user
@@ -0,0 +1,42 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildExtractAibaseNewsJs,
4
+ mapAibaseNewsPayload,
5
+ requireNewsLimit,
6
+ } from "./news.js";
7
+
8
+ describe("aibase agent-facing news command", () => {
9
+ it("validates limits and exposes selector extraction code", () => {
10
+ expect(requireNewsLimit(undefined)).toBe(20);
11
+ expect(requireNewsLimit("50")).toBe(50);
12
+ expect(() => requireNewsLimit("0")).toThrow("limit must be");
13
+ expect(buildExtractAibaseNewsJs()).toContain("/zh/daily/");
14
+ });
15
+
16
+ it("maps extracted rows and rejects selector drift", () => {
17
+ expect(
18
+ mapAibaseNewsPayload(
19
+ {
20
+ ok: true,
21
+ rows: [
22
+ { title: " AI news ", url: " https://www.aibase.com/zh/daily/1 " },
23
+ { title: "", url: "https://example.test/empty" },
24
+ ],
25
+ },
26
+ 10,
27
+ ),
28
+ ).toEqual([
29
+ {
30
+ rank: 1,
31
+ title: "AI news",
32
+ url: "https://www.aibase.com/zh/daily/1",
33
+ },
34
+ ]);
35
+ expect(() =>
36
+ mapAibaseNewsPayload({ ok: false, reason: "selector-missing" }, 10),
37
+ ).toThrow("selector drift");
38
+ expect(() => mapAibaseNewsPayload({ ok: true, rows: [] }, 10)).toThrow(
39
+ "no article rows",
40
+ );
41
+ });
42
+ });
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @owner src/adapters/aibase/news.ts
3
+ * @does Register agent-facing AIbase daily-news browser extraction command.
4
+ * @needs Public AIbase daily page, browser runtime, selector-drift error reporting.
5
+ * @feeds surface coverage ledger, AI news discovery, Chinese AI daily brief surface.
6
+ * @breaks AIbase DOM drift or silent empty extraction hides news coverage failures.
7
+ */
8
+
9
+ import { cli, Strategy } from "../../registry.js";
10
+ import type { IPage } from "../../types.js";
11
+
12
+ const AIBASE_DAILY_URL = "https://www.aibase.com/zh/daily";
13
+
14
+ function normalizeText(value: unknown): string {
15
+ return String(value ?? "")
16
+ .replace(/\s+/g, " ")
17
+ .trim();
18
+ }
19
+
20
+ export function requireNewsLimit(value: unknown, fallback = 20): number {
21
+ if (value === undefined || value === null || value === "") return fallback;
22
+ const n = Number(value);
23
+ if (!Number.isInteger(n) || n < 1 || n > 50) {
24
+ throw new Error("limit must be an integer in [1, 50].");
25
+ }
26
+ return n;
27
+ }
28
+
29
+ export function buildExtractAibaseNewsJs(): string {
30
+ return `
31
+ (() => {
32
+ const anchors = Array.from(document.querySelectorAll('.bg-white .grid a[href], a[href*="/zh/daily/"]'))
33
+ .filter((anchor) => {
34
+ const href = anchor.getAttribute('href') || '';
35
+ const text = (anchor.innerText || anchor.textContent || '').trim();
36
+ return text && href && !href.endsWith('/zh/daily') && !href.endsWith('/zh/daily/');
37
+ });
38
+ if (anchors.length === 0) {
39
+ return {
40
+ ok: false,
41
+ reason: 'selector-missing',
42
+ title: document.title || '',
43
+ bodyText: (document.body?.innerText || document.body?.textContent || '').slice(0, 500),
44
+ };
45
+ }
46
+ const seen = new Set();
47
+ const rows = [];
48
+ for (const anchor of anchors) {
49
+ const url = new URL(anchor.getAttribute('href'), location.href).href;
50
+ if (seen.has(url)) continue;
51
+ seen.add(url);
52
+ rows.push({
53
+ title: anchor.innerText || anchor.textContent || '',
54
+ url,
55
+ });
56
+ }
57
+ return { ok: true, rows };
58
+ })()
59
+ `;
60
+ }
61
+
62
+ interface BrowserExtractPayload {
63
+ ok?: unknown;
64
+ reason?: unknown;
65
+ title?: unknown;
66
+ rows?: Array<{ title?: unknown; url?: unknown }>;
67
+ }
68
+
69
+ export function mapAibaseNewsPayload(
70
+ payload: BrowserExtractPayload,
71
+ limit: number,
72
+ ): Array<Record<string, unknown>> {
73
+ if (!payload || typeof payload !== "object") {
74
+ throw new Error("AIbase daily page returned an unreadable payload.");
75
+ }
76
+ if (payload.ok !== true) {
77
+ const reason = normalizeText(payload.reason) || "selector-drift";
78
+ const title = normalizeText(payload.title);
79
+ throw new Error(
80
+ `AIbase daily selector drift: ${reason}${title ? ` (${title})` : ""}`,
81
+ );
82
+ }
83
+ const rows = (Array.isArray(payload.rows) ? payload.rows : [])
84
+ .map((row, index) => ({
85
+ rank: index + 1,
86
+ title: normalizeText(row.title),
87
+ url: normalizeText(row.url),
88
+ }))
89
+ .filter((row) => row.title && row.url);
90
+ if (rows.length === 0) {
91
+ throw new Error(
92
+ "AIbase daily page loaded, but no article rows were extracted.",
93
+ );
94
+ }
95
+ return rows
96
+ .slice(0, limit)
97
+ .map((row, index) => ({ ...row, rank: index + 1 }));
98
+ }
99
+
100
+ cli({
101
+ site: "aibase",
102
+ name: "news",
103
+ description: "AIbase daily AI industry news",
104
+ domain: "www.aibase.com",
105
+ strategy: Strategy.PUBLIC,
106
+ browser: true,
107
+ args: [{ name: "limit", type: "int", default: 20, description: "Max rows" }],
108
+ columns: ["rank", "title", "url"],
109
+ func: async (page, kwargs) => {
110
+ const p = page as IPage;
111
+ const limit = requireNewsLimit(kwargs.limit);
112
+ await p.goto(AIBASE_DAILY_URL, { waitUntil: "load", settleMs: 3000 });
113
+ const payload = (await p.evaluate(
114
+ buildExtractAibaseNewsJs(),
115
+ )) as BrowserExtractPayload;
116
+ return mapAibaseNewsPayload(payload, limit);
117
+ },
118
+ });
@@ -3,6 +3,7 @@ name: new-releases
3
3
  description: Amazon New Releases ranking
4
4
  domain: www.amazon.com
5
5
  strategy: intercept
6
+ lint_listing_detail: skip
6
7
  browser: true
7
8
 
8
9
  args:
@@ -3,6 +3,7 @@ name: search
3
3
  description: Search Amazon products
4
4
  domain: www.amazon.com
5
5
  strategy: intercept
6
+ lint_listing_detail: skip
6
7
  browser: true
7
8
 
8
9
  args:
@@ -4,6 +4,7 @@ description: Search Apple Podcasts
4
4
  domain: itunes.apple.com
5
5
  type: web-api
6
6
  strategy: public
7
+ lint_listing_detail: skip
7
8
 
8
9
  args:
9
10
  query:
@@ -4,6 +4,7 @@ description: Top podcasts chart on Apple Podcasts
4
4
  domain: rss.marketingtools.apple.com
5
5
  type: web-api
6
6
  strategy: public
7
+ lint_listing_detail: skip
7
8
 
8
9
  args:
9
10
  limit:
@@ -0,0 +1,59 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ decodeArxivEntities,
4
+ parseArxivEntries,
5
+ requireArxivAuthor,
6
+ requireArxivCategory,
7
+ requireArxivLimit,
8
+ } from "./papers.js";
9
+
10
+ describe("arxiv agent-facing author and recent commands", () => {
11
+ it("validates author, category, and limit inputs", () => {
12
+ expect(requireArxivAuthor(" Yoshua Bengio ")).toBe("Yoshua Bengio");
13
+ expect(() => requireArxivAuthor("")).toThrow("cannot be empty");
14
+ expect(requireArxivCategory("cs.CL")).toBe("cs.CL");
15
+ expect(requireArxivCategory("q-bio.NC")).toBe("q-bio.NC");
16
+ expect(() => requireArxivCategory("../cs.CL")).toThrow("Invalid arXiv");
17
+ expect(requireArxivLimit(undefined, 20)).toBe(20);
18
+ expect(requireArxivLimit("50", 20)).toBe(50);
19
+ expect(() => requireArxivLimit("51", 20)).toThrow("arxiv limit");
20
+ });
21
+
22
+ it("decodes entities and parses Atom entries", () => {
23
+ expect(decodeArxivEntities("A &amp; B &lt; C")).toBe("A & B < C");
24
+ expect(
25
+ parseArxivEntries(`
26
+ <feed>
27
+ <entry>
28
+ <id>http://arxiv.org/abs/1706.03762v7</id>
29
+ <title> Attention Is All You Need </title>
30
+ <summary> We present transformers. </summary>
31
+ <published>2017-06-12T17:57:34Z</published>
32
+ <updated>2023-08-02T00:00:00Z</updated>
33
+ <author><name>Alice &amp; Bob</name></author>
34
+ <author><name>Carol</name></author>
35
+ <arxiv:primary_category term="cs.CL" />
36
+ <category term="cs.CL" />
37
+ <category term="cs.LG" />
38
+ <arxiv:comment>15 pages</arxiv:comment>
39
+ <link title="pdf" href="https://arxiv.org/pdf/1706.03762" rel="related" />
40
+ </entry>
41
+ </feed>
42
+ `),
43
+ ).toEqual([
44
+ {
45
+ id: "1706.03762",
46
+ title: "Attention Is All You Need",
47
+ authors: "Alice & Bob, Carol",
48
+ abstract: "We present transformers.",
49
+ published: "2017-06-12",
50
+ updated: "2023-08-02",
51
+ primary_category: "cs.CL",
52
+ categories: "cs.CL, cs.LG",
53
+ comment: "15 pages",
54
+ pdf: "https://arxiv.org/pdf/1706.03762",
55
+ url: "https://arxiv.org/abs/1706.03762",
56
+ },
57
+ ]);
58
+ });
59
+ });
@@ -0,0 +1,226 @@
1
+ /**
2
+ * @owner src/adapters/arxiv/papers.ts
3
+ * @does Register agent-facing arXiv author and recent category commands.
4
+ * @needs export.arxiv.org Atom API, category validation, conservative XML parsing.
5
+ * @feeds surface coverage ledger, scholarly search workflow, arXiv category monitoring.
6
+ * @breaks arXiv Atom shape drift, weak category parsing, or silent empty feeds hide paper discovery failures.
7
+ */
8
+
9
+ import { cli, Strategy } from "../../registry.js";
10
+
11
+ const ARXIV_BASE = "https://export.arxiv.org/api/query";
12
+ const CATEGORY_RE = /^[a-z]+(?:-[a-z]+)*(?:\.[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*)?$/;
13
+
14
+ interface ArxivEntry {
15
+ id: string;
16
+ title: string;
17
+ authors: string;
18
+ abstract: string;
19
+ published: string;
20
+ updated: string;
21
+ primary_category: string;
22
+ categories: string;
23
+ comment: string;
24
+ pdf: string;
25
+ url: string;
26
+ }
27
+
28
+ export function requireArxivLimit(
29
+ value: unknown,
30
+ fallback: number,
31
+ max = 50,
32
+ ): number {
33
+ if (value === undefined || value === null || value === "") return fallback;
34
+ const n = Number(value);
35
+ if (!Number.isInteger(n) || n < 1 || n > max) {
36
+ throw new Error(`arxiv limit must be an integer in [1, ${max}].`);
37
+ }
38
+ return n;
39
+ }
40
+
41
+ export function requireArxivAuthor(value: unknown): string {
42
+ const author = String(value ?? "").trim();
43
+ if (!author) throw new Error("arxiv author cannot be empty.");
44
+ return author;
45
+ }
46
+
47
+ export function requireArxivCategory(value: unknown): string {
48
+ const category = String(value ?? "").trim();
49
+ if (!CATEGORY_RE.test(category)) {
50
+ throw new Error(`Invalid arXiv category "${String(value)}".`);
51
+ }
52
+ return category;
53
+ }
54
+
55
+ export function decodeArxivEntities(value: string): string {
56
+ return value
57
+ .replace(/&amp;/g, "&")
58
+ .replace(/&lt;/g, "<")
59
+ .replace(/&gt;/g, ">")
60
+ .replace(/&quot;/g, '"')
61
+ .replace(/&apos;/g, "'")
62
+ .replace(/&#39;/g, "'");
63
+ }
64
+
65
+ function extractFirst(xml: string, tag: string): string {
66
+ const match = xml.match(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`));
67
+ return match ? match[1].trim() : "";
68
+ }
69
+
70
+ function extractAll(xml: string, tag: string): string[] {
71
+ const out: string[] = [];
72
+ const re = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`, "g");
73
+ let match: RegExpExecArray | null;
74
+ while ((match = re.exec(xml)) !== null) out.push(match[1].trim());
75
+ return out;
76
+ }
77
+
78
+ function extractAttr(xml: string, tag: string, attr: string): string {
79
+ const match = xml.match(new RegExp(`<${tag}\\b[^>]*?\\b${attr}="([^"]*)"`));
80
+ return match ? match[1] : "";
81
+ }
82
+
83
+ function extractAllAttr(xml: string, tag: string, attr: string): string[] {
84
+ const out: string[] = [];
85
+ const re = new RegExp(`<${tag}\\b[^>]*?\\b${attr}="([^"]*)"`, "g");
86
+ let match: RegExpExecArray | null;
87
+ while ((match = re.exec(xml)) !== null) out.push(match[1]);
88
+ return out;
89
+ }
90
+
91
+ function findLinkHref(xml: string, rel: string): string {
92
+ const re = /<link\b([^>]*)\/?>/g;
93
+ let match: RegExpExecArray | null;
94
+ while ((match = re.exec(xml)) !== null) {
95
+ const attrs = match[1];
96
+ if (!new RegExp(`\\brel="${rel}"`).test(attrs)) continue;
97
+ const href = attrs.match(/\bhref="([^"]*)"/);
98
+ if (href) return href[1];
99
+ }
100
+ return "";
101
+ }
102
+
103
+ export function parseArxivEntries(xml: string): ArxivEntry[] {
104
+ const out: ArxivEntry[] = [];
105
+ const re = /<entry>([\s\S]*?)<\/entry>/g;
106
+ let match: RegExpExecArray | null;
107
+ while ((match = re.exec(xml)) !== null) {
108
+ const entry = match[1];
109
+ const rawId = extractFirst(entry, "id");
110
+ const id = rawId
111
+ .replace(/^https?:\/\/arxiv\.org\/abs\//, "")
112
+ .replace(/v\d+$/, "");
113
+ const title = decodeArxivEntities(
114
+ extractFirst(entry, "title").replace(/\s+/g, " "),
115
+ ).trim();
116
+ out.push({
117
+ id,
118
+ title,
119
+ authors: decodeArxivEntities(extractAll(entry, "name").join(", ")),
120
+ abstract: decodeArxivEntities(
121
+ extractFirst(entry, "summary").replace(/\s+/g, " "),
122
+ ).trim(),
123
+ published: extractFirst(entry, "published").slice(0, 10),
124
+ updated: extractFirst(entry, "updated").slice(0, 10),
125
+ primary_category: extractAttr(entry, "arxiv:primary_category", "term"),
126
+ categories: extractAllAttr(entry, "category", "term").join(", "),
127
+ comment: decodeArxivEntities(
128
+ extractFirst(entry, "arxiv:comment").replace(/\s+/g, " "),
129
+ ).trim(),
130
+ pdf: findLinkHref(entry, "related") || `https://arxiv.org/pdf/${id}`,
131
+ url: `https://arxiv.org/abs/${id}`,
132
+ });
133
+ }
134
+ return out;
135
+ }
136
+
137
+ async function fetchArxiv(params: URLSearchParams): Promise<string> {
138
+ const response = await fetch(`${ARXIV_BASE}?${params.toString()}`, {
139
+ headers: {
140
+ "User-Agent": "unicli-arxiv/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
141
+ Accept: "application/atom+xml, application/xml, text/xml",
142
+ },
143
+ });
144
+ if (!response.ok)
145
+ throw new Error(`arXiv API returned HTTP ${response.status}.`);
146
+ return response.text();
147
+ }
148
+
149
+ function compactRows(entries: ArxivEntry[]): Array<Record<string, unknown>> {
150
+ return entries.map((entry) => ({
151
+ id: entry.id,
152
+ title: entry.title,
153
+ authors: entry.authors,
154
+ published: entry.published,
155
+ primary_category: entry.primary_category,
156
+ url: entry.url,
157
+ }));
158
+ }
159
+
160
+ cli({
161
+ site: "arxiv",
162
+ name: "author",
163
+ description: "List arXiv papers by a given author",
164
+ domain: "export.arxiv.org",
165
+ strategy: Strategy.PUBLIC,
166
+ args: [
167
+ {
168
+ name: "author",
169
+ type: "str",
170
+ required: true,
171
+ positional: true,
172
+ description: "Author name",
173
+ },
174
+ { name: "limit", type: "int", default: 20, description: "Max papers" },
175
+ ],
176
+ columns: ["id", "title", "authors", "published", "primary_category", "url"],
177
+ func: async (_page, kwargs) => {
178
+ const author = requireArxivAuthor(kwargs.author);
179
+ const limit = requireArxivLimit(kwargs.limit, 20);
180
+ const params = new URLSearchParams({
181
+ search_query: `au:"${author}"`,
182
+ max_results: String(limit),
183
+ sortBy: "submittedDate",
184
+ sortOrder: "descending",
185
+ });
186
+ const rows = compactRows(parseArxivEntries(await fetchArxiv(params)));
187
+ if (rows.length === 0) {
188
+ throw new Error(`No arXiv papers found for author "${author}".`);
189
+ }
190
+ return rows;
191
+ },
192
+ });
193
+
194
+ cli({
195
+ site: "arxiv",
196
+ name: "recent",
197
+ description: "List recent arXiv submissions in a category",
198
+ domain: "export.arxiv.org",
199
+ strategy: Strategy.PUBLIC,
200
+ args: [
201
+ {
202
+ name: "category",
203
+ type: "str",
204
+ required: true,
205
+ positional: true,
206
+ description: "arXiv category",
207
+ },
208
+ { name: "limit", type: "int", default: 10, description: "Max papers" },
209
+ ],
210
+ columns: ["id", "title", "authors", "published", "primary_category", "url"],
211
+ func: async (_page, kwargs) => {
212
+ const category = requireArxivCategory(kwargs.category);
213
+ const limit = requireArxivLimit(kwargs.limit, 10);
214
+ const params = new URLSearchParams({
215
+ search_query: `cat:${category}`,
216
+ max_results: String(limit),
217
+ sortBy: "submittedDate",
218
+ sortOrder: "descending",
219
+ });
220
+ const rows = compactRows(parseArxivEntries(await fetchArxiv(params)));
221
+ if (rows.length === 0) {
222
+ throw new Error(`No recent arXiv papers found in ${category}.`);
223
+ }
224
+ return rows;
225
+ },
226
+ });
@@ -4,6 +4,7 @@ description: Search arXiv papers
4
4
  domain: export.arxiv.org
5
5
  type: web-api
6
6
  strategy: public
7
+ lint_listing_detail: skip
7
8
 
8
9
  args:
9
10
  query: