@jackwener/opencli 1.6.9 → 1.6.10

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 (503) hide show
  1. package/README.md +115 -59
  2. package/README.zh-CN.md +121 -78
  3. package/dist/clis/_shared/common.d.ts +3 -0
  4. package/dist/clis/_shared/common.js +22 -0
  5. package/dist/clis/bilibili/hot.d.ts +1 -0
  6. package/dist/clis/bilibili/hot.js +35 -0
  7. package/dist/clis/bluesky/feeds.d.ts +1 -0
  8. package/dist/clis/bluesky/feeds.js +27 -0
  9. package/dist/clis/bluesky/followers.d.ts +1 -0
  10. package/dist/clis/bluesky/followers.js +27 -0
  11. package/dist/clis/bluesky/following.d.ts +1 -0
  12. package/dist/clis/bluesky/following.js +27 -0
  13. package/dist/clis/bluesky/profile.d.ts +1 -0
  14. package/dist/clis/bluesky/profile.js +29 -0
  15. package/dist/clis/bluesky/search.d.ts +1 -0
  16. package/dist/clis/bluesky/search.js +28 -0
  17. package/dist/clis/bluesky/starter-packs.d.ts +1 -0
  18. package/dist/clis/bluesky/starter-packs.js +28 -0
  19. package/dist/clis/bluesky/thread.d.ts +1 -0
  20. package/dist/clis/bluesky/thread.js +30 -0
  21. package/dist/clis/bluesky/trending.d.ts +1 -0
  22. package/dist/clis/bluesky/trending.js +19 -0
  23. package/dist/clis/bluesky/user.d.ts +1 -0
  24. package/dist/clis/bluesky/user.js +33 -0
  25. package/dist/clis/cnki/search.d.ts +1 -0
  26. package/dist/clis/cnki/search.js +60 -0
  27. package/dist/clis/cnki/search.test.d.ts +1 -0
  28. package/dist/clis/cnki/search.test.js +18 -0
  29. package/dist/clis/devto/tag.d.ts +1 -0
  30. package/dist/clis/devto/tag.js +32 -0
  31. package/dist/clis/devto/top.d.ts +1 -0
  32. package/dist/clis/devto/top.js +26 -0
  33. package/dist/clis/devto/user.d.ts +1 -0
  34. package/dist/clis/devto/user.js +31 -0
  35. package/dist/clis/dictionary/examples.d.ts +1 -0
  36. package/dist/clis/dictionary/examples.js +27 -0
  37. package/dist/clis/dictionary/search.d.ts +1 -0
  38. package/dist/clis/dictionary/search.js +29 -0
  39. package/dist/clis/dictionary/synonyms.d.ts +1 -0
  40. package/dist/clis/dictionary/synonyms.js +27 -0
  41. package/dist/clis/douban/subject.d.ts +1 -0
  42. package/dist/clis/douban/subject.js +118 -0
  43. package/dist/clis/douban/top250.d.ts +1 -0
  44. package/dist/clis/douban/top250.js +67 -0
  45. package/dist/clis/facebook/add-friend.d.ts +1 -0
  46. package/dist/clis/facebook/add-friend.js +43 -0
  47. package/dist/clis/facebook/events.d.ts +1 -0
  48. package/dist/clis/facebook/events.js +40 -0
  49. package/dist/clis/facebook/feed.d.ts +1 -0
  50. package/dist/clis/facebook/feed.js +59 -0
  51. package/dist/clis/facebook/friends.d.ts +1 -0
  52. package/dist/clis/facebook/friends.js +38 -0
  53. package/dist/clis/facebook/groups.d.ts +1 -0
  54. package/dist/clis/facebook/groups.js +46 -0
  55. package/dist/clis/facebook/join-group.d.ts +1 -0
  56. package/dist/clis/facebook/join-group.js +44 -0
  57. package/dist/clis/facebook/memories.d.ts +1 -0
  58. package/dist/clis/facebook/memories.js +35 -0
  59. package/dist/clis/facebook/notifications.d.ts +1 -0
  60. package/dist/clis/facebook/notifications.js +36 -0
  61. package/dist/clis/facebook/profile.d.ts +1 -0
  62. package/dist/clis/facebook/profile.js +37 -0
  63. package/dist/clis/facebook/search.d.ts +1 -0
  64. package/dist/clis/facebook/search.js +38 -0
  65. package/dist/clis/facebook/search.test.d.ts +1 -1
  66. package/dist/clis/facebook/search.test.js +6 -9
  67. package/dist/clis/gitee/index.d.ts +3 -0
  68. package/dist/clis/gitee/index.js +3 -0
  69. package/dist/clis/gitee/search.d.ts +1 -0
  70. package/dist/clis/gitee/search.js +136 -0
  71. package/dist/clis/gitee/trending.d.ts +1 -0
  72. package/dist/clis/gitee/trending.js +567 -0
  73. package/dist/clis/gitee/user.d.ts +1 -0
  74. package/dist/clis/gitee/user.js +199 -0
  75. package/dist/clis/gitee/user.test.d.ts +1 -0
  76. package/dist/clis/gitee/user.test.js +63 -0
  77. package/dist/clis/hackernews/ask.d.ts +1 -0
  78. package/dist/clis/hackernews/ask.js +29 -0
  79. package/dist/clis/hackernews/best.d.ts +1 -0
  80. package/dist/clis/hackernews/best.js +29 -0
  81. package/dist/clis/hackernews/jobs.d.ts +1 -0
  82. package/dist/clis/hackernews/jobs.js +27 -0
  83. package/dist/clis/hackernews/new.d.ts +1 -0
  84. package/dist/clis/hackernews/new.js +29 -0
  85. package/dist/clis/hackernews/search.d.ts +1 -0
  86. package/dist/clis/hackernews/search.js +36 -0
  87. package/dist/clis/hackernews/show.d.ts +1 -0
  88. package/dist/clis/hackernews/show.js +29 -0
  89. package/dist/clis/hackernews/top.d.ts +1 -0
  90. package/dist/clis/hackernews/top.js +29 -0
  91. package/dist/clis/hackernews/user.d.ts +1 -0
  92. package/dist/clis/hackernews/user.js +22 -0
  93. package/dist/clis/hupu/hot.d.ts +1 -0
  94. package/dist/clis/hupu/hot.js +40 -0
  95. package/dist/clis/instagram/comment.d.ts +1 -0
  96. package/dist/clis/instagram/comment.js +47 -0
  97. package/dist/clis/instagram/explore.d.ts +1 -0
  98. package/dist/clis/instagram/explore.js +41 -0
  99. package/dist/clis/instagram/follow.d.ts +1 -0
  100. package/dist/clis/instagram/follow.js +43 -0
  101. package/dist/clis/instagram/followers.d.ts +1 -0
  102. package/dist/clis/instagram/followers.js +45 -0
  103. package/dist/clis/instagram/following.d.ts +1 -0
  104. package/dist/clis/instagram/following.js +45 -0
  105. package/dist/clis/instagram/like.d.ts +1 -0
  106. package/dist/clis/instagram/like.js +45 -0
  107. package/dist/clis/instagram/profile.d.ts +1 -0
  108. package/dist/clis/instagram/profile.js +39 -0
  109. package/dist/clis/instagram/save.d.ts +1 -0
  110. package/dist/clis/instagram/save.js +45 -0
  111. package/dist/clis/instagram/saved.d.ts +1 -0
  112. package/dist/clis/instagram/saved.js +38 -0
  113. package/dist/clis/instagram/search.d.ts +1 -0
  114. package/dist/clis/instagram/search.js +38 -0
  115. package/dist/clis/instagram/unfollow.d.ts +1 -0
  116. package/dist/clis/instagram/unfollow.js +40 -0
  117. package/dist/clis/instagram/unlike.d.ts +1 -0
  118. package/dist/clis/instagram/unlike.js +45 -0
  119. package/dist/clis/instagram/unsave.d.ts +1 -0
  120. package/dist/clis/instagram/unsave.js +45 -0
  121. package/dist/clis/instagram/user.d.ts +1 -0
  122. package/dist/clis/instagram/user.js +48 -0
  123. package/dist/clis/jd/add-cart.d.ts +1 -0
  124. package/dist/clis/jd/add-cart.js +71 -0
  125. package/dist/clis/jd/cart.d.ts +1 -0
  126. package/dist/clis/jd/cart.js +79 -0
  127. package/dist/clis/jd/commands.test.d.ts +5 -0
  128. package/dist/clis/jd/commands.test.js +64 -0
  129. package/dist/clis/jd/detail.d.ts +1 -0
  130. package/dist/clis/jd/detail.js +62 -0
  131. package/dist/clis/jd/reviews.d.ts +1 -0
  132. package/dist/clis/jd/reviews.js +54 -0
  133. package/dist/clis/jd/search.d.ts +1 -0
  134. package/dist/clis/jd/search.js +65 -0
  135. package/dist/clis/jike/post.d.ts +1 -0
  136. package/dist/clis/jike/post.js +61 -0
  137. package/dist/clis/jike/topic.d.ts +1 -0
  138. package/dist/clis/jike/topic.js +51 -0
  139. package/dist/clis/jike/user.d.ts +1 -0
  140. package/dist/clis/jike/user.js +50 -0
  141. package/dist/clis/jimeng/generate.d.ts +1 -0
  142. package/dist/clis/jimeng/generate.js +83 -0
  143. package/dist/clis/jimeng/history.d.ts +1 -0
  144. package/dist/clis/jimeng/history.js +47 -0
  145. package/dist/clis/jimeng/new.d.ts +1 -0
  146. package/dist/clis/jimeng/new.js +43 -0
  147. package/dist/clis/jimeng/workspaces.d.ts +1 -0
  148. package/dist/clis/jimeng/workspaces.js +41 -0
  149. package/dist/clis/linux-do/categories.d.ts +1 -0
  150. package/dist/clis/linux-do/categories.js +65 -0
  151. package/dist/clis/linux-do/search.d.ts +1 -0
  152. package/dist/clis/linux-do/search.js +41 -0
  153. package/dist/clis/linux-do/tags.d.ts +1 -0
  154. package/dist/clis/linux-do/tags.js +39 -0
  155. package/dist/clis/linux-do/topic-content.test.js +5 -5
  156. package/dist/clis/linux-do/topic.d.ts +1 -0
  157. package/dist/clis/linux-do/topic.js +56 -0
  158. package/dist/clis/linux-do/user-posts.d.ts +1 -0
  159. package/dist/clis/linux-do/user-posts.js +61 -0
  160. package/dist/clis/linux-do/user-topics.d.ts +1 -0
  161. package/dist/clis/linux-do/user-topics.js +48 -0
  162. package/dist/clis/lobsters/active.d.ts +1 -0
  163. package/dist/clis/lobsters/active.js +26 -0
  164. package/dist/clis/lobsters/hot.d.ts +1 -0
  165. package/dist/clis/lobsters/hot.js +26 -0
  166. package/dist/clis/lobsters/newest.d.ts +1 -0
  167. package/dist/clis/lobsters/newest.js +26 -0
  168. package/dist/clis/lobsters/tag.d.ts +1 -0
  169. package/dist/clis/lobsters/tag.js +32 -0
  170. package/dist/clis/pixiv/detail.d.ts +1 -0
  171. package/dist/clis/pixiv/detail.js +58 -0
  172. package/dist/clis/pixiv/ranking.d.ts +1 -0
  173. package/dist/clis/pixiv/ranking.js +59 -0
  174. package/dist/clis/pixiv/user.d.ts +1 -0
  175. package/dist/clis/pixiv/user.js +52 -0
  176. package/dist/clis/reddit/frontpage.d.ts +1 -0
  177. package/dist/clis/reddit/frontpage.js +31 -0
  178. package/dist/clis/reddit/hot.d.ts +1 -0
  179. package/dist/clis/reddit/hot.js +45 -0
  180. package/dist/clis/reddit/popular.d.ts +1 -0
  181. package/dist/clis/reddit/popular.js +41 -0
  182. package/dist/clis/reddit/search.d.ts +1 -0
  183. package/dist/clis/reddit/search.js +65 -0
  184. package/dist/clis/reddit/subreddit.d.ts +1 -0
  185. package/dist/clis/reddit/subreddit.js +52 -0
  186. package/dist/clis/reddit/user-comments.d.ts +1 -0
  187. package/dist/clis/reddit/user-comments.js +44 -0
  188. package/dist/clis/reddit/user-posts.d.ts +1 -0
  189. package/dist/clis/reddit/user-posts.js +42 -0
  190. package/dist/clis/reddit/user.d.ts +1 -0
  191. package/dist/clis/reddit/user.js +37 -0
  192. package/dist/clis/stackoverflow/bounties.d.ts +1 -0
  193. package/dist/clis/stackoverflow/bounties.js +27 -0
  194. package/dist/clis/stackoverflow/hot.d.ts +1 -0
  195. package/dist/clis/stackoverflow/hot.js +24 -0
  196. package/dist/clis/stackoverflow/search.d.ts +1 -0
  197. package/dist/clis/stackoverflow/search.js +27 -0
  198. package/dist/clis/stackoverflow/unanswered.d.ts +1 -0
  199. package/dist/clis/stackoverflow/unanswered.js +26 -0
  200. package/dist/clis/steam/top-sellers.d.ts +1 -0
  201. package/dist/clis/steam/top-sellers.js +25 -0
  202. package/dist/clis/taobao/add-cart.d.ts +1 -0
  203. package/dist/clis/taobao/add-cart.js +149 -0
  204. package/dist/clis/taobao/cart.d.ts +1 -0
  205. package/dist/clis/taobao/cart.js +95 -0
  206. package/dist/clis/taobao/commands.test.d.ts +5 -0
  207. package/dist/clis/taobao/commands.test.js +64 -0
  208. package/dist/clis/taobao/detail.d.ts +1 -0
  209. package/dist/clis/taobao/detail.js +70 -0
  210. package/dist/clis/taobao/reviews.d.ts +1 -0
  211. package/dist/clis/taobao/reviews.js +76 -0
  212. package/dist/clis/taobao/search.d.ts +1 -0
  213. package/dist/clis/taobao/search.js +96 -0
  214. package/dist/clis/tiktok/comment.d.ts +1 -0
  215. package/dist/clis/tiktok/comment.js +57 -0
  216. package/dist/clis/tiktok/explore.d.ts +1 -0
  217. package/dist/clis/tiktok/explore.js +35 -0
  218. package/dist/clis/tiktok/follow.d.ts +1 -0
  219. package/dist/clis/tiktok/follow.js +39 -0
  220. package/dist/clis/tiktok/following.d.ts +1 -0
  221. package/dist/clis/tiktok/following.js +42 -0
  222. package/dist/clis/tiktok/friends.d.ts +1 -0
  223. package/dist/clis/tiktok/friends.js +43 -0
  224. package/dist/clis/tiktok/like.d.ts +1 -0
  225. package/dist/clis/tiktok/like.js +33 -0
  226. package/dist/clis/tiktok/live.d.ts +1 -0
  227. package/dist/clis/tiktok/live.js +47 -0
  228. package/dist/clis/tiktok/notifications.d.ts +1 -0
  229. package/dist/clis/tiktok/notifications.js +49 -0
  230. package/dist/clis/tiktok/profile.d.ts +1 -0
  231. package/dist/clis/tiktok/profile.js +54 -0
  232. package/dist/clis/tiktok/save.d.ts +1 -0
  233. package/dist/clis/tiktok/save.js +29 -0
  234. package/dist/clis/tiktok/search.d.ts +1 -0
  235. package/dist/clis/tiktok/search.js +39 -0
  236. package/dist/clis/tiktok/unfollow.d.ts +1 -0
  237. package/dist/clis/tiktok/unfollow.js +44 -0
  238. package/dist/clis/tiktok/unlike.d.ts +1 -0
  239. package/dist/clis/tiktok/unlike.js +33 -0
  240. package/dist/clis/tiktok/unsave.d.ts +1 -0
  241. package/dist/clis/tiktok/unsave.js +31 -0
  242. package/dist/clis/tiktok/user.d.ts +1 -0
  243. package/dist/clis/tiktok/user.js +41 -0
  244. package/dist/clis/v2ex/hot.d.ts +1 -0
  245. package/dist/clis/v2ex/hot.js +25 -0
  246. package/dist/clis/v2ex/latest.d.ts +1 -0
  247. package/dist/clis/v2ex/latest.js +25 -0
  248. package/dist/clis/v2ex/member.d.ts +1 -0
  249. package/dist/clis/v2ex/member.js +27 -0
  250. package/dist/clis/v2ex/node.d.ts +1 -0
  251. package/dist/clis/v2ex/node.js +38 -0
  252. package/dist/clis/v2ex/nodes.d.ts +1 -0
  253. package/dist/clis/v2ex/nodes.js +25 -0
  254. package/dist/clis/v2ex/replies.d.ts +1 -0
  255. package/dist/clis/v2ex/replies.js +26 -0
  256. package/dist/clis/v2ex/topic.d.ts +1 -0
  257. package/dist/clis/v2ex/topic.js +30 -0
  258. package/dist/clis/v2ex/user.d.ts +1 -0
  259. package/dist/clis/v2ex/user.js +33 -0
  260. package/dist/clis/xiaoe/catalog.d.ts +1 -0
  261. package/dist/clis/xiaoe/catalog.js +125 -0
  262. package/dist/clis/xiaoe/content.d.ts +1 -0
  263. package/dist/clis/xiaoe/content.js +39 -0
  264. package/dist/clis/xiaoe/courses.d.ts +1 -0
  265. package/dist/clis/xiaoe/courses.js +69 -0
  266. package/dist/clis/xiaoe/detail.d.ts +1 -0
  267. package/dist/clis/xiaoe/detail.js +35 -0
  268. package/dist/clis/xiaoe/play-url.d.ts +1 -0
  269. package/dist/clis/xiaoe/play-url.js +120 -0
  270. package/dist/clis/xiaohongshu/feed.d.ts +1 -0
  271. package/dist/clis/xiaohongshu/feed.js +32 -0
  272. package/dist/clis/xiaohongshu/notifications.d.ts +1 -0
  273. package/dist/clis/xiaohongshu/notifications.js +38 -0
  274. package/dist/clis/xueqiu/earnings-date.d.ts +1 -0
  275. package/dist/clis/xueqiu/earnings-date.js +61 -0
  276. package/dist/clis/xueqiu/feed.d.ts +1 -0
  277. package/dist/clis/xueqiu/feed.js +48 -0
  278. package/dist/clis/xueqiu/groups.d.ts +1 -0
  279. package/dist/clis/xueqiu/groups.js +25 -0
  280. package/dist/clis/xueqiu/hot-stock.d.ts +1 -0
  281. package/dist/clis/xueqiu/hot-stock.js +44 -0
  282. package/dist/clis/xueqiu/hot.d.ts +1 -0
  283. package/dist/clis/xueqiu/hot.js +44 -0
  284. package/dist/clis/xueqiu/kline.d.ts +1 -0
  285. package/dist/clis/xueqiu/kline.js +64 -0
  286. package/dist/clis/xueqiu/search.d.ts +1 -0
  287. package/dist/clis/xueqiu/search.js +49 -0
  288. package/dist/clis/xueqiu/stock.d.ts +1 -0
  289. package/dist/clis/xueqiu/stock.js +72 -0
  290. package/dist/clis/xueqiu/watchlist.d.ts +1 -0
  291. package/dist/clis/xueqiu/watchlist.js +45 -0
  292. package/dist/clis/zhihu/hot.d.ts +1 -0
  293. package/dist/clis/zhihu/hot.js +43 -0
  294. package/dist/clis/zhihu/search.d.ts +1 -0
  295. package/dist/clis/zhihu/search.js +52 -0
  296. package/dist/src/browser/daemon-client.d.ts +14 -3
  297. package/dist/src/browser/daemon-client.js +30 -14
  298. package/dist/src/browser/dom-helpers.test.js +3 -2
  299. package/dist/src/browser/errors.d.ts +26 -1
  300. package/dist/src/browser/errors.js +40 -7
  301. package/dist/src/browser/errors.test.d.ts +1 -0
  302. package/dist/src/browser/errors.test.js +51 -0
  303. package/dist/src/browser/page.d.ts +9 -8
  304. package/dist/src/browser/page.js +33 -31
  305. package/dist/src/browser.test.js +26 -6
  306. package/dist/src/build-manifest.d.ts +5 -11
  307. package/dist/src/build-manifest.js +6 -75
  308. package/dist/src/build-manifest.test.js +1 -39
  309. package/dist/src/cascade.js +3 -2
  310. package/dist/src/cli.d.ts +3 -3
  311. package/dist/src/cli.js +70 -62
  312. package/dist/src/cli.test.js +20 -15
  313. package/dist/src/clis/binance/asks.d.ts +1 -0
  314. package/dist/src/clis/binance/asks.js +20 -0
  315. package/dist/src/clis/binance/commands.test.d.ts +3 -1
  316. package/dist/src/clis/binance/commands.test.js +10 -6
  317. package/dist/src/clis/binance/depth.d.ts +1 -0
  318. package/dist/src/clis/binance/depth.js +20 -0
  319. package/dist/src/clis/binance/gainers.d.ts +1 -0
  320. package/dist/src/clis/binance/gainers.js +21 -0
  321. package/dist/src/clis/binance/klines.d.ts +1 -0
  322. package/dist/src/clis/binance/klines.js +20 -0
  323. package/dist/src/clis/binance/losers.d.ts +1 -0
  324. package/dist/src/clis/binance/losers.js +21 -0
  325. package/dist/src/clis/binance/pairs.d.ts +1 -0
  326. package/dist/src/clis/binance/pairs.js +20 -0
  327. package/dist/src/clis/binance/price.d.ts +1 -0
  328. package/dist/src/clis/binance/price.js +17 -0
  329. package/dist/src/clis/binance/prices.d.ts +1 -0
  330. package/dist/src/clis/binance/prices.js +18 -0
  331. package/dist/src/clis/binance/ticker.d.ts +1 -0
  332. package/dist/src/clis/binance/ticker.js +20 -0
  333. package/dist/src/clis/binance/top.d.ts +1 -0
  334. package/dist/src/clis/binance/top.js +20 -0
  335. package/dist/src/clis/binance/trades.d.ts +1 -0
  336. package/dist/src/clis/binance/trades.js +19 -0
  337. package/dist/src/completion-fast.d.ts +25 -0
  338. package/dist/src/completion-fast.js +140 -0
  339. package/dist/src/completion.d.ts +1 -0
  340. package/dist/src/completion.js +1 -0
  341. package/dist/src/diagnostic.test.js +2 -2
  342. package/dist/src/discovery.d.ts +3 -3
  343. package/dist/src/discovery.js +34 -97
  344. package/dist/src/download/index.d.ts +1 -1
  345. package/dist/src/engine.test.js +4 -19
  346. package/dist/src/generate-verified.d.ts +105 -0
  347. package/dist/src/generate-verified.js +696 -0
  348. package/dist/src/generate-verified.test.d.ts +1 -0
  349. package/dist/src/generate-verified.test.js +925 -0
  350. package/dist/src/generate.d.ts +9 -1
  351. package/dist/src/generate.js +2 -2
  352. package/dist/src/main.js +65 -12
  353. package/dist/src/pipeline/steps/download.d.ts +1 -17
  354. package/dist/src/pipeline/steps/download.js +20 -31
  355. package/dist/src/pipeline/steps/intercept.d.ts +1 -1
  356. package/dist/src/pipeline/steps/intercept.js +1 -1
  357. package/dist/src/pipeline/steps/tap.d.ts +1 -1
  358. package/dist/src/pipeline/steps/tap.js +1 -1
  359. package/dist/src/plugin-scaffold.d.ts +2 -2
  360. package/dist/src/plugin-scaffold.js +24 -21
  361. package/dist/src/plugin-scaffold.test.js +1 -1
  362. package/dist/src/plugin.d.ts +1 -1
  363. package/dist/src/plugin.js +4 -6
  364. package/dist/src/plugin.test.js +31 -31
  365. package/dist/src/record.js +26 -25
  366. package/dist/src/runtime-detect.js +3 -7
  367. package/dist/src/scripts/framework.d.ts +3 -0
  368. package/dist/src/scripts/framework.js +8 -4
  369. package/dist/src/scripts/store.d.ts +5 -1
  370. package/dist/src/scripts/store.js +5 -1
  371. package/dist/src/skill-generate.d.ts +30 -0
  372. package/dist/src/skill-generate.js +75 -0
  373. package/dist/src/skill-generate.test.d.ts +1 -0
  374. package/dist/src/skill-generate.test.js +173 -0
  375. package/dist/src/synthesize.d.ts +1 -1
  376. package/dist/src/synthesize.js +7 -8
  377. package/dist/src/types.d.ts +3 -1
  378. package/package.json +3 -3
  379. package/dist/clis/bilibili/hot.yaml +0 -38
  380. package/dist/clis/bluesky/feeds.yaml +0 -29
  381. package/dist/clis/bluesky/followers.yaml +0 -33
  382. package/dist/clis/bluesky/following.yaml +0 -33
  383. package/dist/clis/bluesky/profile.yaml +0 -27
  384. package/dist/clis/bluesky/search.yaml +0 -34
  385. package/dist/clis/bluesky/starter-packs.yaml +0 -34
  386. package/dist/clis/bluesky/thread.yaml +0 -32
  387. package/dist/clis/bluesky/trending.yaml +0 -27
  388. package/dist/clis/bluesky/user.yaml +0 -34
  389. package/dist/clis/devto/tag.yaml +0 -34
  390. package/dist/clis/devto/top.yaml +0 -29
  391. package/dist/clis/devto/user.yaml +0 -33
  392. package/dist/clis/dictionary/examples.yaml +0 -25
  393. package/dist/clis/dictionary/search.yaml +0 -27
  394. package/dist/clis/dictionary/synonyms.yaml +0 -25
  395. package/dist/clis/douban/subject.yaml +0 -107
  396. package/dist/clis/douban/top250.yaml +0 -70
  397. package/dist/clis/facebook/add-friend.yaml +0 -43
  398. package/dist/clis/facebook/events.yaml +0 -44
  399. package/dist/clis/facebook/feed.yaml +0 -63
  400. package/dist/clis/facebook/friends.yaml +0 -42
  401. package/dist/clis/facebook/groups.yaml +0 -50
  402. package/dist/clis/facebook/join-group.yaml +0 -44
  403. package/dist/clis/facebook/memories.yaml +0 -39
  404. package/dist/clis/facebook/notifications.yaml +0 -40
  405. package/dist/clis/facebook/profile.yaml +0 -37
  406. package/dist/clis/facebook/search.yaml +0 -47
  407. package/dist/clis/hackernews/ask.yaml +0 -38
  408. package/dist/clis/hackernews/best.yaml +0 -38
  409. package/dist/clis/hackernews/jobs.yaml +0 -36
  410. package/dist/clis/hackernews/new.yaml +0 -38
  411. package/dist/clis/hackernews/search.yaml +0 -44
  412. package/dist/clis/hackernews/show.yaml +0 -38
  413. package/dist/clis/hackernews/top.yaml +0 -38
  414. package/dist/clis/hackernews/user.yaml +0 -25
  415. package/dist/clis/hupu/hot.yaml +0 -43
  416. package/dist/clis/instagram/comment.yaml +0 -52
  417. package/dist/clis/instagram/explore.yaml +0 -43
  418. package/dist/clis/instagram/follow.yaml +0 -41
  419. package/dist/clis/instagram/followers.yaml +0 -51
  420. package/dist/clis/instagram/following.yaml +0 -51
  421. package/dist/clis/instagram/like.yaml +0 -46
  422. package/dist/clis/instagram/profile.yaml +0 -42
  423. package/dist/clis/instagram/save.yaml +0 -46
  424. package/dist/clis/instagram/saved.yaml +0 -40
  425. package/dist/clis/instagram/search.yaml +0 -44
  426. package/dist/clis/instagram/unfollow.yaml +0 -38
  427. package/dist/clis/instagram/unlike.yaml +0 -46
  428. package/dist/clis/instagram/unsave.yaml +0 -46
  429. package/dist/clis/instagram/user.yaml +0 -54
  430. package/dist/clis/jike/post.yaml +0 -59
  431. package/dist/clis/jike/topic.yaml +0 -53
  432. package/dist/clis/jike/user.yaml +0 -52
  433. package/dist/clis/jimeng/generate.yaml +0 -85
  434. package/dist/clis/jimeng/history.yaml +0 -46
  435. package/dist/clis/linux-do/categories.yaml +0 -70
  436. package/dist/clis/linux-do/search.yaml +0 -48
  437. package/dist/clis/linux-do/tags.yaml +0 -41
  438. package/dist/clis/linux-do/topic.yaml +0 -62
  439. package/dist/clis/linux-do/user-posts.yaml +0 -67
  440. package/dist/clis/linux-do/user-topics.yaml +0 -54
  441. package/dist/clis/lobsters/active.yaml +0 -29
  442. package/dist/clis/lobsters/hot.yaml +0 -29
  443. package/dist/clis/lobsters/newest.yaml +0 -29
  444. package/dist/clis/lobsters/tag.yaml +0 -34
  445. package/dist/clis/pixiv/detail.yaml +0 -49
  446. package/dist/clis/pixiv/ranking.yaml +0 -53
  447. package/dist/clis/pixiv/user.yaml +0 -46
  448. package/dist/clis/reddit/frontpage.yaml +0 -30
  449. package/dist/clis/reddit/hot.yaml +0 -47
  450. package/dist/clis/reddit/popular.yaml +0 -40
  451. package/dist/clis/reddit/search.yaml +0 -61
  452. package/dist/clis/reddit/subreddit.yaml +0 -50
  453. package/dist/clis/reddit/user-comments.yaml +0 -46
  454. package/dist/clis/reddit/user-posts.yaml +0 -44
  455. package/dist/clis/reddit/user.yaml +0 -40
  456. package/dist/clis/stackoverflow/bounties.yaml +0 -29
  457. package/dist/clis/stackoverflow/hot.yaml +0 -28
  458. package/dist/clis/stackoverflow/search.yaml +0 -33
  459. package/dist/clis/stackoverflow/unanswered.yaml +0 -28
  460. package/dist/clis/steam/top-sellers.yaml +0 -29
  461. package/dist/clis/tiktok/comment.yaml +0 -66
  462. package/dist/clis/tiktok/explore.yaml +0 -39
  463. package/dist/clis/tiktok/follow.yaml +0 -39
  464. package/dist/clis/tiktok/following.yaml +0 -46
  465. package/dist/clis/tiktok/friends.yaml +0 -47
  466. package/dist/clis/tiktok/like.yaml +0 -38
  467. package/dist/clis/tiktok/live.yaml +0 -51
  468. package/dist/clis/tiktok/notifications.yaml +0 -52
  469. package/dist/clis/tiktok/profile.yaml +0 -45
  470. package/dist/clis/tiktok/save.yaml +0 -34
  471. package/dist/clis/tiktok/search.yaml +0 -47
  472. package/dist/clis/tiktok/unfollow.yaml +0 -44
  473. package/dist/clis/tiktok/unlike.yaml +0 -38
  474. package/dist/clis/tiktok/unsave.yaml +0 -36
  475. package/dist/clis/tiktok/user.yaml +0 -44
  476. package/dist/clis/v2ex/hot.yaml +0 -28
  477. package/dist/clis/v2ex/latest.yaml +0 -28
  478. package/dist/clis/v2ex/member.yaml +0 -29
  479. package/dist/clis/v2ex/node.yaml +0 -34
  480. package/dist/clis/v2ex/nodes.yaml +0 -31
  481. package/dist/clis/v2ex/replies.yaml +0 -32
  482. package/dist/clis/v2ex/topic.yaml +0 -33
  483. package/dist/clis/v2ex/user.yaml +0 -34
  484. package/dist/clis/xiaoe/catalog.yaml +0 -129
  485. package/dist/clis/xiaoe/content.yaml +0 -43
  486. package/dist/clis/xiaoe/courses.yaml +0 -73
  487. package/dist/clis/xiaoe/detail.yaml +0 -39
  488. package/dist/clis/xiaoe/play-url.yaml +0 -124
  489. package/dist/clis/xiaohongshu/feed.yaml +0 -31
  490. package/dist/clis/xiaohongshu/notifications.yaml +0 -37
  491. package/dist/clis/xueqiu/earnings-date.yaml +0 -69
  492. package/dist/clis/xueqiu/feed.yaml +0 -53
  493. package/dist/clis/xueqiu/groups.yaml +0 -23
  494. package/dist/clis/xueqiu/hot-stock.yaml +0 -49
  495. package/dist/clis/xueqiu/hot.yaml +0 -46
  496. package/dist/clis/xueqiu/kline.yaml +0 -65
  497. package/dist/clis/xueqiu/search.yaml +0 -55
  498. package/dist/clis/xueqiu/stock.yaml +0 -69
  499. package/dist/clis/xueqiu/watchlist.yaml +0 -46
  500. package/dist/clis/zhihu/hot.yaml +0 -46
  501. package/dist/clis/zhihu/search.yaml +0 -59
  502. package/dist/src/yaml-schema.d.ts +0 -29
  503. package/dist/src/yaml-schema.js +0 -22
