@jackwener/opencli 1.6.8 → 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 (572) hide show
  1. package/README.md +117 -59
  2. package/README.zh-CN.md +123 -79
  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/jianyu/search.d.ts +14 -0
  136. package/dist/clis/jianyu/search.js +135 -0
  137. package/dist/clis/jianyu/search.test.d.ts +1 -0
  138. package/dist/clis/jianyu/search.test.js +23 -0
  139. package/dist/clis/jike/post.d.ts +1 -0
  140. package/dist/clis/jike/post.js +61 -0
  141. package/dist/clis/jike/topic.d.ts +1 -0
  142. package/dist/clis/jike/topic.js +51 -0
  143. package/dist/clis/jike/user.d.ts +1 -0
  144. package/dist/clis/jike/user.js +50 -0
  145. package/dist/clis/jimeng/generate.d.ts +1 -0
  146. package/dist/clis/jimeng/generate.js +83 -0
  147. package/dist/clis/jimeng/history.d.ts +1 -0
  148. package/dist/clis/jimeng/history.js +47 -0
  149. package/dist/clis/jimeng/new.d.ts +1 -0
  150. package/dist/clis/jimeng/new.js +43 -0
  151. package/dist/clis/jimeng/workspaces.d.ts +1 -0
  152. package/dist/clis/jimeng/workspaces.js +41 -0
  153. package/dist/clis/linux-do/categories.d.ts +1 -0
  154. package/dist/clis/linux-do/categories.js +65 -0
  155. package/dist/clis/linux-do/search.d.ts +1 -0
  156. package/dist/clis/linux-do/search.js +41 -0
  157. package/dist/clis/linux-do/tags.d.ts +1 -0
  158. package/dist/clis/linux-do/tags.js +39 -0
  159. package/dist/clis/linux-do/topic-content.test.js +5 -5
  160. package/dist/clis/linux-do/topic.d.ts +1 -0
  161. package/dist/clis/linux-do/topic.js +56 -0
  162. package/dist/clis/linux-do/user-posts.d.ts +1 -0
  163. package/dist/clis/linux-do/user-posts.js +61 -0
  164. package/dist/clis/linux-do/user-topics.d.ts +1 -0
  165. package/dist/clis/linux-do/user-topics.js +48 -0
  166. package/dist/clis/lobsters/active.d.ts +1 -0
  167. package/dist/clis/lobsters/active.js +26 -0
  168. package/dist/clis/lobsters/hot.d.ts +1 -0
  169. package/dist/clis/lobsters/hot.js +26 -0
  170. package/dist/clis/lobsters/newest.d.ts +1 -0
  171. package/dist/clis/lobsters/newest.js +26 -0
  172. package/dist/clis/lobsters/tag.d.ts +1 -0
  173. package/dist/clis/lobsters/tag.js +32 -0
  174. package/dist/clis/pixiv/detail.d.ts +1 -0
  175. package/dist/clis/pixiv/detail.js +58 -0
  176. package/dist/clis/pixiv/ranking.d.ts +1 -0
  177. package/dist/clis/pixiv/ranking.js +59 -0
  178. package/dist/clis/pixiv/user.d.ts +1 -0
  179. package/dist/clis/pixiv/user.js +52 -0
  180. package/dist/clis/quark/ls.d.ts +1 -0
  181. package/dist/clis/quark/ls.js +63 -0
  182. package/dist/clis/quark/mkdir.d.ts +1 -0
  183. package/dist/clis/quark/mkdir.js +36 -0
  184. package/dist/clis/quark/mv.d.ts +1 -0
  185. package/dist/clis/quark/mv.js +53 -0
  186. package/dist/clis/quark/rename.d.ts +1 -0
  187. package/dist/clis/quark/rename.js +26 -0
  188. package/dist/clis/quark/rm.d.ts +1 -0
  189. package/dist/clis/quark/rm.js +24 -0
  190. package/dist/clis/quark/save.d.ts +1 -0
  191. package/dist/clis/quark/save.js +80 -0
  192. package/dist/clis/quark/share-tree.d.ts +1 -0
  193. package/dist/clis/quark/share-tree.js +45 -0
  194. package/dist/clis/quark/utils.d.ts +50 -0
  195. package/dist/clis/quark/utils.js +146 -0
  196. package/dist/clis/quark/utils.test.d.ts +1 -0
  197. package/dist/clis/quark/utils.test.js +58 -0
  198. package/dist/clis/reddit/frontpage.d.ts +1 -0
  199. package/dist/clis/reddit/frontpage.js +31 -0
  200. package/dist/clis/reddit/hot.d.ts +1 -0
  201. package/dist/clis/reddit/hot.js +45 -0
  202. package/dist/clis/reddit/popular.d.ts +1 -0
  203. package/dist/clis/reddit/popular.js +41 -0
  204. package/dist/clis/reddit/search.d.ts +1 -0
  205. package/dist/clis/reddit/search.js +65 -0
  206. package/dist/clis/reddit/subreddit.d.ts +1 -0
  207. package/dist/clis/reddit/subreddit.js +52 -0
  208. package/dist/clis/reddit/user-comments.d.ts +1 -0
  209. package/dist/clis/reddit/user-comments.js +44 -0
  210. package/dist/clis/reddit/user-posts.d.ts +1 -0
  211. package/dist/clis/reddit/user-posts.js +42 -0
  212. package/dist/clis/reddit/user.d.ts +1 -0
  213. package/dist/clis/reddit/user.js +37 -0
  214. package/dist/clis/stackoverflow/bounties.d.ts +1 -0
  215. package/dist/clis/stackoverflow/bounties.js +27 -0
  216. package/dist/clis/stackoverflow/hot.d.ts +1 -0
  217. package/dist/clis/stackoverflow/hot.js +24 -0
  218. package/dist/clis/stackoverflow/search.d.ts +1 -0
  219. package/dist/clis/stackoverflow/search.js +27 -0
  220. package/dist/clis/stackoverflow/unanswered.d.ts +1 -0
  221. package/dist/clis/stackoverflow/unanswered.js +26 -0
  222. package/dist/clis/steam/top-sellers.d.ts +1 -0
  223. package/dist/clis/steam/top-sellers.js +25 -0
  224. package/dist/clis/taobao/add-cart.d.ts +1 -0
  225. package/dist/clis/taobao/add-cart.js +149 -0
  226. package/dist/clis/taobao/cart.d.ts +1 -0
  227. package/dist/clis/taobao/cart.js +95 -0
  228. package/dist/clis/taobao/commands.test.d.ts +5 -0
  229. package/dist/clis/taobao/commands.test.js +64 -0
  230. package/dist/clis/taobao/detail.d.ts +1 -0
  231. package/dist/clis/taobao/detail.js +70 -0
  232. package/dist/clis/taobao/reviews.d.ts +1 -0
  233. package/dist/clis/taobao/reviews.js +76 -0
  234. package/dist/clis/taobao/search.d.ts +1 -0
  235. package/dist/clis/taobao/search.js +96 -0
  236. package/dist/clis/tiktok/comment.d.ts +1 -0
  237. package/dist/clis/tiktok/comment.js +57 -0
  238. package/dist/clis/tiktok/explore.d.ts +1 -0
  239. package/dist/clis/tiktok/explore.js +35 -0
  240. package/dist/clis/tiktok/follow.d.ts +1 -0
  241. package/dist/clis/tiktok/follow.js +39 -0
  242. package/dist/clis/tiktok/following.d.ts +1 -0
  243. package/dist/clis/tiktok/following.js +42 -0
  244. package/dist/clis/tiktok/friends.d.ts +1 -0
  245. package/dist/clis/tiktok/friends.js +43 -0
  246. package/dist/clis/tiktok/like.d.ts +1 -0
  247. package/dist/clis/tiktok/like.js +33 -0
  248. package/dist/clis/tiktok/live.d.ts +1 -0
  249. package/dist/clis/tiktok/live.js +47 -0
  250. package/dist/clis/tiktok/notifications.d.ts +1 -0
  251. package/dist/clis/tiktok/notifications.js +49 -0
  252. package/dist/clis/tiktok/profile.d.ts +1 -0
  253. package/dist/clis/tiktok/profile.js +54 -0
  254. package/dist/clis/tiktok/save.d.ts +1 -0
  255. package/dist/clis/tiktok/save.js +29 -0
  256. package/dist/clis/tiktok/search.d.ts +1 -0
  257. package/dist/clis/tiktok/search.js +39 -0
  258. package/dist/clis/tiktok/unfollow.d.ts +1 -0
  259. package/dist/clis/tiktok/unfollow.js +44 -0
  260. package/dist/clis/tiktok/unlike.d.ts +1 -0
  261. package/dist/clis/tiktok/unlike.js +33 -0
  262. package/dist/clis/tiktok/unsave.d.ts +1 -0
  263. package/dist/clis/tiktok/unsave.js +31 -0
  264. package/dist/clis/tiktok/user.d.ts +1 -0
  265. package/dist/clis/tiktok/user.js +41 -0
  266. package/dist/clis/twitter/reply.js +3 -8
  267. package/dist/clis/twitter/reply.test.js +5 -5
  268. package/dist/clis/v2ex/hot.d.ts +1 -0
  269. package/dist/clis/v2ex/hot.js +25 -0
  270. package/dist/clis/v2ex/latest.d.ts +1 -0
  271. package/dist/clis/v2ex/latest.js +25 -0
  272. package/dist/clis/v2ex/member.d.ts +1 -0
  273. package/dist/clis/v2ex/member.js +27 -0
  274. package/dist/clis/v2ex/node.d.ts +1 -0
  275. package/dist/clis/v2ex/node.js +38 -0
  276. package/dist/clis/v2ex/nodes.d.ts +1 -0
  277. package/dist/clis/v2ex/nodes.js +25 -0
  278. package/dist/clis/v2ex/replies.d.ts +1 -0
  279. package/dist/clis/v2ex/replies.js +26 -0
  280. package/dist/clis/v2ex/topic.d.ts +1 -0
  281. package/dist/clis/v2ex/topic.js +30 -0
  282. package/dist/clis/v2ex/user.d.ts +1 -0
  283. package/dist/clis/v2ex/user.js +33 -0
  284. package/dist/clis/xiaoe/catalog.d.ts +1 -0
  285. package/dist/clis/xiaoe/catalog.js +125 -0
  286. package/dist/clis/xiaoe/content.d.ts +1 -0
  287. package/dist/clis/xiaoe/content.js +39 -0
  288. package/dist/clis/xiaoe/courses.d.ts +1 -0
  289. package/dist/clis/xiaoe/courses.js +69 -0
  290. package/dist/clis/xiaoe/detail.d.ts +1 -0
  291. package/dist/clis/xiaoe/detail.js +35 -0
  292. package/dist/clis/xiaoe/play-url.d.ts +1 -0
  293. package/dist/clis/xiaoe/play-url.js +120 -0
  294. package/dist/clis/xiaohongshu/feed.d.ts +1 -0
  295. package/dist/clis/xiaohongshu/feed.js +32 -0
  296. package/dist/clis/xiaohongshu/note.js +8 -3
  297. package/dist/clis/xiaohongshu/note.test.js +11 -0
  298. package/dist/clis/xiaohongshu/notifications.d.ts +1 -0
  299. package/dist/clis/xiaohongshu/notifications.js +38 -0
  300. package/dist/clis/xueqiu/earnings-date.d.ts +1 -0
  301. package/dist/clis/xueqiu/earnings-date.js +61 -0
  302. package/dist/clis/xueqiu/feed.d.ts +1 -0
  303. package/dist/clis/xueqiu/feed.js +48 -0
  304. package/dist/clis/xueqiu/groups.d.ts +1 -0
  305. package/dist/clis/xueqiu/groups.js +25 -0
  306. package/dist/clis/xueqiu/hot-stock.d.ts +1 -0
  307. package/dist/clis/xueqiu/hot-stock.js +44 -0
  308. package/dist/clis/xueqiu/hot.d.ts +1 -0
  309. package/dist/clis/xueqiu/hot.js +44 -0
  310. package/dist/clis/xueqiu/kline.d.ts +1 -0
  311. package/dist/clis/xueqiu/kline.js +64 -0
  312. package/dist/clis/xueqiu/search.d.ts +1 -0
  313. package/dist/clis/xueqiu/search.js +49 -0
  314. package/dist/clis/xueqiu/stock.d.ts +1 -0
  315. package/dist/clis/xueqiu/stock.js +72 -0
  316. package/dist/clis/xueqiu/watchlist.d.ts +1 -0
  317. package/dist/clis/xueqiu/watchlist.js +45 -0
  318. package/dist/clis/zhihu/answer.d.ts +1 -0
  319. package/dist/clis/zhihu/answer.js +194 -0
  320. package/dist/clis/zhihu/answer.test.d.ts +1 -0
  321. package/dist/clis/zhihu/answer.test.js +81 -0
  322. package/dist/clis/zhihu/comment.d.ts +1 -0
  323. package/dist/clis/zhihu/comment.js +335 -0
  324. package/dist/clis/zhihu/comment.test.d.ts +1 -0
  325. package/dist/clis/zhihu/comment.test.js +54 -0
  326. package/dist/clis/zhihu/favorite.d.ts +1 -0
  327. package/dist/clis/zhihu/favorite.js +224 -0
  328. package/dist/clis/zhihu/favorite.test.d.ts +1 -0
  329. package/dist/clis/zhihu/favorite.test.js +196 -0
  330. package/dist/clis/zhihu/follow.d.ts +1 -0
  331. package/dist/clis/zhihu/follow.js +80 -0
  332. package/dist/clis/zhihu/follow.test.d.ts +1 -0
  333. package/dist/clis/zhihu/follow.test.js +45 -0
  334. package/dist/clis/zhihu/hot.d.ts +1 -0
  335. package/dist/clis/zhihu/hot.js +43 -0
  336. package/dist/clis/zhihu/like.d.ts +1 -0
  337. package/dist/clis/zhihu/like.js +91 -0
  338. package/dist/clis/zhihu/like.test.d.ts +1 -0
  339. package/dist/clis/zhihu/like.test.js +64 -0
  340. package/dist/clis/zhihu/search.d.ts +1 -0
  341. package/dist/clis/zhihu/search.js +52 -0
  342. package/dist/clis/zhihu/target.d.ts +24 -0
  343. package/dist/clis/zhihu/target.js +91 -0
  344. package/dist/clis/zhihu/target.test.d.ts +1 -0
  345. package/dist/clis/zhihu/target.test.js +77 -0
  346. package/dist/clis/zhihu/write-shared.d.ts +32 -0
  347. package/dist/clis/zhihu/write-shared.js +221 -0
  348. package/dist/clis/zhihu/write-shared.test.d.ts +1 -0
  349. package/dist/clis/zhihu/write-shared.test.js +175 -0
  350. package/dist/src/browser/bridge.d.ts +2 -0
  351. package/dist/src/browser/bridge.js +30 -24
  352. package/dist/src/browser/daemon-client.d.ts +30 -10
  353. package/dist/src/browser/daemon-client.js +42 -27
  354. package/dist/src/browser/daemon-client.test.js +32 -25
  355. package/dist/src/browser/dom-helpers.test.js +3 -2
  356. package/dist/src/browser/errors.d.ts +26 -1
  357. package/dist/src/browser/errors.js +40 -7
  358. package/dist/src/browser/errors.test.d.ts +1 -0
  359. package/dist/src/browser/errors.test.js +51 -0
  360. package/dist/src/browser/index.d.ts +2 -1
  361. package/dist/src/browser/index.js +1 -1
  362. package/dist/src/browser/page.d.ts +9 -8
  363. package/dist/src/browser/page.js +33 -31
  364. package/dist/src/browser.test.js +27 -8
  365. package/dist/src/build-manifest.d.ts +5 -11
  366. package/dist/src/build-manifest.js +6 -75
  367. package/dist/src/build-manifest.test.js +1 -39
  368. package/dist/src/cascade.js +3 -2
  369. package/dist/src/cli.d.ts +3 -3
  370. package/dist/src/cli.js +73 -65
  371. package/dist/src/cli.test.js +20 -15
  372. package/dist/src/clis/binance/asks.d.ts +1 -0
  373. package/dist/src/clis/binance/asks.js +20 -0
  374. package/dist/src/clis/binance/commands.test.d.ts +3 -0
  375. package/dist/src/clis/binance/commands.test.js +58 -0
  376. package/dist/src/clis/binance/depth.d.ts +1 -0
  377. package/dist/src/clis/binance/depth.js +20 -0
  378. package/dist/src/clis/binance/gainers.d.ts +1 -0
  379. package/dist/src/clis/binance/gainers.js +21 -0
  380. package/dist/src/clis/binance/klines.d.ts +1 -0
  381. package/dist/src/clis/binance/klines.js +20 -0
  382. package/dist/src/clis/binance/losers.d.ts +1 -0
  383. package/dist/src/clis/binance/losers.js +21 -0
  384. package/dist/src/clis/binance/pairs.d.ts +1 -0
  385. package/dist/src/clis/binance/pairs.js +20 -0
  386. package/dist/src/clis/binance/price.d.ts +1 -0
  387. package/dist/src/clis/binance/price.js +17 -0
  388. package/dist/src/clis/binance/prices.d.ts +1 -0
  389. package/dist/src/clis/binance/prices.js +18 -0
  390. package/dist/src/clis/binance/ticker.d.ts +1 -0
  391. package/dist/src/clis/binance/ticker.js +20 -0
  392. package/dist/src/clis/binance/top.d.ts +1 -0
  393. package/dist/src/clis/binance/top.js +20 -0
  394. package/dist/src/clis/binance/trades.d.ts +1 -0
  395. package/dist/src/clis/binance/trades.js +19 -0
  396. package/dist/src/commanderAdapter.js +19 -6
  397. package/dist/src/completion-fast.d.ts +25 -0
  398. package/dist/src/completion-fast.js +140 -0
  399. package/dist/src/completion.d.ts +1 -0
  400. package/dist/src/completion.js +1 -0
  401. package/dist/src/diagnostic.d.ts +1 -0
  402. package/dist/src/diagnostic.js +64 -2
  403. package/dist/src/diagnostic.test.js +93 -3
  404. package/dist/src/discovery.d.ts +3 -3
  405. package/dist/src/discovery.js +34 -97
  406. package/dist/src/doctor.d.ts +2 -0
  407. package/dist/src/doctor.js +59 -31
  408. package/dist/src/doctor.test.js +89 -16
  409. package/dist/src/download/index.d.ts +1 -1
  410. package/dist/src/engine.test.js +4 -19
  411. package/dist/src/execution.js +1 -13
  412. package/dist/src/explore.js +1 -1
  413. package/dist/src/generate-verified.d.ts +105 -0
  414. package/dist/src/generate-verified.js +696 -0
  415. package/dist/src/generate-verified.test.d.ts +1 -0
  416. package/dist/src/generate-verified.test.js +925 -0
  417. package/dist/src/generate.d.ts +11 -6
  418. package/dist/src/generate.js +4 -7
  419. package/dist/src/main.js +65 -12
  420. package/dist/src/pipeline/steps/download.d.ts +1 -17
  421. package/dist/src/pipeline/steps/download.js +20 -31
  422. package/dist/src/pipeline/steps/intercept.d.ts +1 -1
  423. package/dist/src/pipeline/steps/intercept.js +1 -1
  424. package/dist/src/pipeline/steps/tap.d.ts +1 -1
  425. package/dist/src/pipeline/steps/tap.js +1 -1
  426. package/dist/src/plugin-scaffold.d.ts +2 -2
  427. package/dist/src/plugin-scaffold.js +24 -21
  428. package/dist/src/plugin-scaffold.test.js +1 -1
  429. package/dist/src/plugin.d.ts +3 -2
  430. package/dist/src/plugin.js +29 -14
  431. package/dist/src/plugin.test.js +47 -32
  432. package/dist/src/record.js +26 -25
  433. package/dist/src/runtime-detect.js +3 -7
  434. package/dist/src/scripts/framework.d.ts +3 -0
  435. package/dist/src/scripts/framework.js +8 -4
  436. package/dist/src/scripts/store.d.ts +5 -1
  437. package/dist/src/scripts/store.js +5 -1
  438. package/dist/src/skill-generate.d.ts +30 -0
  439. package/dist/src/skill-generate.js +75 -0
  440. package/dist/src/skill-generate.test.d.ts +1 -0
  441. package/dist/src/skill-generate.test.js +173 -0
  442. package/dist/src/synthesize.d.ts +1 -1
  443. package/dist/src/synthesize.js +7 -8
  444. package/dist/src/types.d.ts +3 -1
  445. package/package.json +5 -5
  446. package/dist/clis/bilibili/hot.yaml +0 -38
  447. package/dist/clis/bluesky/feeds.yaml +0 -29
  448. package/dist/clis/bluesky/followers.yaml +0 -33
  449. package/dist/clis/bluesky/following.yaml +0 -33
  450. package/dist/clis/bluesky/profile.yaml +0 -27
  451. package/dist/clis/bluesky/search.yaml +0 -34
  452. package/dist/clis/bluesky/starter-packs.yaml +0 -34
  453. package/dist/clis/bluesky/thread.yaml +0 -32
  454. package/dist/clis/bluesky/trending.yaml +0 -27
  455. package/dist/clis/bluesky/user.yaml +0 -34
  456. package/dist/clis/devto/tag.yaml +0 -34
  457. package/dist/clis/devto/top.yaml +0 -29
  458. package/dist/clis/devto/user.yaml +0 -33
  459. package/dist/clis/dictionary/examples.yaml +0 -25
  460. package/dist/clis/dictionary/search.yaml +0 -27
  461. package/dist/clis/dictionary/synonyms.yaml +0 -25
  462. package/dist/clis/douban/subject.yaml +0 -107
  463. package/dist/clis/douban/top250.yaml +0 -70
  464. package/dist/clis/facebook/add-friend.yaml +0 -43
  465. package/dist/clis/facebook/events.yaml +0 -44
  466. package/dist/clis/facebook/feed.yaml +0 -63
  467. package/dist/clis/facebook/friends.yaml +0 -42
  468. package/dist/clis/facebook/groups.yaml +0 -50
  469. package/dist/clis/facebook/join-group.yaml +0 -44
  470. package/dist/clis/facebook/memories.yaml +0 -39
  471. package/dist/clis/facebook/notifications.yaml +0 -40
  472. package/dist/clis/facebook/profile.yaml +0 -37
  473. package/dist/clis/facebook/search.yaml +0 -47
  474. package/dist/clis/hackernews/ask.yaml +0 -38
  475. package/dist/clis/hackernews/best.yaml +0 -38
  476. package/dist/clis/hackernews/jobs.yaml +0 -36
  477. package/dist/clis/hackernews/new.yaml +0 -38
  478. package/dist/clis/hackernews/search.yaml +0 -44
  479. package/dist/clis/hackernews/show.yaml +0 -38
  480. package/dist/clis/hackernews/top.yaml +0 -38
  481. package/dist/clis/hackernews/user.yaml +0 -25
  482. package/dist/clis/hupu/hot.yaml +0 -43
  483. package/dist/clis/instagram/comment.yaml +0 -52
  484. package/dist/clis/instagram/explore.yaml +0 -43
  485. package/dist/clis/instagram/follow.yaml +0 -41
  486. package/dist/clis/instagram/followers.yaml +0 -51
  487. package/dist/clis/instagram/following.yaml +0 -51
  488. package/dist/clis/instagram/like.yaml +0 -46
  489. package/dist/clis/instagram/profile.yaml +0 -42
  490. package/dist/clis/instagram/save.yaml +0 -46
  491. package/dist/clis/instagram/saved.yaml +0 -40
  492. package/dist/clis/instagram/search.yaml +0 -44
  493. package/dist/clis/instagram/unfollow.yaml +0 -38
  494. package/dist/clis/instagram/unlike.yaml +0 -46
  495. package/dist/clis/instagram/unsave.yaml +0 -46
  496. package/dist/clis/instagram/user.yaml +0 -54
  497. package/dist/clis/jike/post.yaml +0 -59
  498. package/dist/clis/jike/topic.yaml +0 -53
  499. package/dist/clis/jike/user.yaml +0 -52
  500. package/dist/clis/jimeng/generate.yaml +0 -85
  501. package/dist/clis/jimeng/history.yaml +0 -46
  502. package/dist/clis/linux-do/categories.yaml +0 -70
  503. package/dist/clis/linux-do/search.yaml +0 -48
  504. package/dist/clis/linux-do/tags.yaml +0 -41
  505. package/dist/clis/linux-do/topic.yaml +0 -62
  506. package/dist/clis/linux-do/user-posts.yaml +0 -67
  507. package/dist/clis/linux-do/user-topics.yaml +0 -54
  508. package/dist/clis/lobsters/active.yaml +0 -29
  509. package/dist/clis/lobsters/hot.yaml +0 -29
  510. package/dist/clis/lobsters/newest.yaml +0 -29
  511. package/dist/clis/lobsters/tag.yaml +0 -34
  512. package/dist/clis/pixiv/detail.yaml +0 -49
  513. package/dist/clis/pixiv/ranking.yaml +0 -53
  514. package/dist/clis/pixiv/user.yaml +0 -46
  515. package/dist/clis/reddit/frontpage.yaml +0 -30
  516. package/dist/clis/reddit/hot.yaml +0 -47
  517. package/dist/clis/reddit/popular.yaml +0 -40
  518. package/dist/clis/reddit/search.yaml +0 -61
  519. package/dist/clis/reddit/subreddit.yaml +0 -50
  520. package/dist/clis/reddit/user-comments.yaml +0 -46
  521. package/dist/clis/reddit/user-posts.yaml +0 -44
  522. package/dist/clis/reddit/user.yaml +0 -40
  523. package/dist/clis/stackoverflow/bounties.yaml +0 -29
  524. package/dist/clis/stackoverflow/hot.yaml +0 -28
  525. package/dist/clis/stackoverflow/search.yaml +0 -33
  526. package/dist/clis/stackoverflow/unanswered.yaml +0 -28
  527. package/dist/clis/steam/top-sellers.yaml +0 -29
  528. package/dist/clis/tiktok/comment.yaml +0 -66
  529. package/dist/clis/tiktok/explore.yaml +0 -39
  530. package/dist/clis/tiktok/follow.yaml +0 -39
  531. package/dist/clis/tiktok/following.yaml +0 -46
  532. package/dist/clis/tiktok/friends.yaml +0 -47
  533. package/dist/clis/tiktok/like.yaml +0 -38
  534. package/dist/clis/tiktok/live.yaml +0 -51
  535. package/dist/clis/tiktok/notifications.yaml +0 -52
  536. package/dist/clis/tiktok/profile.yaml +0 -45
  537. package/dist/clis/tiktok/save.yaml +0 -34
  538. package/dist/clis/tiktok/search.yaml +0 -47
  539. package/dist/clis/tiktok/unfollow.yaml +0 -44
  540. package/dist/clis/tiktok/unlike.yaml +0 -38
  541. package/dist/clis/tiktok/unsave.yaml +0 -36
  542. package/dist/clis/tiktok/user.yaml +0 -44
  543. package/dist/clis/v2ex/hot.yaml +0 -28
  544. package/dist/clis/v2ex/latest.yaml +0 -28
  545. package/dist/clis/v2ex/member.yaml +0 -29
  546. package/dist/clis/v2ex/node.yaml +0 -34
  547. package/dist/clis/v2ex/nodes.yaml +0 -31
  548. package/dist/clis/v2ex/replies.yaml +0 -32
  549. package/dist/clis/v2ex/topic.yaml +0 -33
  550. package/dist/clis/v2ex/user.yaml +0 -34
  551. package/dist/clis/xiaoe/catalog.yaml +0 -129
  552. package/dist/clis/xiaoe/content.yaml +0 -43
  553. package/dist/clis/xiaoe/courses.yaml +0 -73
  554. package/dist/clis/xiaoe/detail.yaml +0 -39
  555. package/dist/clis/xiaoe/play-url.yaml +0 -124
  556. package/dist/clis/xiaohongshu/feed.yaml +0 -31
  557. package/dist/clis/xiaohongshu/notifications.yaml +0 -37
  558. package/dist/clis/xueqiu/earnings-date.yaml +0 -69
  559. package/dist/clis/xueqiu/feed.yaml +0 -53
  560. package/dist/clis/xueqiu/groups.yaml +0 -23
  561. package/dist/clis/xueqiu/hot-stock.yaml +0 -49
  562. package/dist/clis/xueqiu/hot.yaml +0 -46
  563. package/dist/clis/xueqiu/kline.yaml +0 -65
  564. package/dist/clis/xueqiu/search.yaml +0 -55
  565. package/dist/clis/xueqiu/stock.yaml +0 -69
  566. package/dist/clis/xueqiu/watchlist.yaml +0 -46
  567. package/dist/clis/zhihu/hot.yaml +0 -46
  568. package/dist/clis/zhihu/search.yaml +0 -59
  569. package/dist/src/browser/discover.d.ts +0 -15
  570. package/dist/src/browser/discover.js +0 -19
  571. package/dist/src/yaml-schema.d.ts +0 -29
  572. package/dist/src/yaml-schema.js +0 -22
@@ -1,14 +1,11 @@
1
1
  /**
2
2
  * Generate: one-shot CLI creation from URL.
3
3
  *
4
- * Orchestrates the full pipeline:
5
- * explore (Deep Explore) → synthesize (YAML generation) register → verify
6
- *
7
- * Includes Strategy Cascade: if the initial strategy fails,
8
- * automatically downgrades and retries.
4
+ * Orchestrates the pipeline:
5
+ * explore (Deep Explore) → synthesize (YAML generation + candidate ranking)
9
6
  */
10
7
  import type { IBrowserFactory } from './runtime.js';
11
- import { type SynthesizeCandidateSummary } from './synthesize.js';
8
+ import { type SynthesizeCandidateSummary, type SynthesizeResult } from './synthesize.js';
12
9
  export interface GenerateCliOptions {
13
10
  url: string;
14
11
  BrowserFactory: new () => IBrowserFactory;
@@ -37,5 +34,13 @@ export interface GenerateCliResult {
37
34
  candidates: Array<Pick<SynthesizeCandidateSummary, 'name' | 'strategy'>>;
38
35
  };
39
36
  }
37
+ /**
38
+ * Normalize a goal string to a standard capability name.
39
+ */
40
+ export declare function normalizeGoal(goal?: string | null): string | null;
41
+ /**
42
+ * Select the best candidate matching the user's goal.
43
+ */
44
+ export declare function selectCandidate(candidates: SynthesizeResult['candidates'], goal?: string | null): SynthesizeCandidateSummary | null;
40
45
  export declare function generateCliFromUrl(opts: GenerateCliOptions): Promise<GenerateCliResult>;
41
46
  export declare function renderGenerateSummary(r: GenerateCliResult): string;
@@ -1,11 +1,8 @@
1
1
  /**
2
2
  * Generate: one-shot CLI creation from URL.
3
3
  *
4
- * Orchestrates the full pipeline:
5
- * explore (Deep Explore) → synthesize (YAML generation) register → verify
6
- *
7
- * Includes Strategy Cascade: if the initial strategy fails,
8
- * automatically downgrades and retries.
4
+ * Orchestrates the pipeline:
5
+ * explore (Deep Explore) → synthesize (YAML generation + candidate ranking)
9
6
  */
10
7
  import { exploreUrl } from './explore.js';
11
8
  import { synthesizeFromExplore } from './synthesize.js';
@@ -23,7 +20,7 @@ const CAPABILITY_ALIASES = {
23
20
  /**
24
21
  * Normalize a goal string to a standard capability name.
25
22
  */
26
- function normalizeGoal(goal) {
23
+ export function normalizeGoal(goal) {
27
24
  if (!goal)
28
25
  return null;
29
26
  const lower = goal.trim().toLowerCase();
@@ -36,7 +33,7 @@ function normalizeGoal(goal) {
36
33
  /**
37
34
  * Select the best candidate matching the user's goal.
38
35
  */
39
- function selectCandidate(candidates, goal) {
36
+ export function selectCandidate(candidates, goal) {
40
37
  if (!candidates.length)
41
38
  return null;
42
39
  if (!goal)
package/dist/src/main.js CHANGED
@@ -12,20 +12,75 @@ if (process.platform !== 'win32') {
12
12
  cur.add(p);
13
13
  process.env.PATH = [...cur].join(':');
14
14
  }
15
+ import * as fs from 'node:fs';
16
+ import * as os from 'node:os';
15
17
  import * as path from 'node:path';
16
18
  import { fileURLToPath } from 'node:url';
17
- import { discoverClis, discoverPlugins, ensureUserCliCompatShims, ensureUserAdapters, USER_CLIS_DIR } from './discovery.js';
18
- import { getCompletions } from './completion.js';
19
- import { runCli } from './cli.js';
20
- import { emitHook } from './hooks.js';
21
- import { installNodeNetwork } from './node-network.js';
22
- import { registerUpdateNoticeOnExit, checkForUpdateBackground } from './update-check.js';
19
+ import { getCompletionsFromManifest, hasAllManifests, printCompletionScriptFast } from './completion-fast.js';
20
+ import { getCliManifestPath } from './package-paths.js';
21
+ import { PKG_VERSION } from './version.js';
23
22
  import { EXIT_CODES } from './errors.js';
24
- installNodeNetwork();
25
23
  const __filename = fileURLToPath(import.meta.url);
26
24
  const __dirname = path.dirname(__filename);
27
25
  const BUILTIN_CLIS = path.resolve(__dirname, '..', 'clis');
28
- const USER_CLIS = USER_CLIS_DIR;
26
+ const USER_CLIS = path.join(os.homedir(), '.opencli', 'clis');
27
+ // ── Ultra-fast path: lightweight commands bypass full discovery ──────────
28
+ // These are high-frequency or trivial paths that must not pay the startup tax.
29
+ const argv = process.argv.slice(2);
30
+ // Fast path: --version (only when it's the top-level intent, not passed to a subcommand)
31
+ // e.g. `opencli --version` or `opencli -V`, but NOT `opencli gh --version`
32
+ if (argv[0] === '--version' || argv[0] === '-V') {
33
+ process.stdout.write(PKG_VERSION + '\n');
34
+ process.exit(EXIT_CODES.SUCCESS);
35
+ }
36
+ // Fast path: completion <shell> — print shell script without discovery
37
+ if (argv[0] === 'completion' && argv.length >= 2) {
38
+ if (printCompletionScriptFast(argv[1])) {
39
+ process.exit(EXIT_CODES.SUCCESS);
40
+ }
41
+ // Unknown shell — fall through to full path for proper error handling
42
+ }
43
+ // Fast path: --get-completions — read from manifest, skip discovery
44
+ const getCompIdx = process.argv.indexOf('--get-completions');
45
+ if (getCompIdx !== -1) {
46
+ // Only require manifest for directories that actually exist.
47
+ // If user clis dir doesn't exist, there are no user adapters to miss.
48
+ const manifestPaths = [getCliManifestPath(BUILTIN_CLIS)];
49
+ try {
50
+ fs.accessSync(USER_CLIS);
51
+ manifestPaths.push(getCliManifestPath(USER_CLIS));
52
+ }
53
+ catch { /* no user dir */ }
54
+ if (hasAllManifests(manifestPaths)) {
55
+ const rest = process.argv.slice(getCompIdx + 1);
56
+ let cursor;
57
+ const words = [];
58
+ for (let i = 0; i < rest.length; i++) {
59
+ if (rest[i] === '--cursor' && i + 1 < rest.length) {
60
+ cursor = parseInt(rest[i + 1], 10);
61
+ i++;
62
+ }
63
+ else {
64
+ words.push(rest[i]);
65
+ }
66
+ }
67
+ if (cursor === undefined)
68
+ cursor = words.length;
69
+ const candidates = getCompletionsFromManifest(words, cursor, manifestPaths);
70
+ process.stdout.write(candidates.join('\n') + '\n');
71
+ process.exit(EXIT_CODES.SUCCESS);
72
+ }
73
+ // No manifest — fall through to full discovery path below
74
+ }
75
+ // ── Full startup path ───────────────────────────────────────────────────
76
+ // Dynamic imports: these are deferred so the fast path above never pays the cost.
77
+ const { discoverClis, discoverPlugins, ensureUserCliCompatShims, ensureUserAdapters } = await import('./discovery.js');
78
+ const { getCompletions } = await import('./completion.js');
79
+ const { runCli } = await import('./cli.js');
80
+ const { emitHook } = await import('./hooks.js');
81
+ const { installNodeNetwork } = await import('./node-network.js');
82
+ const { registerUpdateNoticeOnExit, checkForUpdateBackground } = await import('./update-check.js');
83
+ installNodeNetwork();
29
84
  // Sequential: plugins must run after built-in discovery so they can override built-in commands.
30
85
  await ensureUserCliCompatShims();
31
86
  await ensureUserAdapters();
@@ -35,9 +90,7 @@ await discoverPlugins();
35
90
  registerUpdateNoticeOnExit();
36
91
  // Kick off background fetch for next run (non-blocking)
37
92
  checkForUpdateBackground();
38
- // ── Fast-path: handle --get-completions before commander parses ─────────
39
- // Usage: opencli --get-completions --cursor <N> [word1 word2 ...]
40
- const getCompIdx = process.argv.indexOf('--get-completions');
93
+ // ── Fallback completion: manifest unavailable, use full registry ─────────
41
94
  if (getCompIdx !== -1) {
42
95
  const rest = process.argv.slice(getCompIdx + 1);
43
96
  let cursor;
@@ -45,7 +98,7 @@ if (getCompIdx !== -1) {
45
98
  for (let i = 0; i < rest.length; i++) {
46
99
  if (rest[i] === '--cursor' && i + 1 < rest.length) {
47
100
  cursor = parseInt(rest[i + 1], 10);
48
- i++; // skip the value
101
+ i++;
49
102
  }
50
103
  else {
51
104
  words.push(rest[i]);
@@ -15,20 +15,4 @@ export interface DownloadResult {
15
15
  error?: string;
16
16
  duration?: number;
17
17
  }
18
- /**
19
- * Download step handler for YAML pipelines.
20
- *
21
- * Usage in YAML:
22
- * ```yaml
23
- * pipeline:
24
- * - download:
25
- * url: ${{ item.imageUrl }}
26
- * dir: ./downloads
27
- * filename: ${{ item.title }}.jpg
28
- * concurrency: 5
29
- * skip_existing: true
30
- * use_ytdlp: false
31
- * type: auto
32
- * ```
33
- */
34
- export declare function stepDownload(page: IPage | null, params: any, data: any, args: Record<string, any>): Promise<any>;
18
+ export declare function stepDownload(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
@@ -54,41 +54,31 @@ function dedupeCookies(cookies) {
54
54
  }
55
55
  return [...deduped.values()];
56
56
  }
57
- /**
58
- * Download step handler for YAML pipelines.
59
- *
60
- * Usage in YAML:
61
- * ```yaml
62
- * pipeline:
63
- * - download:
64
- * url: ${{ item.imageUrl }}
65
- * dir: ./downloads
66
- * filename: ${{ item.title }}.jpg
67
- * concurrency: 5
68
- * skip_existing: true
69
- * use_ytdlp: false
70
- * type: auto
71
- * ```
72
- */
73
57
  export async function stepDownload(page, params, data, args) {
74
58
  // Parse parameters with defaults
75
- const urlTemplate = typeof params === 'string' ? params : (params?.url ?? '');
76
- const dirTemplate = params?.dir ?? './downloads';
77
- const filenameTemplate = params?.filename ?? '';
78
- const concurrency = typeof params?.concurrency === 'number' ? params.concurrency : 3;
79
- const skipExisting = params?.skip_existing !== false;
80
- const timeout = typeof params?.timeout === 'number' ? params.timeout * 1000 : 30000;
81
- const useYtdlp = params?.use_ytdlp ?? false;
82
- const ytdlpArgs = Array.isArray(params?.ytdlp_args) ? params.ytdlp_args : [];
83
- const contentType = params?.type ?? 'auto';
84
- const showProgress = params?.progress !== false;
85
- const contentTemplate = params?.content;
86
- const metadataTemplate = params?.metadata;
59
+ const p = typeof params === 'object' && params !== null ? params : {};
60
+ const urlTemplate = typeof params === 'string' ? params : (p.url ?? '');
61
+ const dirTemplate = p.dir ?? './downloads';
62
+ const filenameTemplate = p.filename ?? '';
63
+ const concurrency = typeof p.concurrency === 'number' ? p.concurrency : 3;
64
+ const skipExisting = p.skip_existing !== false;
65
+ const timeout = typeof p.timeout === 'number' ? p.timeout * 1000 : 30000;
66
+ const useYtdlp = p.use_ytdlp ?? false;
67
+ const ytdlpArgs = Array.isArray(p.ytdlp_args)
68
+ ? p.ytdlp_args.map((v) => String(v))
69
+ : [];
70
+ const contentType = p.type ?? 'auto';
71
+ const showProgress = p.progress !== false;
72
+ const contentTemplate = p.content;
73
+ const metadataTemplate = p.metadata;
87
74
  // Resolve output directory
88
75
  const dir = String(render(dirTemplate, { args, data }));
89
76
  fs.mkdirSync(dir, { recursive: true });
90
- // Normalize data to array
91
- const items = Array.isArray(data) ? data : data ? [data] : [];
77
+ // Normalize data to array. Items are row records (string-keyed) produced by
78
+ // upstream steps; we treat them as Record<string, unknown> and narrow per-use.
79
+ const items = Array.isArray(data) ? data
80
+ : data ? [data]
81
+ : [];
92
82
  if (items.length === 0) {
93
83
  return [];
94
84
  }
@@ -128,7 +118,6 @@ export async function stepDownload(page, params, data, args) {
128
118
  }
129
119
  }
130
120
  }
131
- // Process downloads with concurrency
132
121
  const results = await mapConcurrent(items, concurrency, async (item, index) => {
133
122
  const startTime = Date.now();
134
123
  // Render URL
@@ -2,4 +2,4 @@
2
2
  * Pipeline step: intercept — declarative XHR interception.
3
3
  */
4
4
  import type { IPage } from '../../types.js';
5
- export declare function stepIntercept(page: IPage | null, params: any, data: any, args: Record<string, any>): Promise<any>;
5
+ export declare function stepIntercept(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { render, normalizeEvaluateSource } from '../template.js';
5
5
  export async function stepIntercept(page, params, data, args) {
6
- const cfg = typeof params === 'object' ? params : {};
6
+ const cfg = typeof params === 'object' && params !== null ? params : {};
7
7
  const trigger = cfg.trigger ?? '';
8
8
  const capturePattern = cfg.capture ?? '';
9
9
  const timeout = cfg.timeout ?? 8;
@@ -9,4 +9,4 @@
9
9
  * 5. Returns the captured data (optionally sub-selected)
10
10
  */
11
11
  import type { IPage } from '../../types.js';
12
- export declare function stepTap(page: IPage | null, params: any, data: any, args: Record<string, any>): Promise<any>;
12
+ export declare function stepTap(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
@@ -11,7 +11,7 @@
11
11
  import { render } from '../template.js';
12
12
  import { generateTapInterceptorJs } from '../../interceptor.js';
13
13
  export async function stepTap(page, params, data, args) {
14
- const cfg = typeof params === 'object' ? params : {};
14
+ const cfg = typeof params === 'object' && params !== null ? params : {};
15
15
  const storeName = String(render(cfg.store ?? '', { args, data }));
16
16
  const actionName = String(render(cfg.action ?? '', { args, data }));
17
17
  const capturePattern = String(render(cfg.capture ?? '', { args, data }));
@@ -7,8 +7,8 @@
7
7
  * <name>/
8
8
  * opencli-plugin.json — manifest with name, version, description
9
9
  * package.json — ESM package with opencli peer dependency
10
- * hello.yaml — sample YAML command
11
- * greet.ts — sample TS command using the current registry API
10
+ * hello.ts — sample pipeline command
11
+ * greet.ts — sample TS command using func()
12
12
  * README.md — basic documentation
13
13
  */
14
14
  export interface ScaffoldOptions {
@@ -7,8 +7,8 @@
7
7
  * <name>/
8
8
  * opencli-plugin.json — manifest with name, version, description
9
9
  * package.json — ESM package with opencli peer dependency
10
- * hello.yaml — sample YAML command
11
- * greet.ts — sample TS command using the current registry API
10
+ * hello.ts — sample pipeline command
11
+ * greet.ts — sample TS command using func()
12
12
  * README.md — basic documentation
13
13
  */
14
14
  import * as fs from 'node:fs';
@@ -52,26 +52,29 @@ export function createPluginScaffold(name, opts = {}) {
52
52
  };
53
53
  writeFile(targetDir, 'package.json', JSON.stringify(pkg, null, 2) + '\n');
54
54
  files.push('package.json');
55
- // hello.yaml — sample YAML command
56
- const yamlContent = `# Sample YAML command for ${name}
57
- # See: https://github.com/jackwener/opencli#yaml-commands
58
-
59
- site: ${name}
60
- name: hello
61
- description: "A sample YAML command"
62
- strategy: public
63
- browser: false
55
+ // hello.ts — sample pipeline command
56
+ const helloContent = `/**
57
+ * Sample pipeline command for ${name}.
58
+ * Demonstrates the declarative pipeline API.
59
+ */
64
60
 
65
- domain: https://httpbin.org
61
+ import { cli, Strategy } from '@jackwener/opencli/registry';
66
62
 
67
- pipeline:
68
- - fetch:
69
- url: "https://httpbin.org/get?greeting=hello"
70
- method: GET
71
- - select: "args"
63
+ cli({
64
+ site: '${name}',
65
+ name: 'hello',
66
+ description: 'A sample pipeline command',
67
+ strategy: Strategy.PUBLIC,
68
+ browser: false,
69
+ columns: ['greeting'],
70
+ pipeline: [
71
+ { fetch: { url: 'https://httpbin.org/get?greeting=hello' } },
72
+ { select: 'args' },
73
+ ],
74
+ });
72
75
  `;
73
- writeFile(targetDir, 'hello.yaml', yamlContent);
74
- files.push('hello.yaml');
76
+ writeFile(targetDir, 'hello.ts', helloContent);
77
+ files.push('hello.ts');
75
78
  // greet.ts — sample TS command using registry API
76
79
  const tsContent = `/**
77
80
  * Sample TypeScript command for ${name}.
@@ -114,8 +117,8 @@ opencli plugin install github:<user>/opencli-plugin-${name}
114
117
 
115
118
  | Command | Type | Description |
116
119
  |---------|------|-------------|
117
- | \`${name}/hello\` | YAML | Sample YAML command |
118
- | \`${name}/greet\` | TypeScript | Sample TS command |
120
+ | \`${name}/hello\` | Pipeline | Sample pipeline command |
121
+ | \`${name}/greet\` | TypeScript | Sample TS command with func() |
119
122
 
120
123
  ## Development
121
124
 
@@ -25,7 +25,7 @@ describe('createPluginScaffold', () => {
25
25
  expect(result.dir).toBe(dir);
26
26
  expect(result.files).toContain('opencli-plugin.json');
27
27
  expect(result.files).toContain('package.json');
28
- expect(result.files).toContain('hello.yaml');
28
+ expect(result.files).toContain('hello.ts');
29
29
  expect(result.files).toContain('greet.ts');
30
30
  expect(result.files).toContain('README.md');
31
31
  // All files exist
@@ -80,7 +80,7 @@ export declare function writeLockFile(lock: Record<string, LockEntry>): void;
80
80
  export declare function getCommitHash(dir: string): string | undefined;
81
81
  /**
82
82
  * Validate that a downloaded plugin directory is a structurally valid plugin.
83
- * Checks for at least one command file (.yaml, .yml, .ts, .js) and a valid
83
+ * Checks for at least one command file (.ts, .js) and a valid
84
84
  * package.json if it contains .ts files.
85
85
  */
86
86
  export declare function validatePluginStructure(pluginDir: string): ValidationResult;
@@ -142,4 +142,5 @@ declare function parseSource(source: string): ParsedSource | null;
142
142
  * Resolve the path to the esbuild CLI executable with fallback strategies.
143
143
  */
144
144
  export declare function resolveEsbuildBin(): string | null;
145
- export { resolveEsbuildBin as _resolveEsbuildBin, getCommitHash as _getCommitHash, installDependencies as _installDependencies, parseSource as _parseSource, postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle, readLockFile as _readLockFile, readLockFileWithWriter as _readLockFileWithWriter, updateAllPlugins as _updateAllPlugins, validatePluginStructure as _validatePluginStructure, writeLockFile as _writeLockFile, writeLockFileWithFs as _writeLockFileWithFs, isSymlinkSync as _isSymlinkSync, getMonoreposDir as _getMonoreposDir, installLocalPlugin as _installLocalPlugin, isLocalPluginSource as _isLocalPluginSource, moveDir as _moveDir, promoteDir as _promoteDir, replaceDir as _replaceDir, resolvePluginSource as _resolvePluginSource, resolveStoredPluginSource as _resolveStoredPluginSource, toStoredPluginSource as _toStoredPluginSource, toLocalPluginSource as _toLocalPluginSource, };
145
+ declare function resolveHostOpencliRoot(startFile?: string): string;
146
+ export { resolveHostOpencliRoot as _resolveHostOpencliRoot, resolveEsbuildBin as _resolveEsbuildBin, getCommitHash as _getCommitHash, installDependencies as _installDependencies, parseSource as _parseSource, postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle, readLockFile as _readLockFile, readLockFileWithWriter as _readLockFileWithWriter, updateAllPlugins as _updateAllPlugins, validatePluginStructure as _validatePluginStructure, writeLockFile as _writeLockFile, writeLockFileWithFs as _writeLockFileWithFs, isSymlinkSync as _isSymlinkSync, getMonoreposDir as _getMonoreposDir, installLocalPlugin as _installLocalPlugin, isLocalPluginSource as _isLocalPluginSource, moveDir as _moveDir, promoteDir as _promoteDir, replaceDir as _replaceDir, resolvePluginSource as _resolvePluginSource, resolveStoredPluginSource as _resolveStoredPluginSource, toStoredPluginSource as _toStoredPluginSource, toLocalPluginSource as _toLocalPluginSource, };
@@ -453,7 +453,7 @@ export function getCommitHash(dir) {
453
453
  }
454
454
  /**
455
455
  * Validate that a downloaded plugin directory is a structurally valid plugin.
456
- * Checks for at least one command file (.yaml, .yml, .ts, .js) and a valid
456
+ * Checks for at least one command file (.ts, .js) and a valid
457
457
  * package.json if it contains .ts files.
458
458
  */
459
459
  export function validatePluginStructure(pluginDir) {
@@ -462,11 +462,10 @@ export function validatePluginStructure(pluginDir) {
462
462
  return { valid: false, errors: ['Plugin directory does not exist'] };
463
463
  }
464
464
  const files = fs.readdirSync(pluginDir);
465
- const hasYaml = files.some(f => f.endsWith('.yaml') || f.endsWith('.yml'));
466
465
  const hasTs = files.some(f => f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts'));
467
466
  const hasJs = files.some(f => f.endsWith('.js') && !f.endsWith('.d.js'));
468
- if (!hasYaml && !hasTs && !hasJs) {
469
- errors.push('No command files found in plugin directory. A plugin must contain at least one .yaml, .ts, or .js command file.');
467
+ if (!hasTs && !hasJs) {
468
+ errors.push('No command files found in plugin directory. A plugin must contain at least one .ts or .js command file.');
470
469
  }
471
470
  if (hasTs) {
472
471
  const pkgJsonPath = path.join(pluginDir, 'package.json');
@@ -981,8 +980,7 @@ function scanPluginCommands(dir) {
981
980
  try {
982
981
  const files = fs.readdirSync(dir);
983
982
  const names = new Set(files
984
- .filter(f => f.endsWith('.yaml') || f.endsWith('.yml') ||
985
- (f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts')) ||
983
+ .filter(f => (f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts')) ||
986
984
  (f.endsWith('.js') && !f.endsWith('.d.js')))
987
985
  .map(f => path.basename(f, path.extname(f))));
988
986
  return [...names];
@@ -1100,11 +1098,7 @@ function parseSource(source) {
1100
1098
  */
1101
1099
  function linkHostOpencli(pluginDir) {
1102
1100
  try {
1103
- // Determine the host opencli package root from this module's location.
1104
- // Both dev (tsx src/plugin.ts) and prod (node dist/plugin.js) are one level
1105
- // deep, so path.dirname + '..' always gives us the package root.
1106
- const thisFile = fileURLToPath(import.meta.url);
1107
- const hostRoot = path.resolve(path.dirname(thisFile), '..');
1101
+ const hostRoot = resolveHostOpencliRoot();
1108
1102
  const targetLink = path.join(pluginDir, 'node_modules', '@jackwener', 'opencli');
1109
1103
  // Remove existing (npm-installed copy or stale symlink)
1110
1104
  if (fs.existsSync(targetLink)) {
@@ -1126,8 +1120,7 @@ function linkHostOpencli(pluginDir) {
1126
1120
  * Resolve the path to the esbuild CLI executable with fallback strategies.
1127
1121
  */
1128
1122
  export function resolveEsbuildBin() {
1129
- const thisFile = fileURLToPath(import.meta.url);
1130
- const hostRoot = path.resolve(path.dirname(thisFile), '..');
1123
+ const hostRoot = resolveHostOpencliRoot();
1131
1124
  // Strategy 1 (Windows): prefer the .cmd wrapper which is executable via shell
1132
1125
  if (isWindows) {
1133
1126
  const cmdPath = path.join(hostRoot, 'node_modules', '.bin', 'esbuild.cmd');
@@ -1180,6 +1173,28 @@ export function resolveEsbuildBin() {
1180
1173
  }
1181
1174
  return null;
1182
1175
  }
1176
+ function resolveHostOpencliRoot(startFile = fileURLToPath(import.meta.url)) {
1177
+ let dir = path.dirname(startFile);
1178
+ while (true) {
1179
+ const pkgPath = path.join(dir, 'package.json');
1180
+ if (fs.existsSync(pkgPath)) {
1181
+ try {
1182
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
1183
+ if (pkg?.name === '@jackwener/opencli') {
1184
+ return dir;
1185
+ }
1186
+ }
1187
+ catch {
1188
+ // Keep walking; a malformed package.json should not hide an ancestor package root.
1189
+ }
1190
+ }
1191
+ const parent = path.dirname(dir);
1192
+ if (parent === dir)
1193
+ break;
1194
+ dir = parent;
1195
+ }
1196
+ return path.resolve(path.dirname(startFile), '..');
1197
+ }
1183
1198
  /**
1184
1199
  * Transpile TS plugin files to JS so they work in production mode.
1185
1200
  * Uses esbuild from the host opencli's node_modules for fast single-file transpilation.
@@ -1218,4 +1233,4 @@ function transpilePluginTs(pluginDir) {
1218
1233
  log.warn(`TS transpilation setup failed: ${getErrorMessage(err)}`);
1219
1234
  }
1220
1235
  }
1221
- export { resolveEsbuildBin as _resolveEsbuildBin, getCommitHash as _getCommitHash, installDependencies as _installDependencies, parseSource as _parseSource, postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle, readLockFile as _readLockFile, readLockFileWithWriter as _readLockFileWithWriter, updateAllPlugins as _updateAllPlugins, validatePluginStructure as _validatePluginStructure, writeLockFile as _writeLockFile, writeLockFileWithFs as _writeLockFileWithFs, isSymlinkSync as _isSymlinkSync, getMonoreposDir as _getMonoreposDir, installLocalPlugin as _installLocalPlugin, isLocalPluginSource as _isLocalPluginSource, moveDir as _moveDir, promoteDir as _promoteDir, replaceDir as _replaceDir, resolvePluginSource as _resolvePluginSource, resolveStoredPluginSource as _resolveStoredPluginSource, toStoredPluginSource as _toStoredPluginSource, toLocalPluginSource as _toLocalPluginSource, };
1236
+ export { resolveHostOpencliRoot as _resolveHostOpencliRoot, resolveEsbuildBin as _resolveEsbuildBin, getCommitHash as _getCommitHash, installDependencies as _installDependencies, parseSource as _parseSource, postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle, readLockFile as _readLockFile, readLockFileWithWriter as _readLockFileWithWriter, updateAllPlugins as _updateAllPlugins, validatePluginStructure as _validatePluginStructure, writeLockFile as _writeLockFile, writeLockFileWithFs as _writeLockFileWithFs, isSymlinkSync as _isSymlinkSync, getMonoreposDir as _getMonoreposDir, installLocalPlugin as _installLocalPlugin, isLocalPluginSource as _isLocalPluginSource, moveDir as _moveDir, promoteDir as _promoteDir, replaceDir as _replaceDir, resolvePluginSource as _resolvePluginSource, resolveStoredPluginSource as _resolveStoredPluginSource, toStoredPluginSource as _toStoredPluginSource, toLocalPluginSource as _toLocalPluginSource, };