@@ -0,0 +1,20 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'pairs',
5
+ description: 'List active trading pairs on Binance',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'limit', type: 'int', default: 20, help: 'Number of trading pairs' },
11
+ ],
12
+ columns: ['symbol', 'base', 'quote', 'status'],
13
+ pipeline: [
14
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/exchangeInfo' } },
15
+ { select: 'symbols' },
16
+ { filter: 'item.status === \'TRADING\'' },
17
+ { map: { symbol: '${{ item.symbol }}', base: '${{ item.baseAsset }}', quote: '${{ item.quoteAsset }}', status: '${{ item.status }}' } },
18
+ { limit: '${{ args.limit }}' },
19
+ ],
20
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'price',
5
+ description: 'Quick price check for a trading pair',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'symbol', type: 'str', required: true, positional: true, help: 'Trading pair symbol (e.g. BTCUSDT, ETHUSDT)' },
11
+ ],
12
+ columns: ['symbol', 'price', 'change', 'change_pct', 'high', 'low', 'volume', 'quote_volume', 'trades'],
13
+ pipeline: [
14
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/ticker/24hr?symbol=${{ args.symbol }}' } },
15
+ { map: { symbol: '${{ item.symbol }}', price: '${{ item.lastPrice }}', change: '${{ item.priceChange }}', change_pct: '${{ item.priceChangePercent }}', high: '${{ item.highPrice }}', low: '${{ item.lowPrice }}', volume: '${{ item.volume }}', quote_volume: '${{ item.quoteVolume }}', trades: '${{ item.count }}' } },
16
+ ],
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'prices',
5
+ description: 'Latest prices for all trading pairs',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'limit', type: 'int', default: 20, help: 'Number of prices' },
11
+ ],
12
+ columns: ['rank', 'symbol', 'price'],
13
+ pipeline: [
14
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/ticker/price' } },
15
+ { map: { rank: '${{ index + 1 }}', symbol: '${{ item.symbol }}', price: '${{ item.price }}' } },
16
+ { limit: '${{ args.limit }}' },
17
+ ],
18
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'ticker',
5
+ description: '24h ticker statistics for top trading pairs by volume',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'limit', type: 'int', default: 20, help: 'Number of tickers' },
11
+ ],
12
+ columns: ['symbol', 'price', 'change_pct', 'high', 'low', 'volume', 'quote_vol', 'trades'],
13
+ pipeline: [
14
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/ticker/24hr' } },
15
+ { map: { symbol: '${{ item.symbol }}', price: '${{ item.lastPrice }}', change_pct: '${{ item.priceChangePercent }}', high: '${{ item.highPrice }}', low: '${{ item.lowPrice }}', volume: '${{ item.volume }}', quote_vol: '${{ item.quoteVolume }}', trades: '${{ item.count }}', sort_volume: '${{ Number(item.quoteVolume) }}' } },
16
+ { sort: { by: 'sort_volume', order: 'desc' } },
17
+ { map: { symbol: '${{ item.symbol }}', price: '${{ item.lastPrice }}', change_pct: '${{ item.priceChangePercent }}', high: '${{ item.highPrice }}', low: '${{ item.lowPrice }}', volume: '${{ item.volume }}', quote_vol: '${{ item.quoteVolume }}', trades: '${{ item.count }}' } },
18
+ { limit: '${{ args.limit }}' },
19
+ ],
20
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'top',
5
+ description: 'Top trading pairs by 24h volume on Binance',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'limit', type: 'int', default: 20, help: 'Number of trading pairs' },
11
+ ],
12
+ columns: ['rank', 'symbol', 'price', 'change_24h', 'high', 'low', 'volume'],
13
+ pipeline: [
14
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/ticker/24hr' } },
15
+ { map: { symbol: '${{ item.symbol }}', price: '${{ item.lastPrice }}', change_24h: '${{ item.priceChangePercent }}', high: '${{ item.highPrice }}', low: '${{ item.lowPrice }}', volume: '${{ item.quoteVolume }}', sort_volume: '${{ Number(item.quoteVolume) }}' } },
16
+ { sort: { by: 'sort_volume', order: 'desc' } },
17
+ { map: { rank: '${{ index + 1 }}', symbol: '${{ item.symbol }}', price: '${{ item.lastPrice }}', change_24h: '${{ item.priceChangePercent }}', high: '${{ item.highPrice }}', low: '${{ item.lowPrice }}', volume: '${{ item.quoteVolume }}' } },
18
+ { limit: '${{ args.limit }}' },
19
+ ],
20
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { cli, Strategy } from '@jackwener/opencli/registry';
2
+ cli({
3
+ site: 'binance',
4
+ name: 'trades',
5
+ description: 'Recent trades for a trading pair',
6
+ domain: 'data-api.binance.vision',
7
+ strategy: Strategy.PUBLIC,
8
+ browser: false,
9
+ args: [
10
+ { name: 'symbol', type: 'str', required: true, positional: true, help: 'Trading pair symbol (e.g. BTCUSDT, ETHUSDT)' },
11
+ { name: 'limit', type: 'int', default: 20, help: 'Number of trades (max 1000)' },
12
+ ],
13
+ columns: ['id', 'price', 'qty', 'quote_qty', 'buyer_maker'],
14
+ pipeline: [
15
+ { fetch: { url: 'https://data-api.binance.vision/api/v3/trades?symbol=${{ args.symbol }}&limit=${{ args.limit }}' } },
16
+ { map: { id: '${{ item.id }}', price: '${{ item.price }}', qty: '${{ item.qty }}', quote_qty: '${{ item.quoteQty }}', buyer_maker: '${{ item.isBuyerMaker }}' } },
17
+ { limit: '${{ args.limit }}' },
18
+ ],
19
+ });
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Lightweight manifest-based completion for the fast path.
3
+ *
4
+ * This module MUST NOT import registry, discovery, or any heavy module.
5
+ * It only reads pre-compiled cli-manifest.json files synchronously.
6
+ */
7
+ /**
8
+ * Returns true only if ALL manifest files exist and are readable.
9
+ * If any source lacks a manifest (e.g. user adapters without a compiled manifest),
10
+ * the fast path must not be used — otherwise those adapters would silently
11
+ * disappear from completion results.
12
+ */
13
+ export declare function hasAllManifests(manifestPaths: string[]): boolean;
14
+ /**
15
+ * Lightweight completion that reads directly from manifest JSON files,
16
+ * bypassing full CLI discovery and adapter loading.
17
+ */
18
+ export declare function getCompletionsFromManifest(words: string[], cursor: number, manifestPaths: string[]): string[];
19
+ export declare function bashCompletionScript(): string;
20
+ export declare function zshCompletionScript(): string;
21
+ export declare function fishCompletionScript(): string;
22
+ /**
23
+ * Print completion script for the given shell. Returns true if handled, false if unknown shell.
24
+ */
25
+ export declare function printCompletionScriptFast(shell: string): boolean;
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Lightweight manifest-based completion for the fast path.
3
+ *
4
+ * This module MUST NOT import registry, discovery, or any heavy module.
5
+ * It only reads pre-compiled cli-manifest.json files synchronously.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ const BUILTIN_COMMANDS = [
9
+ 'list',
10
+ 'validate',
11
+ 'verify',
12
+ 'explore',
13
+ 'probe',
14
+ 'synthesize',
15
+ 'generate',
16
+ 'cascade',
17
+ 'doctor',
18
+ 'plugin',
19
+ 'install',
20
+ 'register',
21
+ 'completion',
22
+ ];
23
+ /**
24
+ * Returns true only if ALL manifest files exist and are readable.
25
+ * If any source lacks a manifest (e.g. user adapters without a compiled manifest),
26
+ * the fast path must not be used — otherwise those adapters would silently
27
+ * disappear from completion results.
28
+ */
29
+ export function hasAllManifests(manifestPaths) {
30
+ for (const p of manifestPaths) {
31
+ try {
32
+ fs.accessSync(p);
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ return manifestPaths.length > 0;
39
+ }
40
+ /**
41
+ * Lightweight completion that reads directly from manifest JSON files,
42
+ * bypassing full CLI discovery and adapter loading.
43
+ */
44
+ export function getCompletionsFromManifest(words, cursor, manifestPaths) {
45
+ const entries = loadManifestEntries(manifestPaths);
46
+ if (entries === null) {
47
+ return [];
48
+ }
49
+ if (cursor <= 1) {
50
+ const sites = new Set();
51
+ for (const entry of entries) {
52
+ sites.add(entry.site);
53
+ }
54
+ return [...BUILTIN_COMMANDS, ...sites].sort();
55
+ }
56
+ const site = words[0];
57
+ if (BUILTIN_COMMANDS.includes(site)) {
58
+ return [];
59
+ }
60
+ if (cursor === 2) {
61
+ const subcommands = [];
62
+ for (const entry of entries) {
63
+ if (entry.site === site) {
64
+ subcommands.push(entry.name);
65
+ if (entry.aliases?.length)
66
+ subcommands.push(...entry.aliases);
67
+ }
68
+ }
69
+ return [...new Set(subcommands)].sort();
70
+ }
71
+ return [];
72
+ }
73
+ // ── Shell script generators (pure strings, no registry dependency) ───────
74
+ export function bashCompletionScript() {
75
+ return `# Bash completion for opencli
76
+ # Add to ~/.bashrc: eval "$(opencli completion bash)"
77
+ _opencli_completions() {
78
+ local cur words cword
79
+ _get_comp_words_by_ref -n : cur words cword
80
+
81
+ local completions
82
+ completions=$(opencli --get-completions --cursor "$cword" "\${words[@]:1}" 2>/dev/null)
83
+
84
+ COMPREPLY=( $(compgen -W "$completions" -- "$cur") )
85
+ __ltrim_colon_completions "$cur"
86
+ }
87
+ complete -F _opencli_completions opencli
88
+ `;
89
+ }
90
+ export function zshCompletionScript() {
91
+ return `# Zsh completion for opencli
92
+ # Add to ~/.zshrc: eval "$(opencli completion zsh)"
93
+ _opencli() {
94
+ local -a completions
95
+ local cword=$((CURRENT - 1))
96
+ completions=(\${(f)"$(opencli --get-completions --cursor "$cword" "\${words[@]:1}" 2>/dev/null)"})
97
+ compadd -a completions
98
+ }
99
+ compdef _opencli opencli
100
+ `;
101
+ }
102
+ export function fishCompletionScript() {
103
+ return `# Fish completion for opencli
104
+ # Add to ~/.config/fish/config.fish: opencli completion fish | source
105
+ complete -c opencli -f -a '(
106
+ set -l tokens (commandline -cop)
107
+ set -l cursor (count (commandline -cop))
108
+ opencli --get-completions --cursor $cursor $tokens[2..] 2>/dev/null
109
+ )'
110
+ `;
111
+ }
112
+ const SHELL_SCRIPTS = {
113
+ bash: bashCompletionScript,
114
+ zsh: zshCompletionScript,
115
+ fish: fishCompletionScript,
116
+ };
117
+ /**
118
+ * Print completion script for the given shell. Returns true if handled, false if unknown shell.
119
+ */
120
+ export function printCompletionScriptFast(shell) {
121
+ const gen = SHELL_SCRIPTS[shell];
122
+ if (!gen)
123
+ return false;
124
+ process.stdout.write(gen());
125
+ return true;
126
+ }
127
+ function loadManifestEntries(manifestPaths) {
128
+ const entries = [];
129
+ let found = false;
130
+ for (const manifestPath of manifestPaths) {
131
+ try {
132
+ const raw = fs.readFileSync(manifestPath, 'utf-8');
133
+ const manifest = JSON.parse(raw);
134
+ entries.push(...manifest);
135
+ found = true;
136
+ }
137
+ catch { /* skip missing/unreadable */ }
138
+ }
139
+ return found ? entries : null;
140
+ }
@@ -7,6 +7,7 @@
7
7
  */
8
8
  /**
9
9
  * Return completion candidates given the current command-line words and cursor index.
10
+ * Requires full CLI discovery to have been run (uses getRegistry()).
10
11
  *
11
12
  * @param words - The argv after 'opencli' (words[0] is the first arg, e.g. site name)
12
13
  * @param cursor - 1-based position of the word being completed (1 = first arg)
@@ -28,6 +28,7 @@ const BUILTIN_COMMANDS = [
28
28
  ];
29
29
  /**
30
30
  * Return completion candidates given the current command-line words and cursor index.
31
+ * Requires full CLI discovery to have been run (uses getRegistry()).
31
32
  *
32
33
  * @param words - The argv after 'opencli' (words[0] is the first arg, e.g. site name)
33
34
  * @param cursor - 1-based position of the word being completed (1 = first arg)
@@ -83,8 +83,8 @@ describe('redactText', () => {
83
83
  });
84
84
  describe('resolveAdapterSourcePath', () => {
85
85
  it('returns source when it is a real file path (not manifest:)', () => {
86
- const cmd = makeCmd({ source: '/home/user/.opencli/clis/arxiv/search.yaml' });
87
- expect(resolveAdapterSourcePath(cmd)).toBe('/home/user/.opencli/clis/arxiv/search.yaml');
86
+ const cmd = makeCmd({ source: '/home/user/.opencli/clis/arxiv/search.ts' });
87
+ expect(resolveAdapterSourcePath(cmd)).toBe('/home/user/.opencli/clis/arxiv/search.ts');
88
88
  });
89
89
  it('skips manifest: pseudo-paths and falls back to _modulePath', () => {
90
90
  const cmd = makeCmd({ source: 'manifest:arxiv/search', _modulePath: '/pkg/dist/clis/arxiv/search.js' });
@@ -1,10 +1,10 @@
1
1
  /**
2
- * CLI discovery: finds YAML/TS CLI definitions and registers them.
2
+ * CLI discovery: finds TS CLI definitions and registers them.
3
3
  *
4
4
  * Supports two modes:
5
5
  * 1. FAST PATH (manifest): If a pre-compiled cli-manifest.json exists,
6
- * registers all YAML commands instantly without runtime YAML parsing.
7
- * TS modules are loaded lazily only when their command is executed.
6
+ * registers commands instantly. TS modules are loaded lazily only
7
+ * when their command is executed.
8
8
  * 2. FALLBACK (filesystem scan): Traditional runtime discovery for development.
9
9
  */
10
10
  /** User runtime directory: ~/.opencli */
@@ -1,17 +1,16 @@
1
1
  /**
2
- * CLI discovery: finds YAML/TS CLI definitions and registers them.
2
+ * CLI discovery: finds TS CLI definitions and registers them.
3
3
  *
4
4
  * Supports two modes:
5
5
  * 1. FAST PATH (manifest): If a pre-compiled cli-manifest.json exists,
6
- * registers all YAML commands instantly without runtime YAML parsing.
7
- * TS modules are loaded lazily only when their command is executed.
6
+ * registers commands instantly. TS modules are loaded lazily only
7
+ * when their command is executed.
8
8
  * 2. FALLBACK (filesystem scan): Traditional runtime discovery for development.
9
9
  */
10
10
  import * as fs from 'node:fs';
11
11
  import * as os from 'node:os';
12
12
  import * as path from 'node:path';
13
13
  import { fileURLToPath, pathToFileURL } from 'node:url';
14
- import yaml from 'js-yaml';
15
14
  import { Strategy, registerCommand } from './registry.js';
16
15
  import { getErrorMessage } from './errors.js';
17
16
  import { log } from './logger.js';
@@ -24,14 +23,12 @@ export const USER_CLIS_DIR = path.join(USER_OPENCLI_DIR, 'clis');
24
23
  export const PLUGINS_DIR = path.join(USER_OPENCLI_DIR, 'plugins');
25
24
  /** Matches files that register commands via cli() or lifecycle hooks */
26
25
  const PLUGIN_MODULE_PATTERN = /\b(?:cli|onStartup|onBeforeExecute|onAfterExecute)\s*\(/;
27
- import { parseYamlArgs } from './yaml-schema.js';
28
26
  function parseStrategy(rawStrategy, fallback = Strategy.COOKIE) {
29
27
  if (!rawStrategy)
30
28
  return fallback;
31
29
  const key = rawStrategy.toUpperCase();
32
30
  return Strategy[key] ?? fallback;
33
31
  }
34
- import { isRecord } from './utils.js';
35
32
  const PACKAGE_ROOT = findPackageRoot(fileURLToPath(import.meta.url));
36
33
  /**
37
34
  * Ensure ~/.opencli/node_modules/@jackwener/opencli symlink exists so that
@@ -140,7 +137,6 @@ export async function discoverClis(...dirs) {
140
137
  }
141
138
  /**
142
139
  * Fast-path: register commands from pre-compiled manifest.
143
- * YAML pipelines are inlined — zero YAML parsing at runtime.
144
140
  * TS modules are deferred — loaded lazily on first execution.
145
141
  */
146
142
  async function loadFromManifest(manifestPath, clisDir) {
@@ -148,53 +144,30 @@ async function loadFromManifest(manifestPath, clisDir) {
148
144
  const raw = await fs.promises.readFile(manifestPath, 'utf-8');
149
145
  const manifest = JSON.parse(raw);
150
146
  for (const entry of manifest) {
151
- if (entry.type === 'yaml') {
152
- // YAML pipelines fully inlined in manifest — register directly
153
- const strategy = parseStrategy(entry.strategy);
154
- const cmd = {
155
- site: entry.site,
156
- name: entry.name,
157
- aliases: entry.aliases,
158
- description: entry.description ?? '',
159
- domain: entry.domain,
160
- strategy,
161
- browser: entry.browser,
162
- args: entry.args ?? [],
163
- columns: entry.columns,
164
- pipeline: entry.pipeline,
165
- timeoutSeconds: entry.timeout,
166
- source: entry.sourceFile ? path.resolve(clisDir, entry.sourceFile) : `manifest:${entry.site}/${entry.name}`,
167
- deprecated: entry.deprecated,
168
- replacedBy: entry.replacedBy,
169
- navigateBefore: entry.navigateBefore,
170
- };
171
- registerCommand(cmd);
172
- }
173
- else if (entry.type === 'ts' && entry.modulePath) {
174
- // TS adapters: register a lightweight stub.
175
- // The actual module is loaded lazily on first executeCommand().
176
- const strategy = parseStrategy(entry.strategy ?? 'cookie');
177
- const modulePath = path.resolve(clisDir, entry.modulePath);
178
- const cmd = {
179
- site: entry.site,
180
- name: entry.name,
181
- aliases: entry.aliases,
182
- description: entry.description ?? '',
183
- domain: entry.domain,
184
- strategy,
185
- browser: entry.browser ?? true,
186
- args: entry.args ?? [],
187
- columns: entry.columns,
188
- timeoutSeconds: entry.timeout,
189
- source: entry.sourceFile ? path.resolve(clisDir, entry.sourceFile) : modulePath,
190
- deprecated: entry.deprecated,
191
- replacedBy: entry.replacedBy,
192
- navigateBefore: entry.navigateBefore,
193
- _lazy: true,
194
- _modulePath: modulePath,
195
- };
196
- registerCommand(cmd);
197
- }
147
+ if (!entry.modulePath)
148
+ continue;
149
+ const strategy = parseStrategy(entry.strategy ?? 'cookie');
150
+ const modulePath = path.resolve(clisDir, entry.modulePath);
151
+ const cmd = {
152
+ site: entry.site,
153
+ name: entry.name,
154
+ aliases: entry.aliases,
155
+ description: entry.description ?? '',
156
+ domain: entry.domain,
157
+ strategy,
158
+ browser: entry.browser ?? true,
159
+ args: entry.args ?? [],
160
+ columns: entry.columns,
161
+ pipeline: entry.pipeline,
162
+ timeoutSeconds: entry.timeout,
163
+ source: entry.sourceFile ? path.resolve(clisDir, entry.sourceFile) : modulePath,
164
+ deprecated: entry.deprecated,
165
+ replacedBy: entry.replacedBy,
166
+ navigateBefore: entry.navigateBefore,
167
+ _lazy: true,
168
+ _modulePath: modulePath,
169
+ };
170
+ registerCommand(cmd);
198
171
  }
199
172
  return true;
200
173
  }
@@ -223,9 +196,10 @@ async function discoverClisFromFs(dir) {
223
196
  await Promise.all(files.map(async (file) => {
224
197
  const filePath = path.join(siteDir, file);
225
198
  if (file.endsWith('.yaml') || file.endsWith('.yml')) {
226
- await registerYamlCli(filePath, site);
199
+ log.warn(`Ignoring YAML adapter ${filePath} — YAML format is no longer supported. Convert to TypeScript using cli() from '@jackwener/opencli/registry'.`);
200
+ return;
227
201
  }
228
- else if ((file.endsWith('.js') && !file.endsWith('.d.js')) ||
202
+ if ((file.endsWith('.js') && !file.endsWith('.d.js')) ||
229
203
  (file.endsWith('.ts') && !file.endsWith('.d.ts') && !file.endsWith('.test.ts'))) {
230
204
  if (!(await isCliModule(filePath)))
231
205
  return;
@@ -237,44 +211,6 @@ async function discoverClisFromFs(dir) {
237
211
  });
238
212
  await Promise.all(sitePromises);
239
213
  }
240
- async function registerYamlCli(filePath, defaultSite) {
241
- try {
242
- const raw = await fs.promises.readFile(filePath, 'utf-8');
243
- const def = yaml.load(raw);
244
- if (!isRecord(def))
245
- return;
246
- const cliDef = def;
247
- const site = cliDef.site ?? defaultSite;
248
- const name = cliDef.name ?? path.basename(filePath, path.extname(filePath));
249
- const strategyStr = cliDef.strategy ?? (cliDef.browser === false ? 'public' : 'cookie');
250
- const strategy = parseStrategy(strategyStr);
251
- const browser = cliDef.browser ?? (strategy !== Strategy.PUBLIC);
252
- const args = parseYamlArgs(cliDef.args);
253
- const cmd = {
254
- site,
255
- name,
256
- aliases: isRecord(cliDef) && Array.isArray(cliDef.aliases)
257
- ? cliDef.aliases.filter((value) => typeof value === 'string')
258
- : undefined,
259
- description: cliDef.description ?? '',
260
- domain: cliDef.domain,
261
- strategy,
262
- browser,
263
- args,
264
- columns: cliDef.columns,
265
- pipeline: cliDef.pipeline,
266
- timeoutSeconds: cliDef.timeout,
267
- source: filePath,
268
- deprecated: cliDef.deprecated,
269
- replacedBy: cliDef.replacedBy,
270
- navigateBefore: cliDef.navigateBefore,
271
- };
272
- registerCommand(cmd);
273
- }
274
- catch (err) {
275
- log.warn(`Failed to load ${filePath}: ${getErrorMessage(err)}`);
276
- }
277
- }
278
214
  /**
279
215
  * Discover and register plugins from ~/.opencli/plugins/.
280
216
  * Each subdirectory is treated as a plugin (site = directory name).
@@ -296,7 +232,7 @@ export async function discoverPlugins() {
296
232
  }));
297
233
  }
298
234
  /**
299
- * Flat scan: read yaml/ts files directly in a plugin directory.
235
+ * Flat scan: read ts/js files directly in a plugin directory.
300
236
  * Unlike discoverClisFromFs, this does NOT expect nested site subdirectories.
301
237
  */
302
238
  async function discoverPluginDir(dir, site) {
@@ -305,9 +241,10 @@ async function discoverPluginDir(dir, site) {
305
241
  await Promise.all(files.map(async (file) => {
306
242
  const filePath = path.join(dir, file);
307
243
  if (file.endsWith('.yaml') || file.endsWith('.yml')) {
308
- await registerYamlCli(filePath, site);
244
+ log.warn(`Ignoring YAML plugin ${filePath} — YAML format is no longer supported. Convert to TypeScript using cli() from '@jackwener/opencli/registry'.`);
245
+ return;
309
246
  }
310
- else if (file.endsWith('.js') && !file.endsWith('.d.js')) {
247
+ if (file.endsWith('.js') && !file.endsWith('.d.js')) {
311
248
  if (!(await isCliModule(filePath)))
312
249
  return;
313
250
  await import(pathToFileURL(filePath).href).catch((err) => {
@@ -52,7 +52,7 @@ export declare function ytdlpDownload(url: string, destPath: string, options?: Y
52
52
  /**
53
53
  * Save document content to file.
54
54
  */
55
- export declare function saveDocument(content: string, destPath: string, format?: 'json' | 'markdown' | 'html' | 'text', metadata?: Record<string, any>): Promise<{
55
+ export declare function saveDocument(content: string, destPath: string, format?: 'json' | 'markdown' | 'html' | 'text', metadata?: Record<string, unknown>): Promise<{
56
56
  success: boolean;
57
57
  size: number;
58
58
  error?: string;
@@ -127,8 +127,7 @@ describe('discoverPlugins', () => {
127
127
  }
128
128
  catch { }
129
129
  });
130
- it('discovers YAML plugins from ~/.opencli/plugins/', async () => {
131
- // Create a simple YAML adapter in the plugins directory
130
+ it('ignores YAML files in plugin directories (YAML format removed)', async () => {
132
131
  await fs.promises.mkdir(testPluginDir, { recursive: true });
133
132
  await fs.promises.writeFile(yamlPath, `
134
133
  site: __test-plugin__
@@ -136,25 +135,17 @@ name: greeting
136
135
  description: Test plugin greeting
137
136
  strategy: public
138
137
  browser: false
139
-
140
- pipeline:
141
- - evaluate: "() => [{ message: 'hello from plugin' }]"
142
-
143
- columns: [message]
144
138
  `);
145
139
  await discoverPlugins();
146
140
  const registry = getRegistry();
147
141
  const cmd = registry.get('__test-plugin__/greeting');
148
- expect(cmd).toBeDefined();
149
- expect(cmd.site).toBe('__test-plugin__');
150
- expect(cmd.name).toBe('greeting');
151
- expect(cmd.description).toBe('Test plugin greeting');
142
+ expect(cmd).toBeUndefined();
152
143
  });
153
144
  it('handles non-existent plugins directory gracefully', async () => {
154
145
  // discoverPlugins should not throw if ~/.opencli/plugins/ does not exist
155
146
  await expect(discoverPlugins()).resolves.not.toThrow();
156
147
  });
157
- it('discovers YAML plugins from symlinked plugin directories', async () => {
148
+ it('ignores YAML files in symlinked plugin directories (YAML format removed)', async () => {
158
149
  await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });
159
150
  await fs.promises.mkdir(symlinkTargetDir, { recursive: true });
160
151
  await fs.promises.writeFile(path.join(symlinkTargetDir, 'hello.yaml'), `
@@ -163,17 +154,11 @@ name: hello
163
154
  description: Test plugin greeting via symlink
164
155
  strategy: public
165
156
  browser: false
166
-
167
- pipeline:
168
- - evaluate: "() => [{ message: 'hello from symlink plugin' }]"
169
-
170
- columns: [message]
171
157
  `);
172
158
  await fs.promises.symlink(symlinkTargetDir, symlinkPluginDir, 'dir');
173
159
  await discoverPlugins();
174
160
  const cmd = getRegistry().get('__test-plugin-symlink__/hello');
175
- expect(cmd).toBeDefined();
176
- expect(cmd.description).toBe('Test plugin greeting via symlink');
161
+ expect(cmd).toBeUndefined();
177
162
  });
178
163
  it('skips broken plugin symlinks without throwing', async () => {
179
164
  await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });