@jackwener/opencli 1.6.1 → 1.6.3

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 (1909) hide show
  1. package/README.md +31 -49
  2. package/README.zh-CN.md +37 -39
  3. package/dist/browser/cdp.d.ts +1 -40
  4. package/dist/browser/cdp.js +2 -314
  5. package/dist/browser/page.d.ts +1 -57
  6. package/dist/browser/page.js +2 -222
  7. package/dist/browser/utils.d.ts +1 -10
  8. package/dist/browser/utils.js +2 -27
  9. package/dist/cli-manifest.json +1846 -351
  10. package/dist/clis/1688/item.d.ts +70 -0
  11. package/dist/clis/1688/item.js +187 -0
  12. package/dist/clis/1688/item.test.js +67 -0
  13. package/dist/clis/1688/search.d.ts +56 -0
  14. package/dist/clis/1688/search.js +309 -0
  15. package/dist/clis/1688/search.test.js +75 -0
  16. package/dist/clis/1688/shared.d.ts +112 -0
  17. package/dist/clis/1688/shared.js +514 -0
  18. package/dist/clis/1688/shared.test.js +57 -0
  19. package/dist/clis/1688/store.d.ts +45 -0
  20. package/dist/clis/1688/store.js +226 -0
  21. package/dist/clis/1688/store.test.js +62 -0
  22. package/dist/clis/36kr/article.js +2 -2
  23. package/dist/clis/36kr/hot.js +12 -6
  24. package/dist/clis/36kr/news.js +1 -1
  25. package/dist/clis/36kr/search.js +12 -6
  26. package/dist/clis/_shared/desktop-commands.d.ts +5 -5
  27. package/dist/clis/_shared/desktop-commands.js +1 -1
  28. package/dist/clis/amazon/bestsellers.d.ts +0 -20
  29. package/dist/clis/amazon/bestsellers.js +6 -129
  30. package/dist/clis/amazon/bestsellers.test.js +12 -3
  31. package/dist/clis/amazon/discussion.js +2 -2
  32. package/dist/clis/amazon/movers-shakers.js +7 -0
  33. package/dist/clis/amazon/new-releases.js +7 -0
  34. package/dist/clis/amazon/offer.js +2 -2
  35. package/dist/clis/amazon/product.js +2 -2
  36. package/dist/clis/amazon/rankings.d.ts +59 -0
  37. package/dist/clis/amazon/rankings.js +226 -0
  38. package/dist/clis/amazon/rankings.test.js +41 -0
  39. package/dist/clis/amazon/search.js +2 -2
  40. package/dist/clis/amazon/shared.d.ts +12 -1
  41. package/dist/clis/amazon/shared.js +122 -12
  42. package/dist/clis/amazon/shared.test.js +11 -0
  43. package/dist/clis/antigravity/dump.d.ts +1 -1
  44. package/dist/clis/antigravity/dump.js +1 -1
  45. package/dist/clis/antigravity/extract-code.d.ts +1 -1
  46. package/dist/clis/antigravity/extract-code.js +1 -1
  47. package/dist/clis/antigravity/model.d.ts +1 -1
  48. package/dist/clis/antigravity/model.js +1 -1
  49. package/dist/clis/antigravity/new.d.ts +1 -1
  50. package/dist/clis/antigravity/new.js +1 -1
  51. package/dist/clis/antigravity/read.d.ts +1 -1
  52. package/dist/clis/antigravity/read.js +1 -1
  53. package/dist/clis/antigravity/send.d.ts +1 -1
  54. package/dist/clis/antigravity/send.js +1 -1
  55. package/dist/clis/antigravity/serve.js +2 -2
  56. package/dist/clis/antigravity/status.d.ts +1 -1
  57. package/dist/clis/antigravity/status.js +1 -1
  58. package/dist/clis/antigravity/watch.d.ts +1 -1
  59. package/dist/clis/antigravity/watch.js +1 -1
  60. package/dist/clis/apple-podcasts/commands.test.js +1 -1
  61. package/dist/clis/apple-podcasts/episodes.js +2 -2
  62. package/dist/clis/apple-podcasts/search.js +2 -2
  63. package/dist/clis/apple-podcasts/top.js +2 -2
  64. package/dist/clis/apple-podcasts/utils.js +1 -1
  65. package/dist/clis/arxiv/paper.js +2 -2
  66. package/dist/clis/arxiv/search.js +2 -2
  67. package/dist/clis/arxiv/utils.js +1 -1
  68. package/dist/clis/band/bands.js +2 -2
  69. package/dist/clis/band/mentions.js +2 -2
  70. package/dist/clis/band/post.js +2 -2
  71. package/dist/clis/band/posts.js +2 -2
  72. package/dist/clis/barchart/flow.js +1 -1
  73. package/dist/clis/barchart/greeks.js +1 -1
  74. package/dist/clis/barchart/options.js +1 -1
  75. package/dist/clis/barchart/quote.js +1 -1
  76. package/dist/clis/bbc/news.js +1 -1
  77. package/dist/clis/bilibili/comments.js +3 -3
  78. package/dist/clis/bilibili/comments.test.js +4 -3
  79. package/dist/clis/bilibili/download.js +3 -2
  80. package/dist/clis/bilibili/dynamic.js +1 -1
  81. package/dist/clis/bilibili/dynamic.test.js +1 -1
  82. package/dist/clis/bilibili/favorite.js +1 -1
  83. package/dist/clis/bilibili/feed.js +1 -1
  84. package/dist/clis/bilibili/following.js +2 -2
  85. package/dist/clis/bilibili/history.js +1 -1
  86. package/dist/clis/bilibili/me.js +1 -1
  87. package/dist/clis/bilibili/ranking.js +1 -1
  88. package/dist/clis/bilibili/search.js +1 -1
  89. package/dist/clis/bilibili/subtitle.js +6 -5
  90. package/dist/clis/bilibili/subtitle.test.js +4 -3
  91. package/dist/clis/bilibili/user-videos.js +1 -1
  92. package/dist/clis/bilibili/utils.d.ts +6 -1
  93. package/dist/clis/bilibili/utils.js +31 -1
  94. package/dist/clis/bilibili/utils.test.js +17 -0
  95. package/dist/clis/bloomberg/businessweek.js +1 -1
  96. package/dist/clis/bloomberg/economics.js +1 -1
  97. package/dist/clis/bloomberg/feeds.js +1 -1
  98. package/dist/clis/bloomberg/industries.js +1 -1
  99. package/dist/clis/bloomberg/main.js +1 -1
  100. package/dist/clis/bloomberg/markets.js +1 -1
  101. package/dist/clis/bloomberg/news.js +2 -2
  102. package/dist/clis/bloomberg/opinions.js +1 -1
  103. package/dist/clis/bloomberg/politics.js +1 -1
  104. package/dist/clis/bloomberg/tech.js +1 -1
  105. package/dist/clis/bloomberg/utils.js +1 -1
  106. package/dist/clis/boss/batchgreet.js +1 -1
  107. package/dist/clis/boss/chatlist.js +1 -1
  108. package/dist/clis/boss/chatmsg.js +1 -1
  109. package/dist/clis/boss/detail.js +1 -1
  110. package/dist/clis/boss/exchange.js +1 -1
  111. package/dist/clis/boss/greet.js +1 -1
  112. package/dist/clis/boss/invite.js +1 -1
  113. package/dist/clis/boss/joblist.js +1 -1
  114. package/dist/clis/boss/mark.js +2 -2
  115. package/dist/clis/boss/recommend.js +1 -1
  116. package/dist/clis/boss/resume.js +1 -1
  117. package/dist/clis/boss/search.js +1 -1
  118. package/dist/clis/boss/send.js +2 -2
  119. package/dist/clis/boss/stats.js +1 -1
  120. package/dist/clis/boss/utils.d.ts +1 -1
  121. package/dist/clis/chaoxing/assignments.js +2 -2
  122. package/dist/clis/chaoxing/exams.js +1 -1
  123. package/dist/clis/chaoxing/utils.d.ts +1 -1
  124. package/dist/clis/chatgpt/ask.d.ts +1 -1
  125. package/dist/clis/chatgpt/ask.js +2 -2
  126. package/dist/clis/chatgpt/model.d.ts +1 -1
  127. package/dist/clis/chatgpt/model.js +2 -2
  128. package/dist/clis/chatgpt/new.d.ts +1 -1
  129. package/dist/clis/chatgpt/new.js +2 -2
  130. package/dist/clis/chatgpt/read.d.ts +1 -1
  131. package/dist/clis/chatgpt/read.js +2 -2
  132. package/dist/clis/chatgpt/send.d.ts +1 -1
  133. package/dist/clis/chatgpt/send.js +2 -2
  134. package/dist/clis/chatgpt/status.d.ts +1 -1
  135. package/dist/clis/chatgpt/status.js +2 -2
  136. package/dist/clis/chatwise/ask.d.ts +1 -1
  137. package/dist/clis/chatwise/ask.js +2 -2
  138. package/dist/clis/chatwise/export.d.ts +1 -1
  139. package/dist/clis/chatwise/export.js +1 -1
  140. package/dist/clis/chatwise/history.d.ts +1 -1
  141. package/dist/clis/chatwise/history.js +1 -1
  142. package/dist/clis/chatwise/model.d.ts +1 -1
  143. package/dist/clis/chatwise/model.js +2 -2
  144. package/dist/clis/chatwise/new.d.ts +1 -1
  145. package/dist/clis/chatwise/read.d.ts +1 -1
  146. package/dist/clis/chatwise/read.js +1 -1
  147. package/dist/clis/chatwise/screenshot.d.ts +1 -1
  148. package/dist/clis/chatwise/send.d.ts +1 -1
  149. package/dist/clis/chatwise/send.js +2 -2
  150. package/dist/clis/chatwise/status.d.ts +1 -1
  151. package/dist/clis/codex/ask.d.ts +1 -1
  152. package/dist/clis/codex/ask.js +2 -2
  153. package/dist/clis/codex/dump.d.ts +1 -1
  154. package/dist/clis/codex/export.d.ts +1 -1
  155. package/dist/clis/codex/export.js +1 -1
  156. package/dist/clis/codex/extract-diff.d.ts +1 -1
  157. package/dist/clis/codex/extract-diff.js +1 -1
  158. package/dist/clis/codex/history.d.ts +1 -1
  159. package/dist/clis/codex/history.js +1 -1
  160. package/dist/clis/codex/model.d.ts +1 -1
  161. package/dist/clis/codex/model.js +1 -1
  162. package/dist/clis/codex/new.d.ts +1 -1
  163. package/dist/clis/codex/read.d.ts +1 -1
  164. package/dist/clis/codex/read.js +1 -1
  165. package/dist/clis/codex/screenshot.d.ts +1 -1
  166. package/dist/clis/codex/send.d.ts +1 -1
  167. package/dist/clis/codex/send.js +2 -2
  168. package/dist/clis/codex/status.d.ts +1 -1
  169. package/dist/clis/coupang/add-to-cart.js +1 -1
  170. package/dist/clis/coupang/search.js +1 -1
  171. package/dist/clis/ctrip/search.js +2 -2
  172. package/dist/clis/ctrip/search.test.js +1 -1
  173. package/dist/clis/cursor/ask.d.ts +1 -1
  174. package/dist/clis/cursor/ask.js +2 -2
  175. package/dist/clis/cursor/composer.d.ts +1 -1
  176. package/dist/clis/cursor/composer.js +2 -2
  177. package/dist/clis/cursor/dump.d.ts +1 -1
  178. package/dist/clis/cursor/export.d.ts +1 -1
  179. package/dist/clis/cursor/export.js +1 -1
  180. package/dist/clis/cursor/extract-code.d.ts +1 -1
  181. package/dist/clis/cursor/extract-code.js +1 -1
  182. package/dist/clis/cursor/history.d.ts +1 -1
  183. package/dist/clis/cursor/history.js +1 -1
  184. package/dist/clis/cursor/model.d.ts +1 -1
  185. package/dist/clis/cursor/model.js +1 -1
  186. package/dist/clis/cursor/new.d.ts +1 -1
  187. package/dist/clis/cursor/read.d.ts +1 -1
  188. package/dist/clis/cursor/read.js +2 -2
  189. package/dist/clis/cursor/screenshot.d.ts +1 -1
  190. package/dist/clis/cursor/send.d.ts +1 -1
  191. package/dist/clis/cursor/send.js +2 -2
  192. package/dist/clis/cursor/status.d.ts +1 -1
  193. package/dist/clis/discord-app/channels.d.ts +1 -1
  194. package/dist/clis/discord-app/channels.js +1 -1
  195. package/dist/clis/discord-app/members.d.ts +1 -1
  196. package/dist/clis/discord-app/members.js +1 -1
  197. package/dist/clis/discord-app/read.d.ts +1 -1
  198. package/dist/clis/discord-app/read.js +1 -1
  199. package/dist/clis/discord-app/search.d.ts +1 -1
  200. package/dist/clis/discord-app/search.js +1 -1
  201. package/dist/clis/discord-app/send.d.ts +1 -1
  202. package/dist/clis/discord-app/send.js +1 -1
  203. package/dist/clis/discord-app/servers.d.ts +1 -1
  204. package/dist/clis/discord-app/servers.js +1 -1
  205. package/dist/clis/discord-app/status.d.ts +1 -1
  206. package/dist/clis/discord-app/status.js +1 -1
  207. package/dist/clis/douban/book-hot.js +1 -1
  208. package/dist/clis/douban/download.js +2 -2
  209. package/dist/clis/douban/download.test.js +1 -1
  210. package/dist/clis/douban/marks.js +2 -2
  211. package/dist/clis/douban/movie-hot.js +1 -1
  212. package/dist/clis/douban/photos.js +1 -1
  213. package/dist/clis/douban/reviews.js +1 -1
  214. package/dist/clis/douban/search.js +1 -1
  215. package/dist/clis/douban/subject.yaml +50 -19
  216. package/dist/clis/douban/utils.d.ts +1 -1
  217. package/dist/clis/douban/utils.js +1 -1
  218. package/dist/clis/doubao/ask.d.ts +1 -1
  219. package/dist/clis/doubao/ask.js +1 -1
  220. package/dist/clis/doubao/detail.d.ts +1 -1
  221. package/dist/clis/doubao/detail.js +1 -1
  222. package/dist/clis/doubao/detail.test.js +1 -1
  223. package/dist/clis/doubao/history.d.ts +1 -1
  224. package/dist/clis/doubao/history.js +1 -1
  225. package/dist/clis/doubao/history.test.js +1 -1
  226. package/dist/clis/doubao/meeting-summary.d.ts +1 -1
  227. package/dist/clis/doubao/meeting-summary.js +1 -1
  228. package/dist/clis/doubao/meeting-transcript.d.ts +1 -1
  229. package/dist/clis/doubao/meeting-transcript.js +1 -1
  230. package/dist/clis/doubao/new.d.ts +1 -1
  231. package/dist/clis/doubao/new.js +1 -1
  232. package/dist/clis/doubao/read.d.ts +1 -1
  233. package/dist/clis/doubao/read.js +1 -1
  234. package/dist/clis/doubao/send.d.ts +1 -1
  235. package/dist/clis/doubao/send.js +1 -1
  236. package/dist/clis/doubao/status.d.ts +1 -1
  237. package/dist/clis/doubao/status.js +1 -1
  238. package/dist/clis/doubao/utils.d.ts +1 -1
  239. package/dist/clis/doubao/utils.js +32 -12
  240. package/dist/clis/doubao-app/ask.d.ts +1 -1
  241. package/dist/clis/doubao-app/ask.js +1 -1
  242. package/dist/clis/doubao-app/dump.d.ts +1 -1
  243. package/dist/clis/doubao-app/dump.js +1 -1
  244. package/dist/clis/doubao-app/new.d.ts +1 -1
  245. package/dist/clis/doubao-app/new.js +1 -1
  246. package/dist/clis/doubao-app/read.d.ts +1 -1
  247. package/dist/clis/doubao-app/read.js +1 -1
  248. package/dist/clis/doubao-app/screenshot.d.ts +1 -1
  249. package/dist/clis/doubao-app/screenshot.js +1 -1
  250. package/dist/clis/doubao-app/send.d.ts +1 -1
  251. package/dist/clis/doubao-app/send.js +1 -1
  252. package/dist/clis/doubao-app/status.d.ts +1 -1
  253. package/dist/clis/doubao-app/status.js +1 -1
  254. package/dist/clis/douyin/_shared/browser-fetch.d.ts +1 -1
  255. package/dist/clis/douyin/_shared/browser-fetch.js +1 -1
  256. package/dist/clis/douyin/_shared/browser-fetch.test.js +0 -1
  257. package/dist/clis/douyin/_shared/imagex-upload.js +1 -1
  258. package/dist/clis/douyin/_shared/imagex-upload.test.js +1 -1
  259. package/dist/clis/douyin/_shared/public-api.d.ts +1 -1
  260. package/dist/clis/douyin/_shared/sts2.d.ts +1 -1
  261. package/dist/clis/douyin/_shared/sts2.js +1 -1
  262. package/dist/clis/douyin/_shared/sts2.test.js +1 -1
  263. package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +1 -1
  264. package/dist/clis/douyin/_shared/tos-upload.js +1 -1
  265. package/dist/clis/douyin/_shared/transcode.d.ts +1 -1
  266. package/dist/clis/douyin/_shared/transcode.js +1 -1
  267. package/dist/clis/douyin/_shared/transcode.test.js +1 -3
  268. package/dist/clis/douyin/activities.js +1 -1
  269. package/dist/clis/douyin/activities.test.js +1 -1
  270. package/dist/clis/douyin/collections.js +1 -1
  271. package/dist/clis/douyin/collections.test.js +1 -1
  272. package/dist/clis/douyin/delete.js +1 -1
  273. package/dist/clis/douyin/delete.test.js +1 -1
  274. package/dist/clis/douyin/draft.js +2 -2
  275. package/dist/clis/douyin/draft.test.js +1 -3
  276. package/dist/clis/douyin/drafts.js +1 -1
  277. package/dist/clis/douyin/drafts.test.js +1 -1
  278. package/dist/clis/douyin/hashtag.js +2 -2
  279. package/dist/clis/douyin/hashtag.test.js +1 -1
  280. package/dist/clis/douyin/location.js +1 -1
  281. package/dist/clis/douyin/location.test.js +1 -1
  282. package/dist/clis/douyin/profile.js +2 -2
  283. package/dist/clis/douyin/profile.test.js +1 -1
  284. package/dist/clis/douyin/publish.js +2 -2
  285. package/dist/clis/douyin/publish.test.js +1 -1
  286. package/dist/clis/douyin/stats.js +1 -1
  287. package/dist/clis/douyin/stats.test.js +1 -1
  288. package/dist/clis/douyin/update.js +2 -2
  289. package/dist/clis/douyin/update.test.js +1 -1
  290. package/dist/clis/douyin/user-videos.js +1 -1
  291. package/dist/clis/douyin/user-videos.test.js +1 -1
  292. package/dist/clis/douyin/videos.js +1 -1
  293. package/dist/clis/douyin/videos.test.js +1 -1
  294. package/dist/clis/facebook/search.test.js +0 -2
  295. package/dist/clis/gemini/ask.d.ts +1 -1
  296. package/dist/clis/gemini/ask.js +10 -4
  297. package/dist/clis/gemini/ask.test.js +100 -0
  298. package/dist/clis/gemini/deep-research-result.d.ts +1 -0
  299. package/dist/clis/gemini/deep-research-result.js +91 -0
  300. package/dist/clis/gemini/deep-research-result.test.js +154 -0
  301. package/dist/clis/gemini/deep-research.d.ts +1 -0
  302. package/dist/clis/gemini/deep-research.js +98 -0
  303. package/dist/clis/gemini/deep-research.test.js +184 -0
  304. package/dist/clis/gemini/image.d.ts +1 -1
  305. package/dist/clis/gemini/image.js +2 -2
  306. package/dist/clis/gemini/new.d.ts +1 -1
  307. package/dist/clis/gemini/new.js +1 -1
  308. package/dist/clis/gemini/reply-state.test.js +671 -0
  309. package/dist/clis/gemini/utils.d.ts +74 -2
  310. package/dist/clis/gemini/utils.js +1540 -61
  311. package/dist/clis/gemini/utils.test.js +169 -2
  312. package/dist/clis/google/news.js +2 -2
  313. package/dist/clis/google/search.js +2 -2
  314. package/dist/clis/google/suggest.js +2 -2
  315. package/dist/clis/google/trends.js +2 -2
  316. package/dist/clis/grok/ask.d.ts +2 -2
  317. package/dist/clis/grok/ask.js +1 -1
  318. package/dist/clis/hf/top.js +2 -2
  319. package/dist/clis/hupu/detail.js +72 -0
  320. package/dist/clis/hupu/hot.yaml +43 -0
  321. package/dist/clis/hupu/like.js +75 -0
  322. package/dist/clis/hupu/mentions.js +159 -0
  323. package/dist/clis/hupu/reply.js +71 -0
  324. package/dist/clis/hupu/search.js +59 -0
  325. package/dist/clis/hupu/unlike.js +75 -0
  326. package/dist/clis/hupu/utils.d.ts +20 -0
  327. package/dist/clis/hupu/utils.js +319 -0
  328. package/dist/clis/imdb/person.js +2 -2
  329. package/dist/clis/imdb/reviews.js +2 -2
  330. package/dist/clis/imdb/search.js +2 -2
  331. package/dist/clis/imdb/title.js +2 -2
  332. package/dist/clis/imdb/top.js +2 -2
  333. package/dist/clis/imdb/trending.js +2 -2
  334. package/dist/clis/imdb/utils.d.ts +1 -1
  335. package/dist/clis/imdb/utils.js +1 -1
  336. package/dist/clis/instagram/_shared/private-publish.d.ts +138 -0
  337. package/dist/clis/instagram/_shared/private-publish.js +1030 -0
  338. package/dist/clis/instagram/_shared/private-publish.test.js +705 -0
  339. package/dist/clis/instagram/_shared/protocol-capture.d.ts +26 -0
  340. package/dist/clis/instagram/_shared/protocol-capture.js +282 -0
  341. package/dist/clis/instagram/_shared/protocol-capture.test.js +114 -0
  342. package/dist/clis/instagram/_shared/runtime-info.d.ts +9 -0
  343. package/dist/clis/instagram/_shared/runtime-info.js +81 -0
  344. package/dist/clis/instagram/download.js +2 -2
  345. package/dist/clis/instagram/download.test.js +2 -2
  346. package/dist/clis/instagram/note.js +222 -0
  347. package/dist/clis/instagram/note.test.d.ts +1 -0
  348. package/dist/clis/instagram/note.test.js +81 -0
  349. package/dist/clis/instagram/post.d.ts +4 -0
  350. package/dist/clis/instagram/post.js +1496 -0
  351. package/dist/clis/instagram/post.test.d.ts +1 -0
  352. package/dist/clis/instagram/post.test.js +1647 -0
  353. package/dist/clis/instagram/reel.js +826 -0
  354. package/dist/clis/instagram/reel.test.d.ts +1 -0
  355. package/dist/clis/instagram/reel.test.js +167 -0
  356. package/dist/clis/instagram/story.js +115 -0
  357. package/dist/clis/instagram/story.test.d.ts +1 -0
  358. package/dist/clis/instagram/story.test.js +167 -0
  359. package/dist/clis/jd/item.js +1 -1
  360. package/dist/clis/jd/item.test.js +1 -1
  361. package/dist/clis/jike/comment.js +1 -1
  362. package/dist/clis/jike/create.js +1 -1
  363. package/dist/clis/jike/feed.js +1 -1
  364. package/dist/clis/jike/like.js +1 -1
  365. package/dist/clis/jike/notifications.js +1 -1
  366. package/dist/clis/jike/repost.js +1 -1
  367. package/dist/clis/jike/search.js +1 -1
  368. package/dist/clis/lesswrong/_helpers.d.ts +15 -0
  369. package/dist/clis/lesswrong/_helpers.js +75 -0
  370. package/dist/clis/lesswrong/comments.js +64 -0
  371. package/dist/clis/lesswrong/curated.js +30 -0
  372. package/dist/clis/lesswrong/frontpage.js +30 -0
  373. package/dist/clis/lesswrong/new.js +30 -0
  374. package/dist/clis/lesswrong/read.js +45 -0
  375. package/dist/clis/lesswrong/sequences.d.ts +1 -0
  376. package/dist/clis/lesswrong/sequences.js +27 -0
  377. package/dist/clis/lesswrong/shortform.d.ts +1 -0
  378. package/dist/clis/lesswrong/shortform.js +30 -0
  379. package/dist/clis/lesswrong/tag.d.ts +1 -0
  380. package/dist/clis/lesswrong/tag.js +45 -0
  381. package/dist/clis/lesswrong/tags.d.ts +1 -0
  382. package/dist/clis/lesswrong/tags.js +27 -0
  383. package/dist/clis/lesswrong/top-month.d.ts +1 -0
  384. package/dist/clis/lesswrong/top-month.js +30 -0
  385. package/dist/clis/lesswrong/top-week.d.ts +1 -0
  386. package/dist/clis/lesswrong/top-week.js +30 -0
  387. package/dist/clis/lesswrong/top-year.d.ts +1 -0
  388. package/dist/clis/lesswrong/top-year.js +30 -0
  389. package/dist/clis/lesswrong/top.d.ts +1 -0
  390. package/dist/clis/lesswrong/top.js +30 -0
  391. package/dist/clis/lesswrong/user-posts.d.ts +1 -0
  392. package/dist/clis/lesswrong/user-posts.js +41 -0
  393. package/dist/clis/lesswrong/user.d.ts +1 -0
  394. package/dist/clis/lesswrong/user.js +44 -0
  395. package/dist/clis/linkedin/search.js +2 -2
  396. package/dist/clis/linkedin/timeline.js +2 -2
  397. package/dist/clis/linkedin/timeline.test.js +1 -1
  398. package/dist/clis/linux-do/category.js +1 -1
  399. package/dist/clis/linux-do/feed.d.ts +2 -2
  400. package/dist/clis/linux-do/feed.js +2 -2
  401. package/dist/clis/linux-do/hot.js +1 -1
  402. package/dist/clis/linux-do/latest.js +1 -1
  403. package/dist/clis/medium/feed.js +1 -1
  404. package/dist/clis/medium/search.js +1 -1
  405. package/dist/clis/medium/user.js +1 -1
  406. package/dist/clis/medium/utils.d.ts +1 -1
  407. package/dist/clis/medium/utils.js +1 -1
  408. package/dist/clis/notebooklm/compat.test.js +1 -1
  409. package/dist/clis/notebooklm/current.js +2 -2
  410. package/dist/clis/notebooklm/get.js +2 -2
  411. package/dist/clis/notebooklm/history.js +2 -2
  412. package/dist/clis/notebooklm/history.test.js +1 -1
  413. package/dist/clis/notebooklm/list.js +2 -2
  414. package/dist/clis/notebooklm/note-list.js +2 -2
  415. package/dist/clis/notebooklm/note-list.test.js +1 -1
  416. package/dist/clis/notebooklm/notes-get.js +2 -2
  417. package/dist/clis/notebooklm/notes-get.test.js +1 -1
  418. package/dist/clis/notebooklm/open.js +2 -2
  419. package/dist/clis/notebooklm/open.test.js +1 -1
  420. package/dist/clis/notebooklm/rpc.d.ts +1 -1
  421. package/dist/clis/notebooklm/rpc.js +1 -1
  422. package/dist/clis/notebooklm/rpc.test.js +1 -1
  423. package/dist/clis/notebooklm/source-fulltext.js +2 -2
  424. package/dist/clis/notebooklm/source-fulltext.test.js +1 -1
  425. package/dist/clis/notebooklm/source-get.js +2 -2
  426. package/dist/clis/notebooklm/source-get.test.js +1 -1
  427. package/dist/clis/notebooklm/source-guide.js +2 -2
  428. package/dist/clis/notebooklm/source-guide.test.js +1 -1
  429. package/dist/clis/notebooklm/source-list.js +2 -2
  430. package/dist/clis/notebooklm/status.js +1 -1
  431. package/dist/clis/notebooklm/summary.js +2 -2
  432. package/dist/clis/notebooklm/summary.test.js +1 -1
  433. package/dist/clis/notebooklm/utils.d.ts +1 -1
  434. package/dist/clis/notebooklm/utils.js +1 -1
  435. package/dist/clis/notion/export.d.ts +1 -1
  436. package/dist/clis/notion/export.js +1 -1
  437. package/dist/clis/notion/favorites.d.ts +1 -1
  438. package/dist/clis/notion/favorites.js +1 -1
  439. package/dist/clis/notion/new.d.ts +1 -1
  440. package/dist/clis/notion/new.js +1 -1
  441. package/dist/clis/notion/read.d.ts +1 -1
  442. package/dist/clis/notion/read.js +1 -1
  443. package/dist/clis/notion/search.d.ts +1 -1
  444. package/dist/clis/notion/search.js +1 -1
  445. package/dist/clis/notion/sidebar.d.ts +1 -1
  446. package/dist/clis/notion/sidebar.js +1 -1
  447. package/dist/clis/notion/status.d.ts +1 -1
  448. package/dist/clis/notion/status.js +1 -1
  449. package/dist/clis/notion/write.d.ts +1 -1
  450. package/dist/clis/notion/write.js +1 -1
  451. package/dist/clis/ones/common.d.ts +1 -1
  452. package/dist/clis/ones/common.js +1 -1
  453. package/dist/clis/ones/enrich-tasks.d.ts +1 -1
  454. package/dist/clis/ones/login.js +2 -2
  455. package/dist/clis/ones/logout.js +1 -1
  456. package/dist/clis/ones/me.js +2 -2
  457. package/dist/clis/ones/my-tasks.js +2 -2
  458. package/dist/clis/ones/resolve-labels.d.ts +1 -1
  459. package/dist/clis/ones/task-helpers.js +1 -1
  460. package/dist/clis/ones/task.js +2 -2
  461. package/dist/clis/ones/tasks.js +2 -2
  462. package/dist/clis/ones/token-info.js +2 -2
  463. package/dist/clis/ones/worklog.js +2 -2
  464. package/dist/clis/paperreview/commands.test.js +1 -1
  465. package/dist/clis/paperreview/feedback.js +2 -2
  466. package/dist/clis/paperreview/review.js +2 -2
  467. package/dist/clis/paperreview/submit.js +2 -2
  468. package/dist/clis/paperreview/utils.js +1 -1
  469. package/dist/clis/paperreview/utils.test.js +1 -1
  470. package/dist/clis/pixiv/download.js +2 -2
  471. package/dist/clis/pixiv/download.test.js +2 -2
  472. package/dist/clis/pixiv/illusts.js +2 -2
  473. package/dist/clis/pixiv/illusts.test.js +2 -2
  474. package/dist/clis/pixiv/search.js +1 -1
  475. package/dist/clis/pixiv/search.test.js +2 -2
  476. package/dist/clis/pixiv/test-utils.d.ts +1 -1
  477. package/dist/clis/pixiv/utils.d.ts +1 -1
  478. package/dist/clis/pixiv/utils.js +1 -1
  479. package/dist/clis/producthunt/browse.js +2 -2
  480. package/dist/clis/producthunt/hot.js +2 -2
  481. package/dist/clis/producthunt/posts.js +1 -1
  482. package/dist/clis/producthunt/today.js +1 -1
  483. package/dist/clis/reddit/comment.js +2 -2
  484. package/dist/clis/reddit/read.js +2 -2
  485. package/dist/clis/reddit/read.test.js +1 -1
  486. package/dist/clis/reddit/save.js +2 -2
  487. package/dist/clis/reddit/saved.js +2 -2
  488. package/dist/clis/reddit/subscribe.js +2 -2
  489. package/dist/clis/reddit/upvote.js +2 -2
  490. package/dist/clis/reddit/upvoted.js +2 -2
  491. package/dist/clis/reuters/search.js +1 -1
  492. package/dist/clis/sinablog/article.js +1 -1
  493. package/dist/clis/sinablog/hot.js +1 -1
  494. package/dist/clis/sinablog/search.js +1 -1
  495. package/dist/clis/sinablog/user.js +1 -1
  496. package/dist/clis/sinablog/utils.d.ts +1 -1
  497. package/dist/clis/sinafinance/news.js +2 -2
  498. package/dist/clis/sinafinance/rolling-news.js +1 -1
  499. package/dist/clis/sinafinance/stock-rank.d.ts +4 -0
  500. package/dist/clis/sinafinance/stock-rank.js +65 -0
  501. package/dist/clis/sinafinance/stock.js +2 -2
  502. package/dist/clis/smzdm/search.js +1 -1
  503. package/dist/clis/spotify/spotify.js +2 -2
  504. package/dist/clis/spotify/utils.js +1 -1
  505. package/dist/clis/substack/feed.js +1 -1
  506. package/dist/clis/substack/publication.js +1 -1
  507. package/dist/clis/substack/search.js +2 -2
  508. package/dist/clis/substack/utils.d.ts +1 -1
  509. package/dist/clis/substack/utils.js +1 -1
  510. package/dist/clis/substack/utils.test.js +0 -2
  511. package/dist/clis/tieba/commands.test.js +1 -1
  512. package/dist/clis/tieba/hot.js +2 -2
  513. package/dist/clis/tieba/posts.js +2 -2
  514. package/dist/clis/tieba/read.js +2 -2
  515. package/dist/clis/tieba/search.js +2 -2
  516. package/dist/clis/twitter/accept.js +2 -2
  517. package/dist/clis/twitter/article.js +2 -2
  518. package/dist/clis/twitter/block.js +2 -2
  519. package/dist/clis/twitter/bookmark.js +2 -2
  520. package/dist/clis/twitter/bookmarks.js +2 -2
  521. package/dist/clis/twitter/delete.d.ts +6 -0
  522. package/dist/clis/twitter/delete.js +82 -47
  523. package/dist/clis/twitter/delete.test.d.ts +1 -0
  524. package/dist/clis/twitter/delete.test.js +73 -0
  525. package/dist/clis/twitter/download.js +1 -1
  526. package/dist/clis/twitter/follow.js +2 -2
  527. package/dist/clis/twitter/followers.js +2 -2
  528. package/dist/clis/twitter/following.js +2 -2
  529. package/dist/clis/twitter/hide-reply.js +2 -2
  530. package/dist/clis/twitter/like.js +2 -2
  531. package/dist/clis/twitter/likes.js +2 -2
  532. package/dist/clis/twitter/notifications.js +2 -2
  533. package/dist/clis/twitter/post.js +74 -47
  534. package/dist/clis/twitter/post.test.d.ts +1 -0
  535. package/dist/clis/twitter/post.test.js +116 -0
  536. package/dist/clis/twitter/profile.js +2 -2
  537. package/dist/clis/twitter/reply-dm.js +2 -2
  538. package/dist/clis/twitter/reply.d.ts +12 -0
  539. package/dist/clis/twitter/reply.js +259 -37
  540. package/dist/clis/twitter/reply.test.d.ts +1 -0
  541. package/dist/clis/twitter/reply.test.js +151 -0
  542. package/dist/clis/twitter/search.js +2 -2
  543. package/dist/clis/twitter/search.test.js +1 -1
  544. package/dist/clis/twitter/shared.d.ts +1 -1
  545. package/dist/clis/twitter/thread.js +2 -2
  546. package/dist/clis/twitter/timeline.js +2 -2
  547. package/dist/clis/twitter/trending.js +2 -2
  548. package/dist/clis/twitter/unblock.js +2 -2
  549. package/dist/clis/twitter/unbookmark.js +2 -2
  550. package/dist/clis/twitter/unfollow.js +2 -2
  551. package/dist/clis/v2ex/daily.js +2 -2
  552. package/dist/clis/v2ex/me.js +2 -2
  553. package/dist/clis/v2ex/notifications.js +2 -2
  554. package/dist/clis/web/read.js +1 -1
  555. package/dist/clis/weibo/comments.js +1 -1
  556. package/dist/clis/weibo/feed.js +1 -1
  557. package/dist/clis/weibo/hot.js +1 -1
  558. package/dist/clis/weibo/me.js +2 -2
  559. package/dist/clis/weibo/post.js +2 -2
  560. package/dist/clis/weibo/search.js +2 -2
  561. package/dist/clis/weibo/user.js +2 -2
  562. package/dist/clis/weibo/utils.d.ts +1 -1
  563. package/dist/clis/weibo/utils.js +1 -1
  564. package/dist/clis/weixin/download.js +1 -1
  565. package/dist/clis/weread/book.js +2 -2
  566. package/dist/clis/weread/commands.test.js +2 -2
  567. package/dist/clis/weread/highlights.js +1 -1
  568. package/dist/clis/weread/notebooks.js +1 -1
  569. package/dist/clis/weread/notes.js +1 -1
  570. package/dist/clis/weread/private-api-regression.test.js +2 -2
  571. package/dist/clis/weread/ranking.js +1 -1
  572. package/dist/clis/weread/search-regression.test.js +1 -1
  573. package/dist/clis/weread/search.js +1 -1
  574. package/dist/clis/weread/shelf.js +3 -3
  575. package/dist/clis/weread/utils.d.ts +1 -1
  576. package/dist/clis/weread/utils.js +1 -1
  577. package/dist/clis/wikipedia/random.js +2 -2
  578. package/dist/clis/wikipedia/search.js +2 -2
  579. package/dist/clis/wikipedia/summary.js +2 -2
  580. package/dist/clis/wikipedia/trending.js +2 -2
  581. package/dist/clis/wikipedia/utils.js +1 -1
  582. package/dist/clis/xianyu/chat.d.ts +7 -0
  583. package/dist/clis/xianyu/chat.js +146 -0
  584. package/dist/clis/xianyu/chat.test.d.ts +1 -0
  585. package/dist/clis/xianyu/chat.test.js +15 -0
  586. package/dist/clis/xianyu/item.d.ts +7 -0
  587. package/dist/clis/xianyu/item.js +152 -0
  588. package/dist/clis/xianyu/item.test.d.ts +1 -0
  589. package/dist/clis/xianyu/item.test.js +56 -0
  590. package/dist/clis/xianyu/search.d.ts +10 -0
  591. package/dist/clis/xianyu/search.js +134 -0
  592. package/dist/clis/xianyu/search.test.d.ts +1 -0
  593. package/dist/clis/xianyu/search.test.js +17 -0
  594. package/dist/clis/xianyu/utils.d.ts +1 -0
  595. package/dist/clis/xianyu/utils.js +8 -0
  596. package/dist/clis/xiaoe/catalog.yaml +129 -0
  597. package/dist/clis/xiaoe/content.yaml +43 -0
  598. package/dist/clis/xiaoe/courses.yaml +73 -0
  599. package/dist/clis/xiaoe/detail.yaml +39 -0
  600. package/dist/clis/xiaoe/play-url.yaml +124 -0
  601. package/dist/clis/xiaohongshu/comments.js +2 -2
  602. package/dist/clis/xiaohongshu/comments.test.js +3 -5
  603. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +1 -1
  604. package/dist/clis/xiaohongshu/creator-note-detail.js +1 -1
  605. package/dist/clis/xiaohongshu/creator-note-detail.test.js +1 -3
  606. package/dist/clis/xiaohongshu/creator-notes-summary.js +1 -1
  607. package/dist/clis/xiaohongshu/creator-notes.d.ts +1 -1
  608. package/dist/clis/xiaohongshu/creator-notes.js +1 -1
  609. package/dist/clis/xiaohongshu/creator-notes.test.js +1 -3
  610. package/dist/clis/xiaohongshu/creator-profile.js +1 -1
  611. package/dist/clis/xiaohongshu/creator-stats.js +1 -1
  612. package/dist/clis/xiaohongshu/download.js +1 -1
  613. package/dist/clis/xiaohongshu/download.test.js +1 -3
  614. package/dist/clis/xiaohongshu/note-helpers.d.ts +2 -2
  615. package/dist/clis/xiaohongshu/note-helpers.js +5 -3
  616. package/dist/clis/xiaohongshu/note.d.ts +4 -0
  617. package/dist/clis/xiaohongshu/note.js +10 -12
  618. package/dist/clis/xiaohongshu/note.test.js +6 -8
  619. package/dist/clis/xiaohongshu/publish.js +1 -1
  620. package/dist/clis/xiaohongshu/publish.test.js +1 -3
  621. package/dist/clis/xiaohongshu/search.js +31 -22
  622. package/dist/clis/xiaohongshu/search.test.js +57 -49
  623. package/dist/clis/xiaohongshu/user.js +1 -1
  624. package/dist/clis/xiaoyuzhou/episode.js +2 -2
  625. package/dist/clis/xiaoyuzhou/podcast-episodes.js +2 -2
  626. package/dist/clis/xiaoyuzhou/podcast.js +2 -2
  627. package/dist/clis/xiaoyuzhou/utils.js +1 -1
  628. package/dist/clis/xueqiu/comments.d.ts +1 -1
  629. package/dist/clis/xueqiu/comments.js +4 -4
  630. package/dist/clis/xueqiu/comments.test.js +3 -3
  631. package/dist/clis/xueqiu/danjuan-utils.d.ts +1 -1
  632. package/dist/clis/xueqiu/fund-holdings.js +1 -1
  633. package/dist/clis/xueqiu/fund-snapshot.js +1 -1
  634. package/dist/clis/yahoo-finance/quote.js +1 -1
  635. package/dist/clis/yollomi/background.js +2 -2
  636. package/dist/clis/yollomi/edit.js +2 -2
  637. package/dist/clis/yollomi/face-swap.js +2 -2
  638. package/dist/clis/yollomi/generate.js +2 -2
  639. package/dist/clis/yollomi/models.js +1 -1
  640. package/dist/clis/yollomi/object-remover.js +2 -2
  641. package/dist/clis/yollomi/remove-bg.js +2 -2
  642. package/dist/clis/yollomi/restore.js +2 -2
  643. package/dist/clis/yollomi/try-on.js +2 -2
  644. package/dist/clis/yollomi/upload.js +2 -2
  645. package/dist/clis/yollomi/upscale.js +2 -2
  646. package/dist/clis/yollomi/utils.d.ts +1 -1
  647. package/dist/clis/yollomi/utils.js +1 -1
  648. package/dist/clis/yollomi/video.js +2 -2
  649. package/dist/clis/youtube/channel.js +2 -2
  650. package/dist/clis/youtube/comments.js +2 -2
  651. package/dist/clis/youtube/search.js +1 -1
  652. package/dist/clis/youtube/transcript.js +2 -2
  653. package/dist/clis/youtube/utils.d.ts +1 -1
  654. package/dist/clis/youtube/video.js +2 -2
  655. package/dist/clis/yuanbao/ask.d.ts +21 -0
  656. package/dist/clis/yuanbao/ask.js +427 -0
  657. package/dist/clis/yuanbao/ask.test.d.ts +1 -0
  658. package/dist/clis/yuanbao/ask.test.js +124 -0
  659. package/dist/clis/yuanbao/new.d.ts +1 -0
  660. package/dist/clis/yuanbao/new.js +70 -0
  661. package/dist/clis/yuanbao/new.test.d.ts +1 -0
  662. package/dist/clis/yuanbao/new.test.js +30 -0
  663. package/dist/clis/yuanbao/shared.d.ts +13 -0
  664. package/dist/clis/yuanbao/shared.js +49 -0
  665. package/dist/clis/zhihu/download.js +1 -1
  666. package/dist/clis/zhihu/question.js +32 -21
  667. package/dist/clis/zhihu/question.test.js +35 -17
  668. package/dist/clis/zsxq/dynamics.js +1 -1
  669. package/dist/clis/zsxq/groups.js +1 -1
  670. package/dist/clis/zsxq/search.js +1 -1
  671. package/dist/clis/zsxq/search.test.js +1 -1
  672. package/dist/clis/zsxq/topic.js +2 -2
  673. package/dist/clis/zsxq/topic.test.js +1 -1
  674. package/dist/clis/zsxq/topics.js +1 -1
  675. package/dist/clis/zsxq/topics.test.js +1 -1
  676. package/dist/clis/zsxq/utils.d.ts +1 -1
  677. package/dist/clis/zsxq/utils.js +1 -1
  678. package/dist/download/article-download.d.ts +1 -59
  679. package/dist/download/article-download.js +2 -178
  680. package/dist/download/index.d.ts +1 -71
  681. package/dist/download/index.js +2 -345
  682. package/dist/download/media-download.d.ts +1 -49
  683. package/dist/download/media-download.js +2 -114
  684. package/dist/download/progress.d.ts +1 -36
  685. package/dist/download/progress.js +2 -111
  686. package/dist/pipeline/index.d.ts +1 -5
  687. package/dist/pipeline/index.js +2 -5
  688. package/dist/src/browser/base-page.d.ts +50 -0
  689. package/dist/src/browser/base-page.js +193 -0
  690. package/dist/src/browser/bridge.js +109 -0
  691. package/dist/src/browser/cdp.d.ts +40 -0
  692. package/dist/src/browser/cdp.js +310 -0
  693. package/dist/src/browser/cdp.test.d.ts +1 -0
  694. package/dist/src/browser/daemon-client.d.ts +74 -0
  695. package/dist/src/browser/daemon-client.js +113 -0
  696. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  697. package/dist/src/browser/dom-helpers.d.ts +41 -0
  698. package/dist/src/browser/dom-helpers.js +227 -0
  699. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  700. package/dist/src/browser/dom-snapshot.js +804 -0
  701. package/dist/src/browser/page.d.ts +62 -0
  702. package/dist/src/browser/page.js +304 -0
  703. package/dist/src/browser/page.test.d.ts +1 -0
  704. package/dist/src/browser/stealth.test.d.ts +1 -0
  705. package/dist/src/browser/utils.d.ts +10 -0
  706. package/dist/src/browser/utils.js +27 -0
  707. package/dist/src/browser.test.d.ts +1 -0
  708. package/dist/src/browser.test.js +159 -0
  709. package/dist/src/build-manifest.d.ts +47 -0
  710. package/dist/src/build-manifest.js +226 -0
  711. package/dist/src/build-manifest.test.d.ts +1 -0
  712. package/dist/src/capabilityRouting.test.d.ts +1 -0
  713. package/dist/src/cascade.js +134 -0
  714. package/dist/src/cli.d.ts +22 -0
  715. package/dist/src/cli.js +1023 -0
  716. package/dist/src/cli.test.d.ts +1 -0
  717. package/dist/src/cli.test.js +171 -0
  718. package/dist/src/commanderAdapter.d.ts +23 -0
  719. package/dist/src/commanderAdapter.js +281 -0
  720. package/dist/src/commanderAdapter.test.d.ts +1 -0
  721. package/dist/src/commanderAdapter.test.js +244 -0
  722. package/dist/src/commands/daemon.test.d.ts +1 -0
  723. package/dist/src/completion.js +120 -0
  724. package/dist/src/completion.test.d.ts +1 -0
  725. package/dist/src/completion.test.js +23 -0
  726. package/dist/src/daemon.test.d.ts +1 -0
  727. package/dist/src/discovery.d.ts +40 -0
  728. package/dist/src/discovery.js +414 -0
  729. package/dist/src/doctor.js +126 -0
  730. package/dist/src/doctor.test.d.ts +1 -0
  731. package/dist/src/download/article-download.d.ts +59 -0
  732. package/dist/src/download/article-download.js +178 -0
  733. package/dist/src/download/index.d.ts +71 -0
  734. package/dist/src/download/index.js +345 -0
  735. package/dist/src/download/index.test.d.ts +1 -0
  736. package/dist/src/download/media-download.d.ts +49 -0
  737. package/dist/src/download/media-download.js +114 -0
  738. package/dist/src/download/progress.d.ts +36 -0
  739. package/dist/src/download/progress.js +111 -0
  740. package/dist/src/electron-apps.d.ts +31 -0
  741. package/dist/src/electron-apps.js +71 -0
  742. package/dist/src/electron-apps.test.d.ts +1 -0
  743. package/dist/src/engine.test.d.ts +1 -0
  744. package/dist/src/errors.js +119 -0
  745. package/dist/src/errors.test.d.ts +1 -0
  746. package/dist/src/execution.js +209 -0
  747. package/dist/src/execution.test.d.ts +1 -0
  748. package/dist/src/explore.js +379 -0
  749. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  750. package/dist/src/external.test.d.ts +1 -0
  751. package/dist/src/interceptor.d.ts +44 -0
  752. package/dist/src/interceptor.js +183 -0
  753. package/dist/src/launcher.d.ts +40 -0
  754. package/dist/src/launcher.js +208 -0
  755. package/dist/src/launcher.test.d.ts +1 -0
  756. package/dist/src/launcher.test.js +138 -0
  757. package/dist/src/main.js +61 -0
  758. package/dist/src/node-network.test.d.ts +1 -0
  759. package/dist/src/output.d.ts +14 -0
  760. package/dist/src/output.js +147 -0
  761. package/dist/src/output.test.d.ts +1 -0
  762. package/dist/src/output.test.js +62 -0
  763. package/dist/src/pipeline/executor.test.js +173 -0
  764. package/dist/src/pipeline/index.d.ts +5 -0
  765. package/dist/src/pipeline/index.js +5 -0
  766. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  767. package/dist/src/pipeline/steps/download.test.js +100 -0
  768. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  769. package/dist/src/record.js +694 -0
  770. package/dist/src/record.test.d.ts +1 -0
  771. package/dist/src/registry.d.ts +81 -0
  772. package/dist/src/runtime-detect.test.d.ts +1 -0
  773. package/dist/src/serialization.d.ts +38 -0
  774. package/dist/src/serialization.js +78 -0
  775. package/dist/src/serialization.test.d.ts +1 -0
  776. package/dist/src/synthesize.d.ts +99 -0
  777. package/dist/src/synthesize.js +205 -0
  778. package/dist/src/tui.test.d.ts +1 -0
  779. package/dist/src/types.d.ts +98 -0
  780. package/dist/src/weixin-download.test.d.ts +1 -0
  781. package/dist/src/weixin-download.test.js +44 -0
  782. package/package.json +28 -10
  783. package/scripts/check-doc-coverage.sh +2 -2
  784. package/scripts/copy-yaml.cjs +4 -4
  785. package/scripts/fetch-adapters.js +157 -0
  786. package/scripts/postinstall.js +1 -1
  787. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -83
  788. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  789. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  790. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +0 -57
  791. package/.github/actions/setup-chrome/action.yml +0 -27
  792. package/.github/dependabot.yml +0 -27
  793. package/.github/pull_request_template.md +0 -33
  794. package/.github/workflows/build-extension.yml +0 -67
  795. package/.github/workflows/ci.yml +0 -147
  796. package/.github/workflows/doc-check.yml +0 -36
  797. package/.github/workflows/docs.yml +0 -17
  798. package/.github/workflows/e2e-headed.yml +0 -74
  799. package/.github/workflows/release.yml +0 -44
  800. package/.github/workflows/security.yml +0 -33
  801. package/CHANGELOG.md +0 -321
  802. package/CLI-EXPLORER.md +0 -724
  803. package/CLI-ONESHOT.md +0 -216
  804. package/CONTRIBUTING.md +0 -208
  805. package/PRIVACY.md +0 -57
  806. package/SKILL.md +0 -59
  807. package/TESTING.md +0 -252
  808. package/autoresearch/baseline-browse.txt +0 -1
  809. package/autoresearch/baseline-skill.txt +0 -1
  810. package/autoresearch/browse-tasks.json +0 -688
  811. package/autoresearch/eval-browse.ts +0 -185
  812. package/autoresearch/eval-skill.ts +0 -248
  813. package/autoresearch/run-browse.sh +0 -9
  814. package/autoresearch/run-skill.sh +0 -9
  815. package/bun.lock +0 -615
  816. package/dist/browser/base-page.d.ts +0 -48
  817. package/dist/browser/base-page.js +0 -160
  818. package/dist/browser/bridge.js +0 -107
  819. package/dist/browser/daemon-client.d.ts +0 -64
  820. package/dist/browser/daemon-client.js +0 -110
  821. package/dist/browser/dom-helpers.d.ts +0 -39
  822. package/dist/browser/dom-helpers.js +0 -216
  823. package/dist/browser/dom-snapshot.js +0 -782
  824. package/dist/browser.test.js +0 -159
  825. package/dist/build-manifest.d.ts +0 -46
  826. package/dist/build-manifest.js +0 -224
  827. package/dist/cascade.js +0 -149
  828. package/dist/cli.d.ts +0 -7
  829. package/dist/cli.js +0 -912
  830. package/dist/commanderAdapter.d.ts +0 -22
  831. package/dist/commanderAdapter.js +0 -297
  832. package/dist/commanderAdapter.test.js +0 -202
  833. package/dist/completion.js +0 -118
  834. package/dist/discovery.d.ts +0 -31
  835. package/dist/discovery.js +0 -330
  836. package/dist/doctor.js +0 -126
  837. package/dist/electron-apps.d.ts +0 -29
  838. package/dist/electron-apps.js +0 -65
  839. package/dist/errors.js +0 -119
  840. package/dist/execution.js +0 -219
  841. package/dist/explore.js +0 -379
  842. package/dist/interceptor.d.ts +0 -42
  843. package/dist/interceptor.js +0 -186
  844. package/dist/launcher.d.ts +0 -36
  845. package/dist/launcher.js +0 -152
  846. package/dist/launcher.test.js +0 -57
  847. package/dist/main.js +0 -60
  848. package/dist/output.d.ts +0 -12
  849. package/dist/output.js +0 -138
  850. package/dist/output.test.d.ts +0 -4
  851. package/dist/output.test.js +0 -95
  852. package/dist/pipeline/executor.test.js +0 -175
  853. package/dist/pipeline/steps/download.test.js +0 -102
  854. package/dist/record.js +0 -694
  855. package/dist/registry.d.ts +0 -79
  856. package/dist/serialization.d.ts +0 -37
  857. package/dist/serialization.js +0 -77
  858. package/dist/synthesize.d.ts +0 -103
  859. package/dist/synthesize.js +0 -216
  860. package/dist/types.d.ts +0 -91
  861. package/dist/weixin-download.test.js +0 -44
  862. package/docs/.vitepress/config.mts +0 -234
  863. package/docs/adapters/browser/36kr.md +0 -47
  864. package/docs/adapters/browser/amazon.md +0 -53
  865. package/docs/adapters/browser/apple-podcasts.md +0 -28
  866. package/docs/adapters/browser/arxiv.md +0 -27
  867. package/docs/adapters/browser/band.md +0 -63
  868. package/docs/adapters/browser/barchart.md +0 -33
  869. package/docs/adapters/browser/bbc.md +0 -26
  870. package/docs/adapters/browser/bilibili.md +0 -47
  871. package/docs/adapters/browser/bloomberg.md +0 -70
  872. package/docs/adapters/browser/bluesky.md +0 -53
  873. package/docs/adapters/browser/boss.md +0 -28
  874. package/docs/adapters/browser/chaoxing.md +0 -39
  875. package/docs/adapters/browser/coupang.md +0 -28
  876. package/docs/adapters/browser/ctrip.md +0 -27
  877. package/docs/adapters/browser/devto.md +0 -35
  878. package/docs/adapters/browser/dictionary.md +0 -27
  879. package/docs/adapters/browser/douban.md +0 -62
  880. package/docs/adapters/browser/doubao.md +0 -35
  881. package/docs/adapters/browser/douyin.md +0 -75
  882. package/docs/adapters/browser/facebook.md +0 -36
  883. package/docs/adapters/browser/gemini.md +0 -72
  884. package/docs/adapters/browser/google.md +0 -62
  885. package/docs/adapters/browser/grok.md +0 -53
  886. package/docs/adapters/browser/hackernews.md +0 -42
  887. package/docs/adapters/browser/hf.md +0 -42
  888. package/docs/adapters/browser/imdb.md +0 -47
  889. package/docs/adapters/browser/instagram.md +0 -46
  890. package/docs/adapters/browser/jd.md +0 -27
  891. package/docs/adapters/browser/jike.md +0 -45
  892. package/docs/adapters/browser/jimeng.md +0 -39
  893. package/docs/adapters/browser/linkedin.md +0 -33
  894. package/docs/adapters/browser/linux-do.md +0 -206
  895. package/docs/adapters/browser/lobsters.md +0 -32
  896. package/docs/adapters/browser/medium.md +0 -32
  897. package/docs/adapters/browser/notebooklm.md +0 -69
  898. package/docs/adapters/browser/ones.md +0 -59
  899. package/docs/adapters/browser/paperreview.md +0 -43
  900. package/docs/adapters/browser/pixiv.md +0 -92
  901. package/docs/adapters/browser/producthunt.md +0 -49
  902. package/docs/adapters/browser/reddit.md +0 -50
  903. package/docs/adapters/browser/reuters.md +0 -27
  904. package/docs/adapters/browser/sinablog.md +0 -36
  905. package/docs/adapters/browser/sinafinance.md +0 -85
  906. package/docs/adapters/browser/smzdm.md +0 -27
  907. package/docs/adapters/browser/spotify.md +0 -62
  908. package/docs/adapters/browser/stackoverflow.md +0 -35
  909. package/docs/adapters/browser/steam.md +0 -26
  910. package/docs/adapters/browser/substack.md +0 -38
  911. package/docs/adapters/browser/tieba.md +0 -45
  912. package/docs/adapters/browser/tiktok.md +0 -68
  913. package/docs/adapters/browser/twitter.md +0 -56
  914. package/docs/adapters/browser/v2ex.md +0 -53
  915. package/docs/adapters/browser/web.md +0 -30
  916. package/docs/adapters/browser/weibo.md +0 -31
  917. package/docs/adapters/browser/weixin.md +0 -33
  918. package/docs/adapters/browser/weread.md +0 -48
  919. package/docs/adapters/browser/wikipedia.md +0 -30
  920. package/docs/adapters/browser/xiaohongshu.md +0 -47
  921. package/docs/adapters/browser/xiaoyuzhou.md +0 -28
  922. package/docs/adapters/browser/xueqiu.md +0 -65
  923. package/docs/adapters/browser/yahoo-finance.md +0 -27
  924. package/docs/adapters/browser/yollomi.md +0 -69
  925. package/docs/adapters/browser/youtube.md +0 -29
  926. package/docs/adapters/browser/zhihu.md +0 -30
  927. package/docs/adapters/browser/zsxq.md +0 -49
  928. package/docs/adapters/desktop/antigravity.md +0 -49
  929. package/docs/adapters/desktop/chatgpt.md +0 -49
  930. package/docs/adapters/desktop/chatwise.md +0 -38
  931. package/docs/adapters/desktop/codex.md +0 -36
  932. package/docs/adapters/desktop/cursor.md +0 -37
  933. package/docs/adapters/desktop/discord.md +0 -28
  934. package/docs/adapters/desktop/doubao-app.md +0 -35
  935. package/docs/adapters/desktop/notion.md +0 -29
  936. package/docs/adapters/index.md +0 -87
  937. package/docs/adapters-doc/ones.md +0 -32
  938. package/docs/advanced/cdp.md +0 -103
  939. package/docs/advanced/download.md +0 -71
  940. package/docs/advanced/electron.md +0 -125
  941. package/docs/advanced/rate-limiter-plugin.md +0 -99
  942. package/docs/advanced/remote-chrome.md +0 -72
  943. package/docs/comparison.md +0 -125
  944. package/docs/developer/ai-workflow.md +0 -66
  945. package/docs/developer/architecture.md +0 -103
  946. package/docs/developer/contributing.md +0 -155
  947. package/docs/developer/testing.md +0 -261
  948. package/docs/developer/ts-adapter.md +0 -105
  949. package/docs/developer/yaml-adapter.md +0 -124
  950. package/docs/guide/browser-bridge.md +0 -49
  951. package/docs/guide/electron-app-cli.md +0 -200
  952. package/docs/guide/getting-started.md +0 -79
  953. package/docs/guide/installation.md +0 -37
  954. package/docs/guide/plugins.md +0 -260
  955. package/docs/guide/troubleshooting.md +0 -61
  956. package/docs/index.md +0 -35
  957. package/docs/superpowers/plans/2026-03-28-perf-smart-wait.md +0 -1143
  958. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +0 -857
  959. package/docs/superpowers/specs/2026-03-28-perf-smart-wait-design.md +0 -170
  960. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +0 -208
  961. package/docs/superpowers/specs/2026-04-02-browse-skill-testing-design.md +0 -144
  962. package/docs/zh/adapters/index.md +0 -5
  963. package/docs/zh/advanced/cdp.md +0 -3
  964. package/docs/zh/developer/contributing.md +0 -24
  965. package/docs/zh/guide/browser-bridge.md +0 -36
  966. package/docs/zh/guide/electron-app-cli.md +0 -188
  967. package/docs/zh/guide/getting-started.md +0 -62
  968. package/docs/zh/guide/installation.md +0 -37
  969. package/docs/zh/guide/plugins.md +0 -182
  970. package/docs/zh/index.md +0 -29
  971. package/extension/icons/icon-128.png +0 -0
  972. package/extension/icons/icon-16.png +0 -0
  973. package/extension/icons/icon-32.png +0 -0
  974. package/extension/icons/icon-48.png +0 -0
  975. package/extension/manifest.json +0 -39
  976. package/extension/package-lock.json +0 -1156
  977. package/extension/package.json +0 -17
  978. package/extension/popup.html +0 -84
  979. package/extension/popup.js +0 -25
  980. package/extension/scripts/package-release.mjs +0 -179
  981. package/extension/src/background.test.ts +0 -240
  982. package/extension/src/background.ts +0 -689
  983. package/extension/src/cdp.test.ts +0 -75
  984. package/extension/src/cdp.ts +0 -250
  985. package/extension/src/protocol.ts +0 -66
  986. package/extension/store-assets/screenshot-1280x800.png +0 -0
  987. package/extension/tsconfig.json +0 -15
  988. package/extension/vite.config.ts +0 -18
  989. package/skills/opencli-explorer/SKILL.md +0 -853
  990. package/skills/opencli-oneshot/SKILL.md +0 -222
  991. package/skills/opencli-operate/SKILL.md +0 -213
  992. package/skills/opencli-usage/SKILL.md +0 -152
  993. package/skills/opencli-usage/browser.md +0 -429
  994. package/skills/opencli-usage/desktop.md +0 -118
  995. package/skills/opencli-usage/plugins.md +0 -82
  996. package/skills/opencli-usage/public-api.md +0 -149
  997. package/src/analysis.ts +0 -170
  998. package/src/browser/base-page.ts +0 -197
  999. package/src/browser/bridge.ts +0 -126
  1000. package/src/browser/cdp.test.ts +0 -66
  1001. package/src/browser/cdp.ts +0 -348
  1002. package/src/browser/daemon-client.test.ts +0 -103
  1003. package/src/browser/daemon-client.ts +0 -165
  1004. package/src/browser/discover.ts +0 -26
  1005. package/src/browser/dom-helpers.test.ts +0 -114
  1006. package/src/browser/dom-helpers.ts +0 -226
  1007. package/src/browser/dom-snapshot.test.ts +0 -291
  1008. package/src/browser/dom-snapshot.ts +0 -823
  1009. package/src/browser/errors.ts +0 -63
  1010. package/src/browser/index.ts +0 -14
  1011. package/src/browser/page.test.ts +0 -58
  1012. package/src/browser/page.ts +0 -231
  1013. package/src/browser/stealth.test.ts +0 -153
  1014. package/src/browser/stealth.ts +0 -354
  1015. package/src/browser/tabs.ts +0 -76
  1016. package/src/browser/utils.ts +0 -27
  1017. package/src/browser.test.ts +0 -195
  1018. package/src/build-manifest.test.ts +0 -200
  1019. package/src/build-manifest.ts +0 -277
  1020. package/src/capabilityRouting.test.ts +0 -47
  1021. package/src/capabilityRouting.ts +0 -29
  1022. package/src/cascade.ts +0 -192
  1023. package/src/cli.ts +0 -950
  1024. package/src/clis/36kr/article.ts +0 -69
  1025. package/src/clis/36kr/hot.test.ts +0 -19
  1026. package/src/clis/36kr/hot.ts +0 -100
  1027. package/src/clis/36kr/news.test.ts +0 -90
  1028. package/src/clis/36kr/news.ts +0 -54
  1029. package/src/clis/36kr/search.ts +0 -78
  1030. package/src/clis/_shared/common.ts +0 -11
  1031. package/src/clis/_shared/desktop-commands.ts +0 -121
  1032. package/src/clis/amazon/bestsellers.test.ts +0 -22
  1033. package/src/clis/amazon/bestsellers.ts +0 -180
  1034. package/src/clis/amazon/discussion.test.ts +0 -38
  1035. package/src/clis/amazon/discussion.ts +0 -131
  1036. package/src/clis/amazon/offer.test.ts +0 -35
  1037. package/src/clis/amazon/offer.ts +0 -185
  1038. package/src/clis/amazon/product.test.ts +0 -26
  1039. package/src/clis/amazon/product.ts +0 -131
  1040. package/src/clis/amazon/search.test.ts +0 -24
  1041. package/src/clis/amazon/search.ts +0 -128
  1042. package/src/clis/amazon/shared.test.ts +0 -37
  1043. package/src/clis/amazon/shared.ts +0 -316
  1044. package/src/clis/antigravity/SKILL.md +0 -38
  1045. package/src/clis/antigravity/dump.ts +0 -30
  1046. package/src/clis/antigravity/extract-code.ts +0 -34
  1047. package/src/clis/antigravity/model.ts +0 -47
  1048. package/src/clis/antigravity/new.ts +0 -28
  1049. package/src/clis/antigravity/read.ts +0 -36
  1050. package/src/clis/antigravity/send.ts +0 -40
  1051. package/src/clis/antigravity/serve.ts +0 -600
  1052. package/src/clis/antigravity/status.ts +0 -19
  1053. package/src/clis/antigravity/watch.ts +0 -45
  1054. package/src/clis/apple-podcasts/commands.test.ts +0 -123
  1055. package/src/clis/apple-podcasts/episodes.ts +0 -28
  1056. package/src/clis/apple-podcasts/search.ts +0 -30
  1057. package/src/clis/apple-podcasts/top.ts +0 -47
  1058. package/src/clis/apple-podcasts/utils.test.ts +0 -72
  1059. package/src/clis/apple-podcasts/utils.ts +0 -37
  1060. package/src/clis/arxiv/paper.ts +0 -21
  1061. package/src/clis/arxiv/search.ts +0 -24
  1062. package/src/clis/arxiv/utils.ts +0 -63
  1063. package/src/clis/band/bands.ts +0 -76
  1064. package/src/clis/band/mentions.ts +0 -134
  1065. package/src/clis/band/post.ts +0 -187
  1066. package/src/clis/band/posts.ts +0 -106
  1067. package/src/clis/barchart/flow.ts +0 -120
  1068. package/src/clis/barchart/greeks.ts +0 -123
  1069. package/src/clis/barchart/options.ts +0 -110
  1070. package/src/clis/barchart/quote.ts +0 -137
  1071. package/src/clis/bbc/news.ts +0 -41
  1072. package/src/clis/bilibili/comments.test.ts +0 -102
  1073. package/src/clis/bilibili/comments.ts +0 -44
  1074. package/src/clis/bilibili/download.ts +0 -92
  1075. package/src/clis/bilibili/dynamic.test.ts +0 -79
  1076. package/src/clis/bilibili/dynamic.ts +0 -34
  1077. package/src/clis/bilibili/favorite.ts +0 -45
  1078. package/src/clis/bilibili/feed.ts +0 -71
  1079. package/src/clis/bilibili/following.ts +0 -51
  1080. package/src/clis/bilibili/history.ts +0 -48
  1081. package/src/clis/bilibili/hot.yaml +0 -38
  1082. package/src/clis/bilibili/me.ts +0 -14
  1083. package/src/clis/bilibili/ranking.ts +0 -25
  1084. package/src/clis/bilibili/search.ts +0 -25
  1085. package/src/clis/bilibili/subtitle.test.ts +0 -60
  1086. package/src/clis/bilibili/subtitle.ts +0 -105
  1087. package/src/clis/bilibili/user-videos.ts +0 -42
  1088. package/src/clis/bilibili/utils.ts +0 -116
  1089. package/src/clis/bloomberg/businessweek.ts +0 -18
  1090. package/src/clis/bloomberg/economics.ts +0 -18
  1091. package/src/clis/bloomberg/feeds.ts +0 -16
  1092. package/src/clis/bloomberg/industries.ts +0 -18
  1093. package/src/clis/bloomberg/main.ts +0 -18
  1094. package/src/clis/bloomberg/markets.ts +0 -18
  1095. package/src/clis/bloomberg/news.ts +0 -136
  1096. package/src/clis/bloomberg/opinions.ts +0 -18
  1097. package/src/clis/bloomberg/politics.ts +0 -18
  1098. package/src/clis/bloomberg/tech.ts +0 -18
  1099. package/src/clis/bloomberg/utils.test.ts +0 -135
  1100. package/src/clis/bloomberg/utils.ts +0 -429
  1101. package/src/clis/bluesky/feeds.yaml +0 -29
  1102. package/src/clis/bluesky/followers.yaml +0 -33
  1103. package/src/clis/bluesky/following.yaml +0 -33
  1104. package/src/clis/bluesky/profile.yaml +0 -27
  1105. package/src/clis/bluesky/search.yaml +0 -34
  1106. package/src/clis/bluesky/starter-packs.yaml +0 -34
  1107. package/src/clis/bluesky/thread.yaml +0 -32
  1108. package/src/clis/bluesky/trending.yaml +0 -27
  1109. package/src/clis/bluesky/user.yaml +0 -34
  1110. package/src/clis/boss/batchgreet.ts +0 -75
  1111. package/src/clis/boss/chatlist.ts +0 -36
  1112. package/src/clis/boss/chatmsg.ts +0 -46
  1113. package/src/clis/boss/detail.ts +0 -69
  1114. package/src/clis/boss/exchange.ts +0 -52
  1115. package/src/clis/boss/greet.ts +0 -61
  1116. package/src/clis/boss/invite.ts +0 -80
  1117. package/src/clis/boss/joblist.ts +0 -34
  1118. package/src/clis/boss/mark.ts +0 -75
  1119. package/src/clis/boss/recommend.ts +0 -49
  1120. package/src/clis/boss/resume.ts +0 -157
  1121. package/src/clis/boss/search.ts +0 -162
  1122. package/src/clis/boss/send.ts +0 -54
  1123. package/src/clis/boss/stats.ts +0 -75
  1124. package/src/clis/boss/utils.ts +0 -287
  1125. package/src/clis/chaoxing/assignments.ts +0 -89
  1126. package/src/clis/chaoxing/exams.ts +0 -88
  1127. package/src/clis/chaoxing/utils.test.ts +0 -53
  1128. package/src/clis/chaoxing/utils.ts +0 -266
  1129. package/src/clis/chatgpt/ask.ts +0 -95
  1130. package/src/clis/chatgpt/ax.ts +0 -260
  1131. package/src/clis/chatgpt/model.ts +0 -27
  1132. package/src/clis/chatgpt/new.ts +0 -29
  1133. package/src/clis/chatgpt/read.ts +0 -35
  1134. package/src/clis/chatgpt/send.ts +0 -59
  1135. package/src/clis/chatgpt/status.ts +0 -27
  1136. package/src/clis/chatwise/ask.ts +0 -90
  1137. package/src/clis/chatwise/export.ts +0 -51
  1138. package/src/clis/chatwise/history.ts +0 -61
  1139. package/src/clis/chatwise/model.ts +0 -89
  1140. package/src/clis/chatwise/new.ts +0 -3
  1141. package/src/clis/chatwise/read.ts +0 -42
  1142. package/src/clis/chatwise/screenshot.ts +0 -3
  1143. package/src/clis/chatwise/send.ts +0 -53
  1144. package/src/clis/chatwise/status.ts +0 -3
  1145. package/src/clis/codex/ask.ts +0 -80
  1146. package/src/clis/codex/dump.ts +0 -3
  1147. package/src/clis/codex/export.ts +0 -42
  1148. package/src/clis/codex/extract-diff.ts +0 -48
  1149. package/src/clis/codex/history.ts +0 -47
  1150. package/src/clis/codex/model.ts +0 -59
  1151. package/src/clis/codex/new.ts +0 -3
  1152. package/src/clis/codex/read.ts +0 -37
  1153. package/src/clis/codex/screenshot.ts +0 -3
  1154. package/src/clis/codex/send.ts +0 -48
  1155. package/src/clis/codex/status.ts +0 -3
  1156. package/src/clis/coupang/add-to-cart.ts +0 -148
  1157. package/src/clis/coupang/search.ts +0 -464
  1158. package/src/clis/coupang/utils.test.ts +0 -78
  1159. package/src/clis/coupang/utils.ts +0 -302
  1160. package/src/clis/ctrip/search.test.ts +0 -73
  1161. package/src/clis/ctrip/search.ts +0 -111
  1162. package/src/clis/cursor/ask.ts +0 -82
  1163. package/src/clis/cursor/composer.ts +0 -51
  1164. package/src/clis/cursor/dump.ts +0 -3
  1165. package/src/clis/cursor/export.ts +0 -57
  1166. package/src/clis/cursor/extract-code.ts +0 -39
  1167. package/src/clis/cursor/history.ts +0 -47
  1168. package/src/clis/cursor/model.ts +0 -57
  1169. package/src/clis/cursor/new.ts +0 -3
  1170. package/src/clis/cursor/read.ts +0 -48
  1171. package/src/clis/cursor/screenshot.ts +0 -3
  1172. package/src/clis/cursor/send.ts +0 -48
  1173. package/src/clis/cursor/status.ts +0 -3
  1174. package/src/clis/devto/tag.yaml +0 -34
  1175. package/src/clis/devto/top.yaml +0 -29
  1176. package/src/clis/devto/user.yaml +0 -33
  1177. package/src/clis/dictionary/examples.yaml +0 -25
  1178. package/src/clis/dictionary/search.yaml +0 -27
  1179. package/src/clis/dictionary/synonyms.yaml +0 -25
  1180. package/src/clis/discord-app/channels.ts +0 -60
  1181. package/src/clis/discord-app/members.ts +0 -41
  1182. package/src/clis/discord-app/read.ts +0 -49
  1183. package/src/clis/discord-app/search.ts +0 -64
  1184. package/src/clis/discord-app/send.ts +0 -32
  1185. package/src/clis/discord-app/servers.ts +0 -39
  1186. package/src/clis/discord-app/status.ts +0 -18
  1187. package/src/clis/douban/book-hot.ts +0 -15
  1188. package/src/clis/douban/download.test.ts +0 -196
  1189. package/src/clis/douban/download.ts +0 -78
  1190. package/src/clis/douban/marks.ts +0 -135
  1191. package/src/clis/douban/movie-hot.ts +0 -15
  1192. package/src/clis/douban/photos.ts +0 -36
  1193. package/src/clis/douban/reviews.ts +0 -127
  1194. package/src/clis/douban/search.ts +0 -17
  1195. package/src/clis/douban/subject.yaml +0 -76
  1196. package/src/clis/douban/top250.yaml +0 -70
  1197. package/src/clis/douban/utils.test.ts +0 -97
  1198. package/src/clis/douban/utils.ts +0 -472
  1199. package/src/clis/doubao/ask.ts +0 -40
  1200. package/src/clis/doubao/detail.test.ts +0 -53
  1201. package/src/clis/doubao/detail.ts +0 -41
  1202. package/src/clis/doubao/history.test.ts +0 -45
  1203. package/src/clis/doubao/history.ts +0 -32
  1204. package/src/clis/doubao/meeting-summary.ts +0 -53
  1205. package/src/clis/doubao/meeting-transcript.ts +0 -48
  1206. package/src/clis/doubao/new.ts +0 -22
  1207. package/src/clis/doubao/read.ts +0 -20
  1208. package/src/clis/doubao/send.ts +0 -25
  1209. package/src/clis/doubao/status.ts +0 -27
  1210. package/src/clis/doubao/utils.test.ts +0 -45
  1211. package/src/clis/doubao/utils.ts +0 -990
  1212. package/src/clis/doubao-app/ask.ts +0 -60
  1213. package/src/clis/doubao-app/dump.ts +0 -28
  1214. package/src/clis/doubao-app/new.ts +0 -21
  1215. package/src/clis/doubao-app/read.ts +0 -21
  1216. package/src/clis/doubao-app/screenshot.ts +0 -19
  1217. package/src/clis/doubao-app/send.ts +0 -30
  1218. package/src/clis/doubao-app/status.ts +0 -17
  1219. package/src/clis/doubao-app/utils.ts +0 -116
  1220. package/src/clis/douyin/_shared/browser-fetch.test.ts +0 -38
  1221. package/src/clis/douyin/_shared/browser-fetch.ts +0 -45
  1222. package/src/clis/douyin/_shared/creation-id.test.ts +0 -26
  1223. package/src/clis/douyin/_shared/creation-id.ts +0 -8
  1224. package/src/clis/douyin/_shared/imagex-upload.test.ts +0 -113
  1225. package/src/clis/douyin/_shared/imagex-upload.ts +0 -76
  1226. package/src/clis/douyin/_shared/public-api.ts +0 -84
  1227. package/src/clis/douyin/_shared/sts2.test.ts +0 -31
  1228. package/src/clis/douyin/_shared/sts2.ts +0 -28
  1229. package/src/clis/douyin/_shared/text-extra.test.ts +0 -42
  1230. package/src/clis/douyin/_shared/text-extra.ts +0 -33
  1231. package/src/clis/douyin/_shared/timing.test.ts +0 -38
  1232. package/src/clis/douyin/_shared/timing.ts +0 -22
  1233. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +0 -102
  1234. package/src/clis/douyin/_shared/tos-upload.test.ts +0 -281
  1235. package/src/clis/douyin/_shared/tos-upload.ts +0 -444
  1236. package/src/clis/douyin/_shared/transcode.test.ts +0 -117
  1237. package/src/clis/douyin/_shared/transcode.ts +0 -78
  1238. package/src/clis/douyin/_shared/types.ts +0 -29
  1239. package/src/clis/douyin/activities.test.ts +0 -65
  1240. package/src/clis/douyin/activities.ts +0 -32
  1241. package/src/clis/douyin/collections.test.ts +0 -59
  1242. package/src/clis/douyin/collections.ts +0 -25
  1243. package/src/clis/douyin/delete.test.ts +0 -12
  1244. package/src/clis/douyin/delete.ts +0 -20
  1245. package/src/clis/douyin/draft.test.ts +0 -454
  1246. package/src/clis/douyin/draft.ts +0 -446
  1247. package/src/clis/douyin/drafts.test.ts +0 -12
  1248. package/src/clis/douyin/drafts.ts +0 -27
  1249. package/src/clis/douyin/hashtag.test.ts +0 -68
  1250. package/src/clis/douyin/hashtag.ts +0 -64
  1251. package/src/clis/douyin/location.test.ts +0 -26
  1252. package/src/clis/douyin/location.ts +0 -27
  1253. package/src/clis/douyin/profile.test.ts +0 -54
  1254. package/src/clis/douyin/profile.ts +0 -44
  1255. package/src/clis/douyin/publish.test.ts +0 -45
  1256. package/src/clis/douyin/publish.ts +0 -340
  1257. package/src/clis/douyin/stats.test.ts +0 -25
  1258. package/src/clis/douyin/stats.ts +0 -30
  1259. package/src/clis/douyin/update.test.ts +0 -12
  1260. package/src/clis/douyin/update.ts +0 -43
  1261. package/src/clis/douyin/user-videos.test.ts +0 -122
  1262. package/src/clis/douyin/user-videos.ts +0 -101
  1263. package/src/clis/douyin/videos.test.ts +0 -62
  1264. package/src/clis/douyin/videos.ts +0 -83
  1265. package/src/clis/facebook/add-friend.yaml +0 -43
  1266. package/src/clis/facebook/events.yaml +0 -44
  1267. package/src/clis/facebook/feed.yaml +0 -63
  1268. package/src/clis/facebook/friends.yaml +0 -42
  1269. package/src/clis/facebook/groups.yaml +0 -50
  1270. package/src/clis/facebook/join-group.yaml +0 -44
  1271. package/src/clis/facebook/memories.yaml +0 -39
  1272. package/src/clis/facebook/notifications.yaml +0 -40
  1273. package/src/clis/facebook/profile.yaml +0 -37
  1274. package/src/clis/facebook/search.test.ts +0 -70
  1275. package/src/clis/facebook/search.yaml +0 -47
  1276. package/src/clis/gemini/ask.ts +0 -46
  1277. package/src/clis/gemini/image.ts +0 -115
  1278. package/src/clis/gemini/new.ts +0 -22
  1279. package/src/clis/gemini/utils.test.ts +0 -36
  1280. package/src/clis/gemini/utils.ts +0 -523
  1281. package/src/clis/google/news.ts +0 -66
  1282. package/src/clis/google/search.ts +0 -133
  1283. package/src/clis/google/suggest.ts +0 -40
  1284. package/src/clis/google/trends.ts +0 -44
  1285. package/src/clis/google/utils.test.ts +0 -82
  1286. package/src/clis/google/utils.ts +0 -24
  1287. package/src/clis/grok/ask.test.ts +0 -78
  1288. package/src/clis/grok/ask.ts +0 -334
  1289. package/src/clis/hackernews/ask.yaml +0 -38
  1290. package/src/clis/hackernews/best.yaml +0 -38
  1291. package/src/clis/hackernews/jobs.yaml +0 -36
  1292. package/src/clis/hackernews/new.yaml +0 -38
  1293. package/src/clis/hackernews/search.yaml +0 -44
  1294. package/src/clis/hackernews/show.yaml +0 -38
  1295. package/src/clis/hackernews/top.yaml +0 -38
  1296. package/src/clis/hackernews/user.yaml +0 -25
  1297. package/src/clis/hf/top.ts +0 -141
  1298. package/src/clis/imdb/person.ts +0 -232
  1299. package/src/clis/imdb/reviews.ts +0 -111
  1300. package/src/clis/imdb/search.ts +0 -179
  1301. package/src/clis/imdb/title.ts +0 -121
  1302. package/src/clis/imdb/top.ts +0 -67
  1303. package/src/clis/imdb/trending.ts +0 -66
  1304. package/src/clis/imdb/utils.test.ts +0 -117
  1305. package/src/clis/imdb/utils.ts +0 -305
  1306. package/src/clis/instagram/comment.yaml +0 -52
  1307. package/src/clis/instagram/download.test.ts +0 -159
  1308. package/src/clis/instagram/download.ts +0 -286
  1309. package/src/clis/instagram/explore.yaml +0 -43
  1310. package/src/clis/instagram/follow.yaml +0 -41
  1311. package/src/clis/instagram/followers.yaml +0 -51
  1312. package/src/clis/instagram/following.yaml +0 -51
  1313. package/src/clis/instagram/like.yaml +0 -46
  1314. package/src/clis/instagram/profile.yaml +0 -42
  1315. package/src/clis/instagram/save.yaml +0 -46
  1316. package/src/clis/instagram/saved.yaml +0 -40
  1317. package/src/clis/instagram/search.yaml +0 -44
  1318. package/src/clis/instagram/unfollow.yaml +0 -38
  1319. package/src/clis/instagram/unlike.yaml +0 -46
  1320. package/src/clis/instagram/unsave.yaml +0 -46
  1321. package/src/clis/instagram/user.yaml +0 -54
  1322. package/src/clis/jd/item.test.ts +0 -52
  1323. package/src/clis/jd/item.ts +0 -104
  1324. package/src/clis/jike/comment.ts +0 -112
  1325. package/src/clis/jike/create.ts +0 -112
  1326. package/src/clis/jike/feed.ts +0 -73
  1327. package/src/clis/jike/like.ts +0 -64
  1328. package/src/clis/jike/notifications.ts +0 -184
  1329. package/src/clis/jike/post.yaml +0 -59
  1330. package/src/clis/jike/repost.ts +0 -113
  1331. package/src/clis/jike/search.ts +0 -73
  1332. package/src/clis/jike/topic.yaml +0 -53
  1333. package/src/clis/jike/user.yaml +0 -52
  1334. package/src/clis/jike/utils.ts +0 -36
  1335. package/src/clis/jimeng/generate.yaml +0 -85
  1336. package/src/clis/jimeng/history.yaml +0 -46
  1337. package/src/clis/linkedin/search.ts +0 -417
  1338. package/src/clis/linkedin/timeline.test.ts +0 -99
  1339. package/src/clis/linkedin/timeline.ts +0 -532
  1340. package/src/clis/linux-do/categories.yaml +0 -70
  1341. package/src/clis/linux-do/category.ts +0 -37
  1342. package/src/clis/linux-do/feed.test.ts +0 -132
  1343. package/src/clis/linux-do/feed.ts +0 -501
  1344. package/src/clis/linux-do/hot.ts +0 -26
  1345. package/src/clis/linux-do/latest.ts +0 -19
  1346. package/src/clis/linux-do/search.yaml +0 -48
  1347. package/src/clis/linux-do/tags.yaml +0 -41
  1348. package/src/clis/linux-do/topic.yaml +0 -77
  1349. package/src/clis/linux-do/user-posts.yaml +0 -67
  1350. package/src/clis/linux-do/user-topics.yaml +0 -54
  1351. package/src/clis/lobsters/active.yaml +0 -29
  1352. package/src/clis/lobsters/hot.yaml +0 -29
  1353. package/src/clis/lobsters/newest.yaml +0 -29
  1354. package/src/clis/lobsters/tag.yaml +0 -34
  1355. package/src/clis/medium/feed.ts +0 -16
  1356. package/src/clis/medium/search.ts +0 -16
  1357. package/src/clis/medium/user.ts +0 -16
  1358. package/src/clis/medium/utils.ts +0 -84
  1359. package/src/clis/notebooklm/compat.test.ts +0 -19
  1360. package/src/clis/notebooklm/current.ts +0 -37
  1361. package/src/clis/notebooklm/get.ts +0 -51
  1362. package/src/clis/notebooklm/history.test.ts +0 -70
  1363. package/src/clis/notebooklm/history.ts +0 -34
  1364. package/src/clis/notebooklm/list.ts +0 -40
  1365. package/src/clis/notebooklm/note-list.test.ts +0 -64
  1366. package/src/clis/notebooklm/note-list.ts +0 -40
  1367. package/src/clis/notebooklm/notes-get.test.ts +0 -88
  1368. package/src/clis/notebooklm/notes-get.ts +0 -65
  1369. package/src/clis/notebooklm/open.test.ts +0 -78
  1370. package/src/clis/notebooklm/open.ts +0 -61
  1371. package/src/clis/notebooklm/rpc.test.ts +0 -126
  1372. package/src/clis/notebooklm/rpc.ts +0 -286
  1373. package/src/clis/notebooklm/shared.ts +0 -98
  1374. package/src/clis/notebooklm/source-fulltext.test.ts +0 -123
  1375. package/src/clis/notebooklm/source-fulltext.ts +0 -67
  1376. package/src/clis/notebooklm/source-get.test.ts +0 -100
  1377. package/src/clis/notebooklm/source-get.ts +0 -58
  1378. package/src/clis/notebooklm/source-guide.test.ts +0 -121
  1379. package/src/clis/notebooklm/source-guide.ts +0 -67
  1380. package/src/clis/notebooklm/source-list.ts +0 -43
  1381. package/src/clis/notebooklm/status.ts +0 -33
  1382. package/src/clis/notebooklm/summary.test.ts +0 -94
  1383. package/src/clis/notebooklm/summary.ts +0 -43
  1384. package/src/clis/notebooklm/utils.test.ts +0 -446
  1385. package/src/clis/notebooklm/utils.ts +0 -902
  1386. package/src/clis/notion/export.ts +0 -36
  1387. package/src/clis/notion/favorites.ts +0 -87
  1388. package/src/clis/notion/new.ts +0 -39
  1389. package/src/clis/notion/read.ts +0 -33
  1390. package/src/clis/notion/search.ts +0 -54
  1391. package/src/clis/notion/sidebar.ts +0 -44
  1392. package/src/clis/notion/status.ts +0 -18
  1393. package/src/clis/notion/write.ts +0 -45
  1394. package/src/clis/ones/common.ts +0 -187
  1395. package/src/clis/ones/enrich-tasks.ts +0 -47
  1396. package/src/clis/ones/login.ts +0 -103
  1397. package/src/clis/ones/logout.ts +0 -19
  1398. package/src/clis/ones/me.ts +0 -34
  1399. package/src/clis/ones/my-tasks.ts +0 -148
  1400. package/src/clis/ones/resolve-labels.ts +0 -80
  1401. package/src/clis/ones/task-helpers.test.ts +0 -14
  1402. package/src/clis/ones/task-helpers.ts +0 -214
  1403. package/src/clis/ones/task.ts +0 -79
  1404. package/src/clis/ones/tasks.ts +0 -92
  1405. package/src/clis/ones/token-info.ts +0 -46
  1406. package/src/clis/ones/worklog.test.ts +0 -24
  1407. package/src/clis/ones/worklog.ts +0 -306
  1408. package/src/clis/paperreview/commands.test.ts +0 -283
  1409. package/src/clis/paperreview/feedback.ts +0 -64
  1410. package/src/clis/paperreview/review.ts +0 -47
  1411. package/src/clis/paperreview/submit.ts +0 -119
  1412. package/src/clis/paperreview/utils.test.ts +0 -68
  1413. package/src/clis/paperreview/utils.ts +0 -276
  1414. package/src/clis/pixiv/detail.yaml +0 -49
  1415. package/src/clis/pixiv/download.test.ts +0 -114
  1416. package/src/clis/pixiv/download.ts +0 -91
  1417. package/src/clis/pixiv/illusts.test.ts +0 -115
  1418. package/src/clis/pixiv/illusts.ts +0 -78
  1419. package/src/clis/pixiv/ranking.yaml +0 -53
  1420. package/src/clis/pixiv/search.test.ts +0 -97
  1421. package/src/clis/pixiv/search.ts +0 -53
  1422. package/src/clis/pixiv/test-utils.ts +0 -29
  1423. package/src/clis/pixiv/user.yaml +0 -46
  1424. package/src/clis/pixiv/utils.ts +0 -62
  1425. package/src/clis/producthunt/browse.ts +0 -109
  1426. package/src/clis/producthunt/hot.ts +0 -127
  1427. package/src/clis/producthunt/posts.ts +0 -29
  1428. package/src/clis/producthunt/today.ts +0 -37
  1429. package/src/clis/producthunt/utils.test.ts +0 -72
  1430. package/src/clis/producthunt/utils.ts +0 -122
  1431. package/src/clis/reddit/comment.ts +0 -60
  1432. package/src/clis/reddit/frontpage.yaml +0 -30
  1433. package/src/clis/reddit/hot.yaml +0 -47
  1434. package/src/clis/reddit/popular.yaml +0 -40
  1435. package/src/clis/reddit/read.test.ts +0 -34
  1436. package/src/clis/reddit/read.ts +0 -186
  1437. package/src/clis/reddit/save.ts +0 -54
  1438. package/src/clis/reddit/saved.ts +0 -51
  1439. package/src/clis/reddit/search.yaml +0 -61
  1440. package/src/clis/reddit/subreddit.yaml +0 -50
  1441. package/src/clis/reddit/subscribe.ts +0 -53
  1442. package/src/clis/reddit/upvote.ts +0 -67
  1443. package/src/clis/reddit/upvoted.ts +0 -51
  1444. package/src/clis/reddit/user-comments.yaml +0 -46
  1445. package/src/clis/reddit/user-posts.yaml +0 -44
  1446. package/src/clis/reddit/user.yaml +0 -40
  1447. package/src/clis/reuters/search.ts +0 -51
  1448. package/src/clis/sinablog/article.ts +0 -15
  1449. package/src/clis/sinablog/hot.ts +0 -15
  1450. package/src/clis/sinablog/search.ts +0 -56
  1451. package/src/clis/sinablog/user.ts +0 -16
  1452. package/src/clis/sinablog/utils.ts +0 -197
  1453. package/src/clis/sinafinance/news.ts +0 -76
  1454. package/src/clis/sinafinance/rolling-news.ts +0 -42
  1455. package/src/clis/sinafinance/stock.ts +0 -127
  1456. package/src/clis/smzdm/search.ts +0 -56
  1457. package/src/clis/spotify/spotify.ts +0 -328
  1458. package/src/clis/spotify/utils.test.ts +0 -87
  1459. package/src/clis/spotify/utils.ts +0 -92
  1460. package/src/clis/stackoverflow/bounties.yaml +0 -29
  1461. package/src/clis/stackoverflow/hot.yaml +0 -28
  1462. package/src/clis/stackoverflow/search.yaml +0 -33
  1463. package/src/clis/stackoverflow/unanswered.yaml +0 -28
  1464. package/src/clis/steam/top-sellers.yaml +0 -29
  1465. package/src/clis/substack/feed.ts +0 -16
  1466. package/src/clis/substack/publication.ts +0 -16
  1467. package/src/clis/substack/search.ts +0 -92
  1468. package/src/clis/substack/utils.test.ts +0 -54
  1469. package/src/clis/substack/utils.ts +0 -141
  1470. package/src/clis/tieba/commands.test.ts +0 -86
  1471. package/src/clis/tieba/hot.ts +0 -52
  1472. package/src/clis/tieba/posts.ts +0 -108
  1473. package/src/clis/tieba/read.ts +0 -158
  1474. package/src/clis/tieba/search.ts +0 -119
  1475. package/src/clis/tieba/utils.test.ts +0 -322
  1476. package/src/clis/tieba/utils.ts +0 -348
  1477. package/src/clis/tiktok/comment.yaml +0 -66
  1478. package/src/clis/tiktok/explore.yaml +0 -39
  1479. package/src/clis/tiktok/follow.yaml +0 -39
  1480. package/src/clis/tiktok/following.yaml +0 -46
  1481. package/src/clis/tiktok/friends.yaml +0 -47
  1482. package/src/clis/tiktok/like.yaml +0 -38
  1483. package/src/clis/tiktok/live.yaml +0 -51
  1484. package/src/clis/tiktok/notifications.yaml +0 -52
  1485. package/src/clis/tiktok/profile.yaml +0 -45
  1486. package/src/clis/tiktok/save.yaml +0 -34
  1487. package/src/clis/tiktok/search.yaml +0 -47
  1488. package/src/clis/tiktok/unfollow.yaml +0 -44
  1489. package/src/clis/tiktok/unlike.yaml +0 -38
  1490. package/src/clis/tiktok/unsave.yaml +0 -36
  1491. package/src/clis/tiktok/user.yaml +0 -44
  1492. package/src/clis/twitter/accept.ts +0 -214
  1493. package/src/clis/twitter/article.ts +0 -170
  1494. package/src/clis/twitter/block.ts +0 -93
  1495. package/src/clis/twitter/bookmark.ts +0 -68
  1496. package/src/clis/twitter/bookmarks.ts +0 -202
  1497. package/src/clis/twitter/delete.ts +0 -78
  1498. package/src/clis/twitter/download.ts +0 -118
  1499. package/src/clis/twitter/follow.ts +0 -70
  1500. package/src/clis/twitter/followers.ts +0 -116
  1501. package/src/clis/twitter/following.ts +0 -109
  1502. package/src/clis/twitter/hide-reply.ts +0 -71
  1503. package/src/clis/twitter/like.ts +0 -74
  1504. package/src/clis/twitter/likes.test.ts +0 -91
  1505. package/src/clis/twitter/likes.ts +0 -256
  1506. package/src/clis/twitter/notifications.ts +0 -136
  1507. package/src/clis/twitter/post.ts +0 -76
  1508. package/src/clis/twitter/profile.ts +0 -108
  1509. package/src/clis/twitter/reply-dm.ts +0 -194
  1510. package/src/clis/twitter/reply.ts +0 -63
  1511. package/src/clis/twitter/search.test.ts +0 -265
  1512. package/src/clis/twitter/search.ts +0 -185
  1513. package/src/clis/twitter/shared.ts +0 -45
  1514. package/src/clis/twitter/thread.ts +0 -182
  1515. package/src/clis/twitter/timeline.test.ts +0 -109
  1516. package/src/clis/twitter/timeline.ts +0 -248
  1517. package/src/clis/twitter/trending.ts +0 -66
  1518. package/src/clis/twitter/unblock.ts +0 -76
  1519. package/src/clis/twitter/unbookmark.ts +0 -67
  1520. package/src/clis/twitter/unfollow.ts +0 -76
  1521. package/src/clis/v2ex/daily.ts +0 -106
  1522. package/src/clis/v2ex/hot.yaml +0 -28
  1523. package/src/clis/v2ex/latest.yaml +0 -28
  1524. package/src/clis/v2ex/me.ts +0 -104
  1525. package/src/clis/v2ex/member.yaml +0 -29
  1526. package/src/clis/v2ex/node.yaml +0 -34
  1527. package/src/clis/v2ex/nodes.yaml +0 -31
  1528. package/src/clis/v2ex/notifications.ts +0 -76
  1529. package/src/clis/v2ex/replies.yaml +0 -32
  1530. package/src/clis/v2ex/topic.yaml +0 -33
  1531. package/src/clis/v2ex/user.yaml +0 -34
  1532. package/src/clis/web/read.ts +0 -210
  1533. package/src/clis/weibo/comments.ts +0 -54
  1534. package/src/clis/weibo/feed.ts +0 -57
  1535. package/src/clis/weibo/hot.ts +0 -39
  1536. package/src/clis/weibo/me.ts +0 -77
  1537. package/src/clis/weibo/post.ts +0 -77
  1538. package/src/clis/weibo/search.ts +0 -78
  1539. package/src/clis/weibo/user.ts +0 -64
  1540. package/src/clis/weibo/utils.ts +0 -32
  1541. package/src/clis/weixin/download.ts +0 -382
  1542. package/src/clis/weread/book.ts +0 -271
  1543. package/src/clis/weread/commands.test.ts +0 -466
  1544. package/src/clis/weread/highlights.ts +0 -25
  1545. package/src/clis/weread/notebooks.ts +0 -23
  1546. package/src/clis/weread/notes.ts +0 -31
  1547. package/src/clis/weread/private-api-regression.test.ts +0 -435
  1548. package/src/clis/weread/ranking.ts +0 -29
  1549. package/src/clis/weread/search-regression.test.ts +0 -440
  1550. package/src/clis/weread/search.ts +0 -207
  1551. package/src/clis/weread/shelf.ts +0 -84
  1552. package/src/clis/weread/utils.test.ts +0 -153
  1553. package/src/clis/weread/utils.ts +0 -390
  1554. package/src/clis/wikipedia/random.ts +0 -19
  1555. package/src/clis/wikipedia/search.ts +0 -38
  1556. package/src/clis/wikipedia/summary.ts +0 -23
  1557. package/src/clis/wikipedia/trending.ts +0 -41
  1558. package/src/clis/wikipedia/utils.ts +0 -51
  1559. package/src/clis/xiaohongshu/comments.test.ts +0 -173
  1560. package/src/clis/xiaohongshu/comments.ts +0 -140
  1561. package/src/clis/xiaohongshu/creator-note-detail.test.ts +0 -275
  1562. package/src/clis/xiaohongshu/creator-note-detail.ts +0 -447
  1563. package/src/clis/xiaohongshu/creator-notes-summary.test.ts +0 -54
  1564. package/src/clis/xiaohongshu/creator-notes-summary.ts +0 -120
  1565. package/src/clis/xiaohongshu/creator-notes.test.ts +0 -214
  1566. package/src/clis/xiaohongshu/creator-notes.ts +0 -295
  1567. package/src/clis/xiaohongshu/creator-profile.ts +0 -59
  1568. package/src/clis/xiaohongshu/creator-stats.ts +0 -80
  1569. package/src/clis/xiaohongshu/download.test.ts +0 -96
  1570. package/src/clis/xiaohongshu/download.ts +0 -174
  1571. package/src/clis/xiaohongshu/feed.yaml +0 -31
  1572. package/src/clis/xiaohongshu/note-helpers.ts +0 -25
  1573. package/src/clis/xiaohongshu/note.test.ts +0 -215
  1574. package/src/clis/xiaohongshu/note.ts +0 -104
  1575. package/src/clis/xiaohongshu/notifications.yaml +0 -37
  1576. package/src/clis/xiaohongshu/publish.test.ts +0 -230
  1577. package/src/clis/xiaohongshu/publish.ts +0 -598
  1578. package/src/clis/xiaohongshu/search.test.ts +0 -180
  1579. package/src/clis/xiaohongshu/search.ts +0 -133
  1580. package/src/clis/xiaohongshu/user-helpers.test.ts +0 -129
  1581. package/src/clis/xiaohongshu/user-helpers.ts +0 -89
  1582. package/src/clis/xiaohongshu/user.ts +0 -64
  1583. package/src/clis/xiaoyuzhou/episode.ts +0 -28
  1584. package/src/clis/xiaoyuzhou/podcast-episodes.ts +0 -36
  1585. package/src/clis/xiaoyuzhou/podcast.ts +0 -27
  1586. package/src/clis/xiaoyuzhou/utils.test.ts +0 -122
  1587. package/src/clis/xiaoyuzhou/utils.ts +0 -65
  1588. package/src/clis/xueqiu/comments.test.ts +0 -823
  1589. package/src/clis/xueqiu/comments.ts +0 -461
  1590. package/src/clis/xueqiu/danjuan-utils.test.ts +0 -49
  1591. package/src/clis/xueqiu/danjuan-utils.ts +0 -176
  1592. package/src/clis/xueqiu/earnings-date.yaml +0 -69
  1593. package/src/clis/xueqiu/feed.yaml +0 -53
  1594. package/src/clis/xueqiu/fund-holdings.ts +0 -32
  1595. package/src/clis/xueqiu/fund-snapshot.ts +0 -27
  1596. package/src/clis/xueqiu/hot-stock.yaml +0 -49
  1597. package/src/clis/xueqiu/hot.yaml +0 -46
  1598. package/src/clis/xueqiu/search.yaml +0 -55
  1599. package/src/clis/xueqiu/stock.yaml +0 -69
  1600. package/src/clis/xueqiu/watchlist.yaml +0 -46
  1601. package/src/clis/yahoo-finance/quote.ts +0 -72
  1602. package/src/clis/yollomi/background.ts +0 -48
  1603. package/src/clis/yollomi/edit.ts +0 -58
  1604. package/src/clis/yollomi/face-swap.ts +0 -45
  1605. package/src/clis/yollomi/generate.ts +0 -95
  1606. package/src/clis/yollomi/models.ts +0 -38
  1607. package/src/clis/yollomi/object-remover.ts +0 -44
  1608. package/src/clis/yollomi/remove-bg.ts +0 -40
  1609. package/src/clis/yollomi/restore.ts +0 -40
  1610. package/src/clis/yollomi/try-on.ts +0 -48
  1611. package/src/clis/yollomi/upload.ts +0 -78
  1612. package/src/clis/yollomi/upscale.ts +0 -49
  1613. package/src/clis/yollomi/utils.ts +0 -202
  1614. package/src/clis/yollomi/video.ts +0 -61
  1615. package/src/clis/youtube/channel.ts +0 -155
  1616. package/src/clis/youtube/comments.ts +0 -97
  1617. package/src/clis/youtube/search.ts +0 -99
  1618. package/src/clis/youtube/transcript-group.test.ts +0 -108
  1619. package/src/clis/youtube/transcript-group.ts +0 -287
  1620. package/src/clis/youtube/transcript.ts +0 -279
  1621. package/src/clis/youtube/utils.test.ts +0 -43
  1622. package/src/clis/youtube/utils.ts +0 -97
  1623. package/src/clis/youtube/video.ts +0 -118
  1624. package/src/clis/zhihu/download.test.ts +0 -14
  1625. package/src/clis/zhihu/download.ts +0 -87
  1626. package/src/clis/zhihu/hot.yaml +0 -46
  1627. package/src/clis/zhihu/question.test.ts +0 -71
  1628. package/src/clis/zhihu/question.ts +0 -58
  1629. package/src/clis/zhihu/search.yaml +0 -59
  1630. package/src/clis/zsxq/dynamics.ts +0 -60
  1631. package/src/clis/zsxq/groups.ts +0 -41
  1632. package/src/clis/zsxq/search.test.ts +0 -29
  1633. package/src/clis/zsxq/search.ts +0 -54
  1634. package/src/clis/zsxq/topic.test.ts +0 -34
  1635. package/src/clis/zsxq/topic.ts +0 -68
  1636. package/src/clis/zsxq/topics.test.ts +0 -29
  1637. package/src/clis/zsxq/topics.ts +0 -36
  1638. package/src/clis/zsxq/utils.ts +0 -351
  1639. package/src/commanderAdapter.test.ts +0 -264
  1640. package/src/commanderAdapter.ts +0 -315
  1641. package/src/commands/daemon.test.ts +0 -204
  1642. package/src/commands/daemon.ts +0 -87
  1643. package/src/completion.ts +0 -130
  1644. package/src/constants.ts +0 -41
  1645. package/src/daemon.test.ts +0 -88
  1646. package/src/daemon.ts +0 -339
  1647. package/src/discovery.ts +0 -328
  1648. package/src/doctor.test.ts +0 -111
  1649. package/src/doctor.ts +0 -163
  1650. package/src/download/article-download.ts +0 -272
  1651. package/src/download/index.test.ts +0 -135
  1652. package/src/download/index.ts +0 -422
  1653. package/src/download/media-download.ts +0 -180
  1654. package/src/download/progress.ts +0 -125
  1655. package/src/electron-apps.test.ts +0 -50
  1656. package/src/electron-apps.ts +0 -89
  1657. package/src/engine.test.ts +0 -323
  1658. package/src/errors.test.ts +0 -79
  1659. package/src/errors.ts +0 -162
  1660. package/src/execution.test.ts +0 -47
  1661. package/src/execution.ts +0 -239
  1662. package/src/explore.ts +0 -502
  1663. package/src/extension-manifest-regression.test.ts +0 -18
  1664. package/src/external-clis.yaml +0 -56
  1665. package/src/external.test.ts +0 -97
  1666. package/src/external.ts +0 -246
  1667. package/src/generate.ts +0 -161
  1668. package/src/hooks.test.ts +0 -126
  1669. package/src/hooks.ts +0 -91
  1670. package/src/idle-manager.ts +0 -60
  1671. package/src/interceptor.test.ts +0 -94
  1672. package/src/interceptor.ts +0 -204
  1673. package/src/launcher.test.ts +0 -67
  1674. package/src/launcher.ts +0 -185
  1675. package/src/logger.ts +0 -57
  1676. package/src/main.ts +0 -66
  1677. package/src/node-network.test.ts +0 -93
  1678. package/src/node-network.ts +0 -213
  1679. package/src/output.test.ts +0 -109
  1680. package/src/output.ts +0 -136
  1681. package/src/pipeline/executor.test.ts +0 -193
  1682. package/src/pipeline/executor.ts +0 -110
  1683. package/src/pipeline/index.ts +0 -6
  1684. package/src/pipeline/registry.ts +0 -62
  1685. package/src/pipeline/steps/browser.ts +0 -76
  1686. package/src/pipeline/steps/download.test.ts +0 -137
  1687. package/src/pipeline/steps/download.ts +0 -320
  1688. package/src/pipeline/steps/fetch.test.ts +0 -179
  1689. package/src/pipeline/steps/fetch.ts +0 -160
  1690. package/src/pipeline/steps/intercept.ts +0 -55
  1691. package/src/pipeline/steps/tap.ts +0 -100
  1692. package/src/pipeline/steps/transform.ts +0 -71
  1693. package/src/pipeline/template.test.ts +0 -177
  1694. package/src/pipeline/template.ts +0 -269
  1695. package/src/pipeline/transform.test.ts +0 -140
  1696. package/src/plugin-manifest.test.ts +0 -223
  1697. package/src/plugin-manifest.ts +0 -206
  1698. package/src/plugin-scaffold.test.ts +0 -98
  1699. package/src/plugin-scaffold.ts +0 -170
  1700. package/src/plugin.test.ts +0 -1427
  1701. package/src/plugin.ts +0 -1537
  1702. package/src/record.test.ts +0 -362
  1703. package/src/record.ts +0 -824
  1704. package/src/registry-api.ts +0 -14
  1705. package/src/registry.test.ts +0 -133
  1706. package/src/registry.ts +0 -158
  1707. package/src/runtime-detect.test.ts +0 -30
  1708. package/src/runtime-detect.ts +0 -36
  1709. package/src/runtime.ts +0 -86
  1710. package/src/scripts/framework.ts +0 -20
  1711. package/src/scripts/interact.ts +0 -22
  1712. package/src/scripts/store.ts +0 -40
  1713. package/src/serialization.test.ts +0 -44
  1714. package/src/serialization.ts +0 -90
  1715. package/src/snapshotFormatter.test.ts +0 -579
  1716. package/src/snapshotFormatter.ts +0 -359
  1717. package/src/synthesize.ts +0 -296
  1718. package/src/tui.test.ts +0 -23
  1719. package/src/tui.ts +0 -237
  1720. package/src/types.ts +0 -88
  1721. package/src/update-check.ts +0 -114
  1722. package/src/utils.ts +0 -44
  1723. package/src/validate.ts +0 -103
  1724. package/src/verify.ts +0 -93
  1725. package/src/version.ts +0 -18
  1726. package/src/weixin-download.test.ts +0 -91
  1727. package/src/yaml-schema.ts +0 -48
  1728. package/tests/e2e/band-auth.test.ts +0 -20
  1729. package/tests/e2e/browser-auth-helpers.ts +0 -18
  1730. package/tests/e2e/browser-auth.test.ts +0 -141
  1731. package/tests/e2e/browser-public-extended.test.ts +0 -166
  1732. package/tests/e2e/browser-public.test.ts +0 -417
  1733. package/tests/e2e/helpers.ts +0 -64
  1734. package/tests/e2e/management.test.ts +0 -106
  1735. package/tests/e2e/output-formats.test.ts +0 -44
  1736. package/tests/e2e/plugin-management.test.ts +0 -140
  1737. package/tests/e2e/public-commands.test.ts +0 -569
  1738. package/tests/smoke/api-health.test.ts +0 -131
  1739. package/tsconfig.json +0 -17
  1740. package/vitest.config.ts +0 -50
  1741. /package/dist/{browser.test.d.ts → clis/1688/item.test.d.ts} +0 -0
  1742. /package/dist/{browser/cdp.test.d.ts → clis/1688/search.test.d.ts} +0 -0
  1743. /package/dist/{browser/daemon-client.test.d.ts → clis/1688/shared.test.d.ts} +0 -0
  1744. /package/dist/{browser/dom-helpers.test.d.ts → clis/1688/store.test.d.ts} +0 -0
  1745. /package/dist/{browser/page.test.d.ts → clis/amazon/movers-shakers.d.ts} +0 -0
  1746. /package/dist/{browser/stealth.test.d.ts → clis/amazon/new-releases.d.ts} +0 -0
  1747. /package/dist/{build-manifest.test.d.ts → clis/amazon/rankings.test.d.ts} +0 -0
  1748. /package/dist/{capabilityRouting.test.d.ts → clis/bilibili/utils.test.d.ts} +0 -0
  1749. /package/dist/{commanderAdapter.test.d.ts → clis/gemini/ask.test.d.ts} +0 -0
  1750. /package/dist/{commands/daemon.test.d.ts → clis/gemini/deep-research-result.test.d.ts} +0 -0
  1751. /package/dist/{daemon.test.d.ts → clis/gemini/deep-research.test.d.ts} +0 -0
  1752. /package/dist/{doctor.test.d.ts → clis/gemini/reply-state.test.d.ts} +0 -0
  1753. /package/dist/{download/index.test.d.ts → clis/hupu/detail.d.ts} +0 -0
  1754. /package/dist/{electron-apps.test.d.ts → clis/hupu/like.d.ts} +0 -0
  1755. /package/dist/{engine.test.d.ts → clis/hupu/mentions.d.ts} +0 -0
  1756. /package/dist/{errors.test.d.ts → clis/hupu/reply.d.ts} +0 -0
  1757. /package/dist/{execution.test.d.ts → clis/hupu/search.d.ts} +0 -0
  1758. /package/dist/{extension-manifest-regression.test.d.ts → clis/hupu/unlike.d.ts} +0 -0
  1759. /package/dist/{external.test.d.ts → clis/instagram/_shared/private-publish.test.d.ts} +0 -0
  1760. /package/dist/{launcher.test.d.ts → clis/instagram/_shared/protocol-capture.test.d.ts} +0 -0
  1761. /package/dist/{node-network.test.d.ts → clis/instagram/note.d.ts} +0 -0
  1762. /package/dist/{pipeline/steps/download.test.d.ts → clis/instagram/reel.d.ts} +0 -0
  1763. /package/dist/{pipeline/steps/fetch.test.d.ts → clis/instagram/story.d.ts} +0 -0
  1764. /package/dist/{record.test.d.ts → clis/lesswrong/comments.d.ts} +0 -0
  1765. /package/dist/{runtime-detect.test.d.ts → clis/lesswrong/curated.d.ts} +0 -0
  1766. /package/dist/{serialization.test.d.ts → clis/lesswrong/frontpage.d.ts} +0 -0
  1767. /package/dist/{tui.test.d.ts → clis/lesswrong/new.d.ts} +0 -0
  1768. /package/dist/{weixin-download.test.d.ts → clis/lesswrong/read.d.ts} +0 -0
  1769. /package/dist/{analysis.d.ts → src/analysis.d.ts} +0 -0
  1770. /package/dist/{analysis.js → src/analysis.js} +0 -0
  1771. /package/dist/{browser → src/browser}/bridge.d.ts +0 -0
  1772. /package/dist/{browser → src/browser}/cdp.test.js +0 -0
  1773. /package/dist/{browser → src/browser}/daemon-client.test.js +0 -0
  1774. /package/dist/{browser → src/browser}/discover.d.ts +0 -0
  1775. /package/dist/{browser → src/browser}/discover.js +0 -0
  1776. /package/dist/{browser → src/browser}/dom-helpers.test.js +0 -0
  1777. /package/dist/{browser → src/browser}/dom-snapshot.d.ts +0 -0
  1778. /package/dist/{browser → src/browser}/dom-snapshot.test.d.ts +0 -0
  1779. /package/dist/{browser → src/browser}/dom-snapshot.test.js +0 -0
  1780. /package/dist/{browser → src/browser}/errors.d.ts +0 -0
  1781. /package/dist/{browser → src/browser}/errors.js +0 -0
  1782. /package/dist/{browser → src/browser}/index.d.ts +0 -0
  1783. /package/dist/{browser → src/browser}/index.js +0 -0
  1784. /package/dist/{browser → src/browser}/page.test.js +0 -0
  1785. /package/dist/{browser → src/browser}/stealth.d.ts +0 -0
  1786. /package/dist/{browser → src/browser}/stealth.js +0 -0
  1787. /package/dist/{browser → src/browser}/stealth.test.js +0 -0
  1788. /package/dist/{browser → src/browser}/tabs.d.ts +0 -0
  1789. /package/dist/{browser → src/browser}/tabs.js +0 -0
  1790. /package/dist/{build-manifest.test.js → src/build-manifest.test.js} +0 -0
  1791. /package/dist/{capabilityRouting.d.ts → src/capabilityRouting.d.ts} +0 -0
  1792. /package/dist/{capabilityRouting.js → src/capabilityRouting.js} +0 -0
  1793. /package/dist/{capabilityRouting.test.js → src/capabilityRouting.test.js} +0 -0
  1794. /package/dist/{cascade.d.ts → src/cascade.d.ts} +0 -0
  1795. /package/dist/{commands → src/commands}/daemon.d.ts +0 -0
  1796. /package/dist/{commands → src/commands}/daemon.js +0 -0
  1797. /package/dist/{commands → src/commands}/daemon.test.js +0 -0
  1798. /package/dist/{completion.d.ts → src/completion.d.ts} +0 -0
  1799. /package/dist/{constants.d.ts → src/constants.d.ts} +0 -0
  1800. /package/dist/{constants.js → src/constants.js} +0 -0
  1801. /package/dist/{daemon.d.ts → src/daemon.d.ts} +0 -0
  1802. /package/dist/{daemon.js → src/daemon.js} +0 -0
  1803. /package/dist/{daemon.test.js → src/daemon.test.js} +0 -0
  1804. /package/dist/{doctor.d.ts → src/doctor.d.ts} +0 -0
  1805. /package/dist/{doctor.test.js → src/doctor.test.js} +0 -0
  1806. /package/dist/{download → src/download}/index.test.js +0 -0
  1807. /package/dist/{electron-apps.test.js → src/electron-apps.test.js} +0 -0
  1808. /package/dist/{engine.test.js → src/engine.test.js} +0 -0
  1809. /package/dist/{errors.d.ts → src/errors.d.ts} +0 -0
  1810. /package/dist/{errors.test.js → src/errors.test.js} +0 -0
  1811. /package/dist/{execution.d.ts → src/execution.d.ts} +0 -0
  1812. /package/dist/{execution.test.js → src/execution.test.js} +0 -0
  1813. /package/dist/{explore.d.ts → src/explore.d.ts} +0 -0
  1814. /package/dist/{extension-manifest-regression.test.js → src/extension-manifest-regression.test.js} +0 -0
  1815. /package/dist/{external-clis.yaml → src/external-clis.yaml} +0 -0
  1816. /package/dist/{external.d.ts → src/external.d.ts} +0 -0
  1817. /package/dist/{external.js → src/external.js} +0 -0
  1818. /package/dist/{external.test.js → src/external.test.js} +0 -0
  1819. /package/dist/{generate.d.ts → src/generate.d.ts} +0 -0
  1820. /package/dist/{generate.js → src/generate.js} +0 -0
  1821. /package/dist/{hooks.d.ts → src/hooks.d.ts} +0 -0
  1822. /package/dist/{hooks.js → src/hooks.js} +0 -0
  1823. /package/dist/{hooks.test.d.ts → src/hooks.test.d.ts} +0 -0
  1824. /package/dist/{hooks.test.js → src/hooks.test.js} +0 -0
  1825. /package/dist/{idle-manager.d.ts → src/idle-manager.d.ts} +0 -0
  1826. /package/dist/{idle-manager.js → src/idle-manager.js} +0 -0
  1827. /package/dist/{interceptor.test.d.ts → src/interceptor.test.d.ts} +0 -0
  1828. /package/dist/{interceptor.test.js → src/interceptor.test.js} +0 -0
  1829. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  1830. /package/dist/{logger.js → src/logger.js} +0 -0
  1831. /package/dist/{main.d.ts → src/main.d.ts} +0 -0
  1832. /package/dist/{node-network.d.ts → src/node-network.d.ts} +0 -0
  1833. /package/dist/{node-network.js → src/node-network.js} +0 -0
  1834. /package/dist/{node-network.test.js → src/node-network.test.js} +0 -0
  1835. /package/dist/{pipeline → src/pipeline}/executor.d.ts +0 -0
  1836. /package/dist/{pipeline → src/pipeline}/executor.js +0 -0
  1837. /package/dist/{pipeline → src/pipeline}/executor.test.d.ts +0 -0
  1838. /package/dist/{pipeline → src/pipeline}/registry.d.ts +0 -0
  1839. /package/dist/{pipeline → src/pipeline}/registry.js +0 -0
  1840. /package/dist/{pipeline → src/pipeline}/steps/browser.d.ts +0 -0
  1841. /package/dist/{pipeline → src/pipeline}/steps/browser.js +0 -0
  1842. /package/dist/{pipeline → src/pipeline}/steps/download.d.ts +0 -0
  1843. /package/dist/{pipeline → src/pipeline}/steps/download.js +0 -0
  1844. /package/dist/{pipeline → src/pipeline}/steps/fetch.d.ts +0 -0
  1845. /package/dist/{pipeline → src/pipeline}/steps/fetch.js +0 -0
  1846. /package/dist/{pipeline → src/pipeline}/steps/fetch.test.js +0 -0
  1847. /package/dist/{pipeline → src/pipeline}/steps/intercept.d.ts +0 -0
  1848. /package/dist/{pipeline → src/pipeline}/steps/intercept.js +0 -0
  1849. /package/dist/{pipeline → src/pipeline}/steps/tap.d.ts +0 -0
  1850. /package/dist/{pipeline → src/pipeline}/steps/tap.js +0 -0
  1851. /package/dist/{pipeline → src/pipeline}/steps/transform.d.ts +0 -0
  1852. /package/dist/{pipeline → src/pipeline}/steps/transform.js +0 -0
  1853. /package/dist/{pipeline → src/pipeline}/template.d.ts +0 -0
  1854. /package/dist/{pipeline → src/pipeline}/template.js +0 -0
  1855. /package/dist/{pipeline → src/pipeline}/template.test.d.ts +0 -0
  1856. /package/dist/{pipeline → src/pipeline}/template.test.js +0 -0
  1857. /package/dist/{pipeline → src/pipeline}/transform.test.d.ts +0 -0
  1858. /package/dist/{pipeline → src/pipeline}/transform.test.js +0 -0
  1859. /package/dist/{plugin-manifest.d.ts → src/plugin-manifest.d.ts} +0 -0
  1860. /package/dist/{plugin-manifest.js → src/plugin-manifest.js} +0 -0
  1861. /package/dist/{plugin-manifest.test.d.ts → src/plugin-manifest.test.d.ts} +0 -0
  1862. /package/dist/{plugin-manifest.test.js → src/plugin-manifest.test.js} +0 -0
  1863. /package/dist/{plugin-scaffold.d.ts → src/plugin-scaffold.d.ts} +0 -0
  1864. /package/dist/{plugin-scaffold.js → src/plugin-scaffold.js} +0 -0
  1865. /package/dist/{plugin-scaffold.test.d.ts → src/plugin-scaffold.test.d.ts} +0 -0
  1866. /package/dist/{plugin-scaffold.test.js → src/plugin-scaffold.test.js} +0 -0
  1867. /package/dist/{plugin.d.ts → src/plugin.d.ts} +0 -0
  1868. /package/dist/{plugin.js → src/plugin.js} +0 -0
  1869. /package/dist/{plugin.test.d.ts → src/plugin.test.d.ts} +0 -0
  1870. /package/dist/{plugin.test.js → src/plugin.test.js} +0 -0
  1871. /package/dist/{record.d.ts → src/record.d.ts} +0 -0
  1872. /package/dist/{record.test.js → src/record.test.js} +0 -0
  1873. /package/dist/{registry-api.d.ts → src/registry-api.d.ts} +0 -0
  1874. /package/dist/{registry-api.js → src/registry-api.js} +0 -0
  1875. /package/dist/{registry.js → src/registry.js} +0 -0
  1876. /package/dist/{registry.test.d.ts → src/registry.test.d.ts} +0 -0
  1877. /package/dist/{registry.test.js → src/registry.test.js} +0 -0
  1878. /package/dist/{runtime-detect.d.ts → src/runtime-detect.d.ts} +0 -0
  1879. /package/dist/{runtime-detect.js → src/runtime-detect.js} +0 -0
  1880. /package/dist/{runtime-detect.test.js → src/runtime-detect.test.js} +0 -0
  1881. /package/dist/{runtime.d.ts → src/runtime.d.ts} +0 -0
  1882. /package/dist/{runtime.js → src/runtime.js} +0 -0
  1883. /package/dist/{scripts → src/scripts}/framework.d.ts +0 -0
  1884. /package/dist/{scripts → src/scripts}/framework.js +0 -0
  1885. /package/dist/{scripts → src/scripts}/interact.d.ts +0 -0
  1886. /package/dist/{scripts → src/scripts}/interact.js +0 -0
  1887. /package/dist/{scripts → src/scripts}/store.d.ts +0 -0
  1888. /package/dist/{scripts → src/scripts}/store.js +0 -0
  1889. /package/dist/{serialization.test.js → src/serialization.test.js} +0 -0
  1890. /package/dist/{snapshotFormatter.d.ts → src/snapshotFormatter.d.ts} +0 -0
  1891. /package/dist/{snapshotFormatter.js → src/snapshotFormatter.js} +0 -0
  1892. /package/dist/{snapshotFormatter.test.d.ts → src/snapshotFormatter.test.d.ts} +0 -0
  1893. /package/dist/{snapshotFormatter.test.js → src/snapshotFormatter.test.js} +0 -0
  1894. /package/dist/{tui.d.ts → src/tui.d.ts} +0 -0
  1895. /package/dist/{tui.js → src/tui.js} +0 -0
  1896. /package/dist/{tui.test.js → src/tui.test.js} +0 -0
  1897. /package/dist/{types.js → src/types.js} +0 -0
  1898. /package/dist/{update-check.d.ts → src/update-check.d.ts} +0 -0
  1899. /package/dist/{update-check.js → src/update-check.js} +0 -0
  1900. /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
  1901. /package/dist/{utils.js → src/utils.js} +0 -0
  1902. /package/dist/{validate.d.ts → src/validate.d.ts} +0 -0
  1903. /package/dist/{validate.js → src/validate.js} +0 -0
  1904. /package/dist/{verify.d.ts → src/verify.d.ts} +0 -0
  1905. /package/dist/{verify.js → src/verify.js} +0 -0
  1906. /package/dist/{version.d.ts → src/version.d.ts} +0 -0
  1907. /package/dist/{version.js → src/version.js} +0 -0
  1908. /package/dist/{yaml-schema.d.ts → src/yaml-schema.d.ts} +0 -0
  1909. /package/dist/{yaml-schema.js → src/yaml-schema.js} +0 -0
package/src/plugin.ts DELETED
@@ -1,1537 +0,0 @@
1
- /**
2
- * Plugin management: install, uninstall, and list plugins.
3
- *
4
- * Plugins live in ~/.opencli/plugins/<name>/.
5
- * Monorepo clones live in ~/.opencli/monorepos/<repo-name>/.
6
- * Install source format: "github:user/repo", "github:user/repo/subplugin",
7
- * "https://github.com/user/repo", "file:///local/plugin", or a local directory path.
8
- */
9
-
10
- import * as fs from 'node:fs';
11
- import * as os from 'node:os';
12
- import * as path from 'node:path';
13
- import { execSync, execFileSync } from 'node:child_process';
14
- import { fileURLToPath } from 'node:url';
15
- import { PLUGINS_DIR } from './discovery.js';
16
- import { getErrorMessage } from './errors.js';
17
- import { log } from './logger.js';
18
- import {
19
- readPluginManifest,
20
- isMonorepo,
21
- getEnabledPlugins,
22
- checkCompatibility,
23
- type PluginManifest,
24
- } from './plugin-manifest.js';
25
-
26
- const isWindows = process.platform === 'win32';
27
- const LOCAL_PLUGIN_SOURCE_PREFIX = 'local:';
28
-
29
- /** Get home directory, respecting HOME environment variable for test isolation. */
30
- function getHomeDir(): string {
31
- return process.env.HOME || process.env.USERPROFILE || os.homedir();
32
- }
33
-
34
- /** Path to the lock file that tracks installed plugin versions. */
35
- export function getLockFilePath(): string {
36
- return path.join(getHomeDir(), '.opencli', 'plugins.lock.json');
37
- }
38
-
39
- /** Monorepo clones directory: ~/.opencli/monorepos/ */
40
- export function getMonoreposDir(): string {
41
- return path.join(getHomeDir(), '.opencli', 'monorepos');
42
- }
43
-
44
- export type PluginSourceRecord =
45
- | { kind: 'git'; url: string }
46
- | { kind: 'local'; path: string }
47
- | { kind: 'monorepo'; url: string; repoName: string; subPath: string };
48
-
49
- export interface LockEntry {
50
- source: PluginSourceRecord;
51
- commitHash: string;
52
- installedAt: string;
53
- updatedAt?: string;
54
- }
55
-
56
- export interface PluginInfo {
57
- name: string;
58
- path: string;
59
- commands: string[];
60
- source?: string;
61
- version?: string;
62
- installedAt?: string;
63
- /** If from a monorepo, the monorepo name. */
64
- monorepoName?: string;
65
- /** Description from opencli-plugin.json. */
66
- description?: string;
67
- }
68
-
69
- interface ParsedSource {
70
- type: 'git' | 'local';
71
- name: string;
72
- subPlugin?: string;
73
- cloneUrl?: string;
74
- localPath?: string;
75
- }
76
-
77
- function parseStoredPluginSource(source?: string): PluginSourceRecord | undefined {
78
- if (!source) return undefined;
79
- if (source.startsWith(LOCAL_PLUGIN_SOURCE_PREFIX)) {
80
- return {
81
- kind: 'local',
82
- path: path.resolve(source.slice(LOCAL_PLUGIN_SOURCE_PREFIX.length)),
83
- };
84
- }
85
- return { kind: 'git', url: source };
86
- }
87
-
88
- function isLocalPluginSource(source?: string): boolean {
89
- return parseStoredPluginSource(source)?.kind === 'local';
90
- }
91
-
92
- function toStoredPluginSource(source: PluginSourceRecord): string {
93
- if (source.kind === 'local') {
94
- return `${LOCAL_PLUGIN_SOURCE_PREFIX}${path.resolve(source.path)}`;
95
- }
96
- return source.url;
97
- }
98
-
99
- function toLocalPluginSource(pluginDir: string): string {
100
- return toStoredPluginSource({ kind: 'local', path: pluginDir });
101
- }
102
-
103
- function isRecord(value: unknown): value is Record<string, unknown> {
104
- return typeof value === 'object' && value !== null;
105
- }
106
-
107
- function normalizeLegacyMonorepo(
108
- value: unknown,
109
- ): { name: string; subPath: string } | undefined {
110
- if (!isRecord(value)) return undefined;
111
- if (typeof value.name !== 'string' || typeof value.subPath !== 'string') return undefined;
112
- return { name: value.name, subPath: value.subPath };
113
- }
114
-
115
- function normalizePluginSource(
116
- source: unknown,
117
- legacyMonorepo?: { name: string; subPath: string },
118
- ): PluginSourceRecord | undefined {
119
- if (typeof source === 'string') {
120
- const parsed = parseStoredPluginSource(source);
121
- if (!parsed) return undefined;
122
- if (parsed.kind === 'git' && legacyMonorepo) {
123
- return {
124
- kind: 'monorepo',
125
- url: parsed.url,
126
- repoName: legacyMonorepo.name,
127
- subPath: legacyMonorepo.subPath,
128
- };
129
- }
130
- return parsed;
131
- }
132
-
133
- if (!isRecord(source) || typeof source.kind !== 'string') return undefined;
134
- switch (source.kind) {
135
- case 'git':
136
- return typeof source.url === 'string'
137
- ? { kind: 'git', url: source.url }
138
- : undefined;
139
- case 'local':
140
- return typeof source.path === 'string'
141
- ? { kind: 'local', path: path.resolve(source.path) }
142
- : undefined;
143
- case 'monorepo':
144
- return typeof source.url === 'string'
145
- && typeof source.repoName === 'string'
146
- && typeof source.subPath === 'string'
147
- ? {
148
- kind: 'monorepo',
149
- url: source.url,
150
- repoName: source.repoName,
151
- subPath: source.subPath,
152
- }
153
- : undefined;
154
- default:
155
- return undefined;
156
- }
157
- }
158
-
159
- function normalizeLockEntry(value: unknown): LockEntry | undefined {
160
- if (!isRecord(value)) return undefined;
161
-
162
- const legacyMonorepo = normalizeLegacyMonorepo(value.monorepo);
163
- const source = normalizePluginSource(value.source, legacyMonorepo);
164
- if (!source) return undefined;
165
- if (typeof value.commitHash !== 'string' || typeof value.installedAt !== 'string') {
166
- return undefined;
167
- }
168
-
169
- const entry: LockEntry = {
170
- source,
171
- commitHash: value.commitHash,
172
- installedAt: value.installedAt,
173
- };
174
-
175
- if (typeof value.updatedAt === 'string') {
176
- entry.updatedAt = value.updatedAt;
177
- }
178
-
179
- return entry;
180
- }
181
-
182
- function resolvePluginSource(lockEntry: LockEntry | undefined, pluginDir: string): PluginSourceRecord | undefined {
183
- if (lockEntry) {
184
- return lockEntry.source;
185
- }
186
- return parseStoredPluginSource(getPluginSource(pluginDir));
187
- }
188
-
189
- function resolveStoredPluginSource(lockEntry: LockEntry | undefined, pluginDir: string): string | undefined {
190
- const source = resolvePluginSource(lockEntry, pluginDir);
191
- return source ? toStoredPluginSource(source) : undefined;
192
- }
193
-
194
- // ── Filesystem helpers ──────────────────────────────────────────────────────
195
-
196
- /**
197
- * Move a directory, with EXDEV fallback.
198
- * fs.renameSync fails when source and destination are on different
199
- * filesystems (e.g. /tmp → ~/.opencli). In that case we copy then remove.
200
- */
201
- type MoveDirFsOps = Pick<typeof fs, 'renameSync' | 'cpSync' | 'rmSync'>;
202
-
203
- function moveDir(src: string, dest: string, fsOps: MoveDirFsOps = fs): void {
204
- try {
205
- fsOps.renameSync(src, dest);
206
- } catch (err: unknown) {
207
- if ((err as NodeJS.ErrnoException).code === 'EXDEV') {
208
- try {
209
- fsOps.cpSync(src, dest, { recursive: true });
210
- } catch (copyErr) {
211
- try { fsOps.rmSync(dest, { recursive: true, force: true }); } catch {}
212
- throw copyErr;
213
- }
214
- fsOps.rmSync(src, { recursive: true, force: true });
215
- } else {
216
- throw err;
217
- }
218
- }
219
- }
220
-
221
- type PromoteDirFsOps = MoveDirFsOps & Pick<typeof fs, 'existsSync' | 'mkdirSync'>;
222
-
223
- function createSiblingTempPath(dest: string, kind: 'tmp' | 'bak'): string {
224
- const suffix = `${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
225
- return path.join(path.dirname(dest), `.${path.basename(dest)}.${kind}-${suffix}`);
226
- }
227
-
228
- /**
229
- * Promote a prepared staging directory into its final location.
230
- * The final path is only exposed after the directory has been fully prepared.
231
- */
232
- function promoteDir(stagingDir: string, dest: string, fsOps: PromoteDirFsOps = fs): void {
233
- if (fsOps.existsSync(dest)) {
234
- throw new Error(`Destination already exists: ${dest}`);
235
- }
236
-
237
- fsOps.mkdirSync(path.dirname(dest), { recursive: true });
238
- const tempDest = createSiblingTempPath(dest, 'tmp');
239
-
240
- try {
241
- moveDir(stagingDir, tempDest, fsOps);
242
- fsOps.renameSync(tempDest, dest);
243
- } catch (err) {
244
- try { fsOps.rmSync(tempDest, { recursive: true, force: true }); } catch {}
245
- throw err;
246
- }
247
- }
248
-
249
- function replaceDir(stagingDir: string, dest: string, fsOps: PromoteDirFsOps = fs): void {
250
- const replacement = beginReplaceDir(stagingDir, dest, fsOps);
251
- replacement.finalize();
252
- }
253
-
254
- function cloneRepoToTemp(cloneUrl: string): string {
255
- const tmpCloneDir = path.join(
256
- os.tmpdir(),
257
- `opencli-clone-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`,
258
- );
259
-
260
- try {
261
- execFileSync('git', ['clone', '--depth', '1', cloneUrl, tmpCloneDir], {
262
- encoding: 'utf-8',
263
- stdio: ['pipe', 'pipe', 'pipe'],
264
- });
265
- } catch (err) {
266
- throw new Error(`Failed to clone plugin: ${getErrorMessage(err)}`);
267
- }
268
-
269
- return tmpCloneDir;
270
- }
271
-
272
- function withTempClone<T>(cloneUrl: string, work: (cloneDir: string) => T): T {
273
- const tmpCloneDir = cloneRepoToTemp(cloneUrl);
274
- try {
275
- return work(tmpCloneDir);
276
- } finally {
277
- try { fs.rmSync(tmpCloneDir, { recursive: true, force: true }); } catch {}
278
- }
279
- }
280
-
281
- function resolveRemotePluginSource(lockEntry: LockEntry | undefined, dir: string): string {
282
- const source = resolvePluginSource(lockEntry, dir);
283
- if (!source || source.kind === 'local') {
284
- throw new Error(`Unable to determine remote source for plugin at ${dir}`);
285
- }
286
- return source.url;
287
- }
288
-
289
- function pathExistsSync(p: string): boolean {
290
- try {
291
- fs.lstatSync(p);
292
- return true;
293
- } catch {
294
- return false;
295
- }
296
- }
297
-
298
- function removePathSync(p: string): void {
299
- try {
300
- const stat = fs.lstatSync(p);
301
- if (stat.isSymbolicLink()) {
302
- fs.unlinkSync(p);
303
- return;
304
- }
305
- fs.rmSync(p, { recursive: true, force: true });
306
- } catch {}
307
- }
308
-
309
- interface TransactionHandle {
310
- finalize(): void;
311
- rollback(): void;
312
- }
313
-
314
- class Transaction {
315
- #handles: TransactionHandle[] = [];
316
- #settled = false;
317
-
318
- track<T extends TransactionHandle>(handle: T): T {
319
- this.#handles.push(handle);
320
- return handle;
321
- }
322
-
323
- commit(): void {
324
- if (this.#settled) return;
325
- this.#settled = true;
326
- for (const handle of this.#handles) {
327
- handle.finalize();
328
- }
329
- }
330
-
331
- rollback(): void {
332
- if (this.#settled) return;
333
- this.#settled = true;
334
- for (const handle of [...this.#handles].reverse()) {
335
- handle.rollback();
336
- }
337
- }
338
- }
339
-
340
- function runTransaction<T>(work: (tx: Transaction) => T): T {
341
- const tx = new Transaction();
342
- try {
343
- const result = work(tx);
344
- tx.commit();
345
- return result;
346
- } catch (err) {
347
- tx.rollback();
348
- throw err;
349
- }
350
- }
351
-
352
- function beginReplaceDir(
353
- stagingDir: string,
354
- dest: string,
355
- fsOps: PromoteDirFsOps = fs,
356
- ): TransactionHandle {
357
- const destExisted = fsOps.existsSync(dest);
358
- fsOps.mkdirSync(path.dirname(dest), { recursive: true });
359
-
360
- const tempDest = createSiblingTempPath(dest, 'tmp');
361
- const backupDest = destExisted ? createSiblingTempPath(dest, 'bak') : null;
362
- let settled = false;
363
-
364
- try {
365
- moveDir(stagingDir, tempDest, fsOps);
366
- if (backupDest) {
367
- fsOps.renameSync(dest, backupDest);
368
- }
369
- fsOps.renameSync(tempDest, dest);
370
- } catch (err) {
371
- try { fsOps.rmSync(tempDest, { recursive: true, force: true }); } catch {}
372
- if (backupDest && !fsOps.existsSync(dest)) {
373
- try { fsOps.renameSync(backupDest, dest); } catch {}
374
- }
375
- throw err;
376
- }
377
-
378
- return {
379
- finalize() {
380
- if (settled) return;
381
- settled = true;
382
- if (backupDest) {
383
- try { fsOps.rmSync(backupDest, { recursive: true, force: true }); } catch {}
384
- }
385
- },
386
- rollback() {
387
- if (settled) return;
388
- settled = true;
389
- try { fsOps.rmSync(dest, { recursive: true, force: true }); } catch {}
390
- if (backupDest) {
391
- try { fsOps.renameSync(backupDest, dest); } catch {}
392
- }
393
- try { fsOps.rmSync(tempDest, { recursive: true, force: true }); } catch {}
394
- },
395
- };
396
- }
397
-
398
- function beginReplaceSymlink(target: string, linkPath: string): TransactionHandle {
399
- const linkExists = pathExistsSync(linkPath);
400
- if (linkExists && !isSymlinkSync(linkPath)) {
401
- throw new Error(`Expected monorepo plugin link at ${linkPath} to be a symlink`);
402
- }
403
-
404
- fs.mkdirSync(path.dirname(linkPath), { recursive: true });
405
-
406
- const tempLink = createSiblingTempPath(linkPath, 'tmp');
407
- const backupLink = linkExists ? createSiblingTempPath(linkPath, 'bak') : null;
408
- const linkType = isWindows ? 'junction' : 'dir';
409
- let settled = false;
410
-
411
- try {
412
- fs.symlinkSync(target, tempLink, linkType);
413
- if (backupLink) {
414
- fs.renameSync(linkPath, backupLink);
415
- }
416
- fs.renameSync(tempLink, linkPath);
417
- } catch (err) {
418
- removePathSync(tempLink);
419
- if (backupLink && !pathExistsSync(linkPath)) {
420
- try { fs.renameSync(backupLink, linkPath); } catch {}
421
- }
422
- throw err;
423
- }
424
-
425
- return {
426
- finalize() {
427
- if (settled) return;
428
- settled = true;
429
- if (backupLink) {
430
- removePathSync(backupLink);
431
- }
432
- },
433
- rollback() {
434
- if (settled) return;
435
- settled = true;
436
- removePathSync(linkPath);
437
- if (backupLink && !pathExistsSync(linkPath)) {
438
- try { fs.renameSync(backupLink, linkPath); } catch {}
439
- }
440
- removePathSync(tempLink);
441
- },
442
- };
443
- }
444
-
445
- // ── Validation helpers ──────────────────────────────────────────────────────
446
-
447
- export interface ValidationResult {
448
- valid: boolean;
449
- errors: string[];
450
- }
451
-
452
- // ── Lock file helpers ───────────────────────────────────────────────────────
453
-
454
- function readLockFileWithWriter(
455
- writeLock: (lock: Record<string, LockEntry>) => void = writeLockFile,
456
- ): Record<string, LockEntry> {
457
- try {
458
- const raw = fs.readFileSync(getLockFilePath(), 'utf-8');
459
- const parsed = JSON.parse(raw) as unknown;
460
- if (!isRecord(parsed)) return {};
461
-
462
- const lock: Record<string, LockEntry> = {};
463
- let changed = false;
464
-
465
- for (const [name, entry] of Object.entries(parsed)) {
466
- const normalized = normalizeLockEntry(entry);
467
- if (!normalized) {
468
- changed = true;
469
- continue;
470
- }
471
-
472
- lock[name] = normalized;
473
- if (JSON.stringify(entry) !== JSON.stringify(normalized)) {
474
- changed = true;
475
- }
476
- }
477
-
478
- if (changed) {
479
- try {
480
- writeLock(lock);
481
- } catch {}
482
- }
483
-
484
- return lock;
485
- } catch {
486
- return {};
487
- }
488
- }
489
-
490
- export function readLockFile(): Record<string, LockEntry> {
491
- return readLockFileWithWriter(writeLockFile);
492
- }
493
-
494
- type WriteLockFileFsOps = Pick<typeof fs, 'mkdirSync' | 'writeFileSync' | 'renameSync' | 'rmSync'>;
495
-
496
- function writeLockFileWithFs(
497
- lock: Record<string, LockEntry>,
498
- fsOps: WriteLockFileFsOps = fs,
499
- ): void {
500
- const lockPath = getLockFilePath();
501
- fsOps.mkdirSync(path.dirname(lockPath), { recursive: true });
502
- const tempPath = createSiblingTempPath(lockPath, 'tmp');
503
-
504
- try {
505
- fsOps.writeFileSync(tempPath, JSON.stringify(lock, null, 2) + '\n');
506
- fsOps.renameSync(tempPath, lockPath);
507
- } catch (err) {
508
- try { fsOps.rmSync(tempPath, { force: true }); } catch {}
509
- throw err;
510
- }
511
- }
512
-
513
- export function writeLockFile(lock: Record<string, LockEntry>): void {
514
- writeLockFileWithFs(lock, fs);
515
- }
516
-
517
- /** Get the HEAD commit hash of a git repo directory. */
518
- export function getCommitHash(dir: string): string | undefined {
519
- try {
520
- return execFileSync('git', ['rev-parse', 'HEAD'], {
521
- cwd: dir,
522
- encoding: 'utf-8',
523
- stdio: ['pipe', 'pipe', 'pipe'],
524
- }).trim();
525
- } catch {
526
- return undefined;
527
- }
528
- }
529
-
530
- /**
531
- * Validate that a downloaded plugin directory is a structurally valid plugin.
532
- * Checks for at least one command file (.yaml, .yml, .ts, .js) and a valid
533
- * package.json if it contains .ts files.
534
- */
535
- export function validatePluginStructure(pluginDir: string): ValidationResult {
536
- const errors: string[] = [];
537
-
538
- if (!fs.existsSync(pluginDir)) {
539
- return { valid: false, errors: ['Plugin directory does not exist'] };
540
- }
541
-
542
- const files = fs.readdirSync(pluginDir);
543
- const hasYaml = files.some(f => f.endsWith('.yaml') || f.endsWith('.yml'));
544
- const hasTs = files.some(f => f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts'));
545
- const hasJs = files.some(f => f.endsWith('.js') && !f.endsWith('.d.js'));
546
-
547
- if (!hasYaml && !hasTs && !hasJs) {
548
- errors.push('No command files found in plugin directory. A plugin must contain at least one .yaml, .ts, or .js command file.');
549
- }
550
-
551
- if (hasTs) {
552
- const pkgJsonPath = path.join(pluginDir, 'package.json');
553
- if (!fs.existsSync(pkgJsonPath)) {
554
- errors.push('Plugin contains .ts files but no package.json. A package.json with "type": "module" and "@jackwener/opencli" peer dependency is required for TS plugins.');
555
- } else {
556
- try {
557
- const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
558
- if (pkg.type !== 'module') {
559
- errors.push('Plugin package.json must have "type": "module" for TypeScript plugins.');
560
- }
561
- } catch {
562
- errors.push('Plugin package.json is malformed or invalid JSON.');
563
- }
564
- }
565
- }
566
-
567
- return { valid: errors.length === 0, errors };
568
- }
569
-
570
- function installDependencies(dir: string): void {
571
- const pkgJsonPath = path.join(dir, 'package.json');
572
- if (!fs.existsSync(pkgJsonPath)) return;
573
-
574
- try {
575
- execFileSync('npm', ['install', '--omit=dev'], {
576
- cwd: dir,
577
- encoding: 'utf-8',
578
- stdio: ['pipe', 'pipe', 'pipe'],
579
- ...(isWindows && { shell: true }),
580
- });
581
- } catch (err) {
582
- throw new Error(`npm install failed in ${dir}: ${getErrorMessage(err)}`);
583
- }
584
- }
585
-
586
- function finalizePluginRuntime(pluginDir: string): void {
587
- // Symlink host opencli so TS plugins resolve '@jackwener/opencli/registry'
588
- // against the running host, not a stale npm-published version.
589
- linkHostOpencli(pluginDir);
590
-
591
- // Transpile .ts → .js via esbuild (production node can't load .ts directly).
592
- transpilePluginTs(pluginDir);
593
- }
594
-
595
- /**
596
- * Shared post-install lifecycle for standalone plugins.
597
- */
598
- function postInstallLifecycle(pluginDir: string): void {
599
- installDependencies(pluginDir);
600
- finalizePluginRuntime(pluginDir);
601
- }
602
-
603
- /**
604
- * Monorepo lifecycle: install shared deps once at repo root, then finalize each sub-plugin.
605
- */
606
- function postInstallMonorepoLifecycle(repoDir: string, pluginDirs: string[]): void {
607
- installDependencies(repoDir);
608
- for (const pluginDir of pluginDirs) {
609
- finalizePluginRuntime(pluginDir);
610
- }
611
- }
612
-
613
- function ensureStandalonePluginReady(pluginDir: string): void {
614
- const validation = validatePluginStructure(pluginDir);
615
- if (!validation.valid) {
616
- throw new Error(`Invalid plugin structure:\n- ${validation.errors.join('\n- ')}`);
617
- }
618
-
619
- postInstallLifecycle(pluginDir);
620
- }
621
-
622
- type LockEntryInput = Omit<LockEntry, 'installedAt'> & Partial<Pick<LockEntry, 'installedAt'>>;
623
-
624
- function upsertLockEntry(
625
- lock: Record<string, LockEntry>,
626
- name: string,
627
- entry: LockEntryInput,
628
- ): void {
629
- lock[name] = {
630
- ...entry,
631
- installedAt: entry.installedAt ?? new Date().toISOString(),
632
- };
633
- }
634
-
635
- function publishStandalonePlugin(
636
- stagingDir: string,
637
- targetDir: string,
638
- writeLock: (commitHash: string | undefined) => void,
639
- ): void {
640
- runTransaction((tx) => {
641
- tx.track(beginReplaceDir(stagingDir, targetDir));
642
- writeLock(getCommitHash(targetDir));
643
- });
644
- }
645
-
646
- interface MonorepoPublishPlugin {
647
- name: string;
648
- subPath: string;
649
- }
650
-
651
- function publishMonorepoPlugins(
652
- repoDir: string,
653
- pluginsDir: string,
654
- plugins: MonorepoPublishPlugin[],
655
- publishRepo?: { stagingDir: string; parentDir: string },
656
- writeLock?: (commitHash: string | undefined) => void,
657
- ): void {
658
- runTransaction((tx) => {
659
- if (publishRepo) {
660
- fs.mkdirSync(publishRepo.parentDir, { recursive: true });
661
- tx.track(beginReplaceDir(publishRepo.stagingDir, repoDir));
662
- }
663
-
664
- const commitHash = getCommitHash(repoDir);
665
- for (const plugin of plugins) {
666
- const linkPath = path.join(pluginsDir, plugin.name);
667
- const subDir = path.join(repoDir, plugin.subPath);
668
- tx.track(beginReplaceSymlink(subDir, linkPath));
669
- }
670
-
671
- writeLock?.(commitHash);
672
- });
673
- }
674
-
675
- /**
676
- * Install a plugin from a source.
677
- * Supports:
678
- * "github:user/repo" — single plugin or full monorepo
679
- * "github:user/repo/subplugin" — specific sub-plugin from a monorepo
680
- * "https://github.com/user/repo"
681
- * "file:///absolute/path" — local plugin directory (symlinked)
682
- * "/absolute/path" — local plugin directory (symlinked)
683
- *
684
- * Returns the installed plugin name(s).
685
- */
686
- export function installPlugin(source: string): string | string[] {
687
- const parsed = parseSource(source);
688
- if (!parsed) {
689
- throw new Error(
690
- `Invalid plugin source: "${source}"\n` +
691
- `Supported formats:\n` +
692
- ` github:user/repo\n` +
693
- ` github:user/repo/subplugin\n` +
694
- ` https://github.com/user/repo\n` +
695
- ` https://<host>/<path>/repo.git\n` +
696
- ` ssh://git@<host>/<path>/repo.git\n` +
697
- ` git@<host>:user/repo.git\n` +
698
- ` file:///absolute/path\n` +
699
- ` /absolute/path`
700
- );
701
- }
702
-
703
- const { name: repoName, subPlugin } = parsed;
704
-
705
- if (parsed.type === 'local') {
706
- return installLocalPlugin(parsed.localPath!, repoName);
707
- }
708
-
709
- return withTempClone(parsed.cloneUrl!, (tmpCloneDir) => {
710
- const manifest = readPluginManifest(tmpCloneDir);
711
-
712
- // Check top-level compatibility
713
- if (manifest?.opencli && !checkCompatibility(manifest.opencli)) {
714
- throw new Error(
715
- `Plugin requires opencli ${manifest.opencli}, but current version is incompatible.`
716
- );
717
- }
718
-
719
- if (manifest && isMonorepo(manifest)) {
720
- return installMonorepo(tmpCloneDir, parsed.cloneUrl!, repoName, manifest, subPlugin);
721
- }
722
-
723
- // Single plugin mode
724
- return installSinglePlugin(tmpCloneDir, parsed.cloneUrl!, repoName, manifest);
725
- });
726
- }
727
-
728
- /** Install a single (non-monorepo) plugin. */
729
- function installSinglePlugin(
730
- cloneDir: string,
731
- cloneUrl: string,
732
- name: string,
733
- manifest: PluginManifest | null,
734
- ): string {
735
- const pluginName = manifest?.name ?? name;
736
- const targetDir = path.join(PLUGINS_DIR, pluginName);
737
-
738
- if (fs.existsSync(targetDir)) {
739
- throw new Error(`Plugin "${pluginName}" is already installed at ${targetDir}`);
740
- }
741
-
742
- ensureStandalonePluginReady(cloneDir);
743
- publishStandalonePlugin(cloneDir, targetDir, (commitHash) => {
744
- const lock = readLockFile();
745
- if (commitHash) {
746
- upsertLockEntry(lock, pluginName, {
747
- source: { kind: 'git', url: cloneUrl },
748
- commitHash,
749
- });
750
- writeLockFile(lock);
751
- }
752
- });
753
-
754
- return pluginName;
755
- }
756
-
757
- /**
758
- * Install a local plugin by creating a symlink.
759
- * Used for plugin development: the source directory is symlinked into
760
- * the plugins dir so changes are reflected immediately.
761
- */
762
- function installLocalPlugin(localPath: string, name: string): string {
763
- if (!fs.existsSync(localPath)) {
764
- throw new Error(`Local plugin path does not exist: ${localPath}`);
765
- }
766
-
767
- const stat = fs.statSync(localPath);
768
- if (!stat.isDirectory()) {
769
- throw new Error(`Local plugin path is not a directory: ${localPath}`);
770
- }
771
-
772
- const manifest = readPluginManifest(localPath);
773
-
774
- if (manifest?.opencli && !checkCompatibility(manifest.opencli)) {
775
- throw new Error(
776
- `Plugin requires opencli ${manifest.opencli}, but current version is incompatible.`
777
- );
778
- }
779
-
780
- const pluginName = manifest?.name ?? name;
781
- const targetDir = path.join(PLUGINS_DIR, pluginName);
782
-
783
- if (fs.existsSync(targetDir)) {
784
- throw new Error(`Plugin "${pluginName}" is already installed at ${targetDir}`);
785
- }
786
-
787
- const validation = validatePluginStructure(localPath);
788
- if (!validation.valid) {
789
- throw new Error(`Invalid plugin structure:\n- ${validation.errors.join('\n- ')}`);
790
- }
791
-
792
- fs.mkdirSync(PLUGINS_DIR, { recursive: true });
793
-
794
- const resolvedPath = path.resolve(localPath);
795
- const linkType = isWindows ? 'junction' : 'dir';
796
- fs.symlinkSync(resolvedPath, targetDir, linkType);
797
-
798
- installDependencies(localPath);
799
- finalizePluginRuntime(localPath);
800
-
801
- const lock = readLockFile();
802
- const commitHash = getCommitHash(localPath);
803
- upsertLockEntry(lock, pluginName, {
804
- source: { kind: 'local', path: resolvedPath },
805
- commitHash: commitHash ?? 'local',
806
- });
807
- writeLockFile(lock);
808
-
809
- return pluginName;
810
- }
811
-
812
- function updateLocalPlugin(
813
- name: string,
814
- targetDir: string,
815
- lock: Record<string, LockEntry>,
816
- lockEntry?: LockEntry,
817
- ): void {
818
- const pluginDir = fs.realpathSync(targetDir);
819
-
820
- const validation = validatePluginStructure(pluginDir);
821
- if (!validation.valid) {
822
- log.warn(`Plugin "${name}" structure invalid:\n- ${validation.errors.join('\n- ')}`);
823
- }
824
-
825
- postInstallLifecycle(pluginDir);
826
-
827
- upsertLockEntry(lock, name, {
828
- source: lockEntry?.source ?? { kind: 'local', path: pluginDir },
829
- commitHash: getCommitHash(pluginDir) ?? 'local',
830
- installedAt: lockEntry?.installedAt ?? new Date().toISOString(),
831
- updatedAt: new Date().toISOString(),
832
- });
833
- writeLockFile(lock);
834
- }
835
-
836
- /** Install sub-plugins from a monorepo. */
837
- function installMonorepo(
838
- cloneDir: string,
839
- cloneUrl: string,
840
- repoName: string,
841
- manifest: PluginManifest,
842
- subPlugin?: string,
843
- ): string[] {
844
- const monoreposDir = getMonoreposDir();
845
- const repoDir = path.join(monoreposDir, repoName);
846
- const repoAlreadyInstalled = fs.existsSync(repoDir);
847
- const repoRoot = repoAlreadyInstalled ? repoDir : cloneDir;
848
- const effectiveManifest = repoAlreadyInstalled ? readPluginManifest(repoDir) : manifest;
849
-
850
- if (!effectiveManifest || !isMonorepo(effectiveManifest)) {
851
- throw new Error(`Monorepo manifest missing or invalid at ${repoRoot}`);
852
- }
853
-
854
- let pluginsToInstall = getEnabledPlugins(effectiveManifest);
855
-
856
- // If a specific sub-plugin was requested, filter to just that one
857
- if (subPlugin) {
858
- pluginsToInstall = pluginsToInstall.filter((p) => p.name === subPlugin);
859
- if (pluginsToInstall.length === 0) {
860
- // Check if it exists but is disabled
861
- const disabled = effectiveManifest.plugins?.[subPlugin];
862
- if (disabled) {
863
- throw new Error(`Sub-plugin "${subPlugin}" is disabled in the manifest.`);
864
- }
865
- throw new Error(
866
- `Sub-plugin "${subPlugin}" not found in monorepo. Available: ${Object.keys(effectiveManifest.plugins ?? {}).join(', ')}`
867
- );
868
- }
869
- }
870
-
871
- const installedNames: string[] = [];
872
- const lock = readLockFile();
873
- const eligiblePlugins: Array<{ name: string; entry: typeof pluginsToInstall[number]['entry'] }> = [];
874
-
875
- fs.mkdirSync(PLUGINS_DIR, { recursive: true });
876
-
877
- for (const { name, entry } of pluginsToInstall) {
878
- // Check sub-plugin level compatibility (overrides top-level)
879
- if (entry.opencli && !checkCompatibility(entry.opencli)) {
880
- log.warn(`Skipping "${name}": requires opencli ${entry.opencli}`);
881
- continue;
882
- }
883
-
884
- const subDir = path.join(repoRoot, entry.path);
885
- if (!fs.existsSync(subDir)) {
886
- log.warn(`Skipping "${name}": path "${entry.path}" not found in repo.`);
887
- continue;
888
- }
889
-
890
- const validation = validatePluginStructure(subDir);
891
- if (!validation.valid) {
892
- log.warn(`Skipping "${name}": invalid structure — ${validation.errors.join(', ')}`);
893
- continue;
894
- }
895
-
896
- const linkPath = path.join(PLUGINS_DIR, name);
897
- if (fs.existsSync(linkPath)) {
898
- log.warn(`Skipping "${name}": already installed at ${linkPath}`);
899
- continue;
900
- }
901
-
902
- eligiblePlugins.push({ name, entry });
903
- }
904
-
905
- if (eligiblePlugins.length === 0) {
906
- return installedNames;
907
- }
908
-
909
- const publishPlugins = eligiblePlugins.map(({ name, entry }) => ({ name, subPath: entry.path }));
910
-
911
- if (repoAlreadyInstalled) {
912
- postInstallMonorepoLifecycle(repoDir, eligiblePlugins.map((p) => path.join(repoDir, p.entry.path)));
913
- } else {
914
- postInstallMonorepoLifecycle(cloneDir, eligiblePlugins.map((p) => path.join(cloneDir, p.entry.path)));
915
- }
916
-
917
- publishMonorepoPlugins(
918
- repoDir,
919
- PLUGINS_DIR,
920
- publishPlugins,
921
- repoAlreadyInstalled ? undefined : { stagingDir: cloneDir, parentDir: monoreposDir },
922
- (commitHash) => {
923
- for (const { name, entry } of eligiblePlugins) {
924
- if (commitHash) {
925
- upsertLockEntry(lock, name, {
926
- source: {
927
- kind: 'monorepo',
928
- url: cloneUrl,
929
- repoName,
930
- subPath: entry.path,
931
- },
932
- commitHash,
933
- });
934
- }
935
- installedNames.push(name);
936
- }
937
- writeLockFile(lock);
938
- },
939
- );
940
-
941
- return installedNames;
942
- }
943
-
944
- function collectUpdatedMonorepoPlugins(
945
- monoName: string,
946
- lock: Record<string, LockEntry>,
947
- manifest: PluginManifest,
948
- cloneUrl: string,
949
- tmpCloneDir: string,
950
- ): Array<{
951
- name: string;
952
- lockEntry: LockEntry;
953
- manifestEntry: NonNullable<PluginManifest['plugins']>[string];
954
- }> {
955
- const updatedPlugins: Array<{
956
- name: string;
957
- lockEntry: LockEntry;
958
- manifestEntry: NonNullable<PluginManifest['plugins']>[string];
959
- }> = [];
960
-
961
- for (const [pluginName, entry] of Object.entries(lock)) {
962
- if (entry.source.kind !== 'monorepo' || entry.source.repoName !== monoName) continue;
963
- const manifestEntry = manifest.plugins?.[pluginName];
964
- if (!manifestEntry || manifestEntry.disabled) {
965
- throw new Error(`Installed sub-plugin "${pluginName}" no longer exists in ${cloneUrl}`);
966
- }
967
- if (manifestEntry.opencli && !checkCompatibility(manifestEntry.opencli)) {
968
- throw new Error(`Sub-plugin "${pluginName}" requires opencli ${manifestEntry.opencli}`);
969
- }
970
-
971
- const subDir = path.join(tmpCloneDir, manifestEntry.path);
972
- const validation = validatePluginStructure(subDir);
973
- if (!validation.valid) {
974
- throw new Error(`Updated sub-plugin "${pluginName}" is invalid:\n- ${validation.errors.join('\n- ')}`);
975
- }
976
- updatedPlugins.push({ name: pluginName, lockEntry: entry, manifestEntry });
977
- }
978
-
979
- return updatedPlugins;
980
- }
981
-
982
- function updateMonorepoLockEntries(
983
- lock: Record<string, LockEntry>,
984
- plugins: Array<{
985
- name: string;
986
- lockEntry: LockEntry;
987
- manifestEntry: NonNullable<PluginManifest['plugins']>[string];
988
- }>,
989
- cloneUrl: string,
990
- monoName: string,
991
- commitHash: string | undefined,
992
- ): void {
993
- for (const plugin of plugins) {
994
- if (!commitHash) continue;
995
- upsertLockEntry(lock, plugin.name, {
996
- ...plugin.lockEntry,
997
- source: {
998
- kind: 'monorepo',
999
- url: cloneUrl,
1000
- repoName: monoName,
1001
- subPath: plugin.manifestEntry.path,
1002
- },
1003
- commitHash,
1004
- updatedAt: new Date().toISOString(),
1005
- });
1006
- }
1007
- }
1008
-
1009
- function updateStandaloneLockEntry(
1010
- lock: Record<string, LockEntry>,
1011
- name: string,
1012
- cloneUrl: string,
1013
- existing: LockEntry | undefined,
1014
- commitHash: string | undefined,
1015
- ): void {
1016
- if (!commitHash) return;
1017
-
1018
- upsertLockEntry(lock, name, {
1019
- source: { kind: 'git', url: cloneUrl },
1020
- commitHash,
1021
- installedAt: existing?.installedAt ?? new Date().toISOString(),
1022
- updatedAt: new Date().toISOString(),
1023
- });
1024
- }
1025
-
1026
- /**
1027
- * Uninstall a plugin by name.
1028
- * For monorepo sub-plugins: removes symlink and cleans up the monorepo
1029
- * directory when no more sub-plugins reference it.
1030
- */
1031
- export function uninstallPlugin(name: string): void {
1032
- const targetDir = path.join(PLUGINS_DIR, name);
1033
- if (!fs.existsSync(targetDir)) {
1034
- throw new Error(`Plugin "${name}" is not installed.`);
1035
- }
1036
-
1037
- const lock = readLockFile();
1038
- const lockEntry = lock[name];
1039
-
1040
- // Check if this is a symlink (monorepo sub-plugin)
1041
- const isSymlink = isSymlinkSync(targetDir);
1042
-
1043
- if (isSymlink) {
1044
- // Remove symlink only (not the actual directory)
1045
- fs.unlinkSync(targetDir);
1046
- } else {
1047
- fs.rmSync(targetDir, { recursive: true, force: true });
1048
- }
1049
-
1050
- // Clean up monorepo directory if no more sub-plugins reference it
1051
- if (lockEntry?.source.kind === 'monorepo') {
1052
- delete lock[name];
1053
- const monoName = lockEntry.source.repoName;
1054
- const stillReferenced = Object.values(lock).some(
1055
- (entry) => entry.source.kind === 'monorepo' && entry.source.repoName === monoName,
1056
- );
1057
- if (!stillReferenced) {
1058
- const monoDir = path.join(getMonoreposDir(), monoName);
1059
- try { fs.rmSync(monoDir, { recursive: true, force: true }); } catch {}
1060
- }
1061
- } else if (lock[name]) {
1062
- delete lock[name];
1063
- }
1064
-
1065
- writeLockFile(lock);
1066
- }
1067
-
1068
- /** Synchronous check if a path is a symlink. */
1069
- function isSymlinkSync(p: string): boolean {
1070
- try {
1071
- return fs.lstatSync(p).isSymbolicLink();
1072
- } catch {
1073
- return false;
1074
- }
1075
- }
1076
-
1077
- /**
1078
- * Update a plugin by name (git pull + re-install lifecycle).
1079
- * For monorepo sub-plugins: pulls the monorepo root and re-runs lifecycle
1080
- * for all sub-plugins from the same monorepo.
1081
- */
1082
- export function updatePlugin(name: string): void {
1083
- const targetDir = path.join(PLUGINS_DIR, name);
1084
- if (!fs.existsSync(targetDir)) {
1085
- throw new Error(`Plugin "${name}" is not installed.`);
1086
- }
1087
-
1088
- const lock = readLockFile();
1089
- const lockEntry = lock[name];
1090
- const source = resolvePluginSource(lockEntry, targetDir);
1091
-
1092
- if (source?.kind === 'local') {
1093
- updateLocalPlugin(name, targetDir, lock, lockEntry);
1094
- return;
1095
- }
1096
-
1097
- if (source?.kind === 'monorepo') {
1098
- const monoDir = path.join(getMonoreposDir(), source.repoName);
1099
- const monoName = source.repoName;
1100
- const cloneUrl = source.url;
1101
- withTempClone(cloneUrl, (tmpCloneDir) => {
1102
- const manifest = readPluginManifest(tmpCloneDir);
1103
- if (!manifest || !isMonorepo(manifest)) {
1104
- throw new Error(`Updated source is no longer a monorepo: ${cloneUrl}`);
1105
- }
1106
-
1107
- if (manifest.opencli && !checkCompatibility(manifest.opencli)) {
1108
- throw new Error(
1109
- `Plugin requires opencli ${manifest.opencli}, but current version is incompatible.`
1110
- );
1111
- }
1112
-
1113
- const updatedPlugins = collectUpdatedMonorepoPlugins(
1114
- monoName,
1115
- lock,
1116
- manifest,
1117
- cloneUrl,
1118
- tmpCloneDir,
1119
- );
1120
-
1121
- if (updatedPlugins.length > 0) {
1122
- postInstallMonorepoLifecycle(tmpCloneDir, updatedPlugins.map((plugin) => path.join(tmpCloneDir, plugin.manifestEntry.path)));
1123
- }
1124
-
1125
- publishMonorepoPlugins(
1126
- monoDir,
1127
- PLUGINS_DIR,
1128
- updatedPlugins.map((plugin) => ({ name: plugin.name, subPath: plugin.manifestEntry.path })),
1129
- { stagingDir: tmpCloneDir, parentDir: path.dirname(monoDir) },
1130
- (commitHash) => {
1131
- updateMonorepoLockEntries(lock, updatedPlugins, cloneUrl, monoName, commitHash);
1132
- writeLockFile(lock);
1133
- },
1134
- );
1135
- });
1136
- return;
1137
- }
1138
-
1139
- const cloneUrl = resolveRemotePluginSource(lockEntry, targetDir);
1140
- withTempClone(cloneUrl, (tmpCloneDir) => {
1141
- const manifest = readPluginManifest(tmpCloneDir);
1142
- if (manifest && isMonorepo(manifest)) {
1143
- throw new Error(`Updated source is now a monorepo: ${cloneUrl}`);
1144
- }
1145
-
1146
- if (manifest?.opencli && !checkCompatibility(manifest.opencli)) {
1147
- throw new Error(
1148
- `Plugin requires opencli ${manifest.opencli}, but current version is incompatible.`
1149
- );
1150
- }
1151
-
1152
- ensureStandalonePluginReady(tmpCloneDir);
1153
- publishStandalonePlugin(tmpCloneDir, targetDir, (commitHash) => {
1154
- updateStandaloneLockEntry(lock, name, cloneUrl, lock[name], commitHash);
1155
- if (commitHash) {
1156
- writeLockFile(lock);
1157
- }
1158
- });
1159
- });
1160
- }
1161
-
1162
- export interface UpdateResult {
1163
- name: string;
1164
- success: boolean;
1165
- error?: string;
1166
- }
1167
-
1168
- /**
1169
- * Update all installed plugins.
1170
- * Continues even if individual plugin updates fail.
1171
- */
1172
- export function updateAllPlugins(): UpdateResult[] {
1173
- return listPlugins().map((plugin): UpdateResult => {
1174
- try {
1175
- updatePlugin(plugin.name);
1176
- return { name: plugin.name, success: true };
1177
- } catch (err) {
1178
- return {
1179
- name: plugin.name,
1180
- success: false,
1181
- error: getErrorMessage(err),
1182
- };
1183
- }
1184
- });
1185
- }
1186
-
1187
- /**
1188
- * List all installed plugins.
1189
- * Reads opencli-plugin.json for description/version when available.
1190
- */
1191
- export function listPlugins(): PluginInfo[] {
1192
- if (!fs.existsSync(PLUGINS_DIR)) return [];
1193
-
1194
- const entries = fs.readdirSync(PLUGINS_DIR, { withFileTypes: true });
1195
- const lock = readLockFile();
1196
- const plugins: PluginInfo[] = [];
1197
-
1198
- for (const entry of entries) {
1199
- // Accept both real directories and symlinks (monorepo sub-plugins)
1200
- const pluginDir = path.join(PLUGINS_DIR, entry.name);
1201
- const isDir = entry.isDirectory() || isSymlinkSync(pluginDir);
1202
- if (!isDir) continue;
1203
-
1204
- const commands = scanPluginCommands(pluginDir);
1205
- const lockEntry = lock[entry.name];
1206
-
1207
- // Try to read manifest for metadata
1208
- const manifest = readPluginManifest(pluginDir);
1209
- // For monorepo sub-plugins, also check the monorepo root manifest
1210
- let description = manifest?.description;
1211
- let version = manifest?.version;
1212
- if (lockEntry?.source.kind === 'monorepo' && !description) {
1213
- const monoDir = path.join(getMonoreposDir(), lockEntry.source.repoName);
1214
- const monoManifest = readPluginManifest(monoDir);
1215
- const subEntry = monoManifest?.plugins?.[entry.name];
1216
- if (subEntry) {
1217
- description = description ?? subEntry.description;
1218
- version = version ?? subEntry.version;
1219
- }
1220
- }
1221
-
1222
- const source = resolveStoredPluginSource(lockEntry, pluginDir);
1223
-
1224
- plugins.push({
1225
- name: entry.name,
1226
- path: pluginDir,
1227
- commands,
1228
- source,
1229
- version: version ?? lockEntry?.commitHash?.slice(0, 7),
1230
- installedAt: lockEntry?.installedAt,
1231
- monorepoName: lockEntry?.source.kind === 'monorepo' ? lockEntry.source.repoName : undefined,
1232
- description,
1233
- });
1234
- }
1235
-
1236
- return plugins;
1237
- }
1238
-
1239
- /** Scan a plugin directory for command files */
1240
- function scanPluginCommands(dir: string): string[] {
1241
- try {
1242
- const files = fs.readdirSync(dir);
1243
- const names = new Set(
1244
- files
1245
- .filter(f =>
1246
- f.endsWith('.yaml') || f.endsWith('.yml') ||
1247
- (f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts')) ||
1248
- (f.endsWith('.js') && !f.endsWith('.d.js'))
1249
- )
1250
- .map(f => path.basename(f, path.extname(f)))
1251
- );
1252
- return [...names];
1253
- } catch {
1254
- return [];
1255
- }
1256
- }
1257
-
1258
- /** Get git remote origin URL */
1259
- function getPluginSource(dir: string): string | undefined {
1260
- try {
1261
- return execFileSync('git', ['config', '--get', 'remote.origin.url'], {
1262
- cwd: dir,
1263
- encoding: 'utf-8',
1264
- stdio: ['pipe', 'pipe', 'pipe'],
1265
- }).trim();
1266
- } catch {
1267
- return undefined;
1268
- }
1269
- }
1270
-
1271
- /** Parse a plugin source string into clone URL, repo name, and optional sub-plugin. */
1272
- function parseSource(
1273
- source: string,
1274
- ): ParsedSource | null {
1275
- if (source.startsWith('file://')) {
1276
- try {
1277
- const localPath = path.resolve(fileURLToPath(source));
1278
- return {
1279
- type: 'local',
1280
- localPath,
1281
- name: path.basename(localPath).replace(/^opencli-plugin-/, ''),
1282
- };
1283
- } catch {
1284
- return null;
1285
- }
1286
- }
1287
-
1288
- if (path.isAbsolute(source)) {
1289
- const localPath = path.resolve(source);
1290
- return {
1291
- type: 'local',
1292
- localPath,
1293
- name: path.basename(localPath).replace(/^opencli-plugin-/, ''),
1294
- };
1295
- }
1296
-
1297
- // github:user/repo/subplugin (monorepo specific sub-plugin)
1298
- const githubSubMatch = source.match(
1299
- /^github:([\w.-]+)\/([\w.-]+)\/([\w.-]+)$/,
1300
- );
1301
- if (githubSubMatch) {
1302
- const [, user, repo, sub] = githubSubMatch;
1303
- const name = repo.replace(/^opencli-plugin-/, '');
1304
- return {
1305
- type: 'git',
1306
- cloneUrl: `https://github.com/${user}/${repo}.git`,
1307
- name,
1308
- subPlugin: sub,
1309
- };
1310
- }
1311
-
1312
- // github:user/repo
1313
- const githubMatch = source.match(/^github:([\w.-]+)\/([\w.-]+)$/);
1314
- if (githubMatch) {
1315
- const [, user, repo] = githubMatch;
1316
- const name = repo.replace(/^opencli-plugin-/, '');
1317
- return {
1318
- type: 'git',
1319
- cloneUrl: `https://github.com/${user}/${repo}.git`,
1320
- name,
1321
- };
1322
- }
1323
-
1324
- // https://github.com/user/repo (or .git)
1325
- const urlMatch = source.match(
1326
- /^https?:\/\/github\.com\/([\w.-]+)\/([\w.-]+?)(?:\.git)?$/,
1327
- );
1328
- if (urlMatch) {
1329
- const [, user, repo] = urlMatch;
1330
- const name = repo.replace(/^opencli-plugin-/, '');
1331
- return {
1332
- type: 'git',
1333
- cloneUrl: `https://github.com/${user}/${repo}.git`,
1334
- name,
1335
- };
1336
- }
1337
-
1338
- // ── Generic git URL support ─────────────────────────────────────────────
1339
-
1340
- // ssh://git@host/path/to/repo.git
1341
- const sshUrlMatch = source.match(/^ssh:\/\/[^/]+\/(.*?)(?:\.git)?$/);
1342
- if (sshUrlMatch) {
1343
- const pathPart = sshUrlMatch[1];
1344
- const segments = pathPart.split('/');
1345
- const repoSegment = segments.pop()!;
1346
- const name = repoSegment.replace(/^opencli-plugin-/, '');
1347
- return { type: 'git', cloneUrl: source, name };
1348
- }
1349
-
1350
- // git@host:user/repo.git (SCP-style)
1351
- const scpMatch = source.match(/^git@[^:]+:(.+?)(?:\.git)?$/);
1352
- if (scpMatch) {
1353
- const pathPart = scpMatch[1];
1354
- const segments = pathPart.split('/');
1355
- const repoSegment = segments.pop()!;
1356
- const name = repoSegment.replace(/^opencli-plugin-/, '');
1357
- return { type: 'git', cloneUrl: source, name };
1358
- }
1359
-
1360
- // Generic https/http git URL (non-GitHub hosts)
1361
- const genericHttpMatch = source.match(
1362
- /^https?:\/\/[^/]+\/(.+?)(?:\.git)?$/,
1363
- );
1364
- if (genericHttpMatch) {
1365
- const pathPart = genericHttpMatch[1];
1366
- const segments = pathPart.split('/');
1367
- const repoSegment = segments.pop()!;
1368
- const name = repoSegment.replace(/^opencli-plugin-/, '');
1369
- // Ensure clone URL ends with .git
1370
- const cloneUrl = source.endsWith('.git') ? source : `${source}.git`;
1371
- return { type: 'git', cloneUrl, name };
1372
- }
1373
-
1374
- return null;
1375
- }
1376
-
1377
- /**
1378
- * Symlink the host opencli package into a plugin's node_modules.
1379
- * This ensures TS plugins resolve '@jackwener/opencli/registry' against
1380
- * the running host installation rather than a stale npm-published version.
1381
- */
1382
- function linkHostOpencli(pluginDir: string): void {
1383
- try {
1384
- // Determine the host opencli package root from this module's location.
1385
- // Both dev (tsx src/plugin.ts) and prod (node dist/plugin.js) are one level
1386
- // deep, so path.dirname + '..' always gives us the package root.
1387
- const thisFile = fileURLToPath(import.meta.url);
1388
- const hostRoot = path.resolve(path.dirname(thisFile), '..');
1389
-
1390
- const targetLink = path.join(pluginDir, 'node_modules', '@jackwener', 'opencli');
1391
-
1392
- // Remove existing (npm-installed copy or stale symlink)
1393
- if (fs.existsSync(targetLink)) {
1394
- fs.rmSync(targetLink, { recursive: true, force: true });
1395
- }
1396
-
1397
- // Ensure parent directory exists
1398
- fs.mkdirSync(path.dirname(targetLink), { recursive: true });
1399
-
1400
- // Use 'junction' on Windows (doesn't require admin privileges),
1401
- // 'dir' symlink on other platforms.
1402
- const linkType = isWindows ? 'junction' : 'dir';
1403
- fs.symlinkSync(hostRoot, targetLink, linkType);
1404
- log.debug(`Linked host opencli into plugin: ${targetLink} → ${hostRoot}`);
1405
- } catch (err) {
1406
- log.warn(`Failed to link host opencli into plugin: ${getErrorMessage(err)}`);
1407
- }
1408
- }
1409
-
1410
- /**
1411
- * Resolve the path to the esbuild CLI executable with fallback strategies.
1412
- */
1413
- export function resolveEsbuildBin(): string | null {
1414
- const thisFile = fileURLToPath(import.meta.url);
1415
- const hostRoot = path.resolve(path.dirname(thisFile), '..');
1416
-
1417
- // Strategy 1 (Windows): prefer the .cmd wrapper which is executable via shell
1418
- if (isWindows) {
1419
- const cmdPath = path.join(hostRoot, 'node_modules', '.bin', 'esbuild.cmd');
1420
- if (fs.existsSync(cmdPath)) {
1421
- return cmdPath;
1422
- }
1423
- }
1424
-
1425
- // Strategy 2: resolve esbuild binary via import.meta.resolve
1426
- // (On Unix, shebang scripts are directly executable; on Windows they are not,
1427
- // so this strategy is skipped on Windows in favour of the .cmd wrapper above.)
1428
- if (!isWindows) {
1429
- try {
1430
- const pkgUrl = import.meta.resolve('esbuild/package.json');
1431
- if (pkgUrl.startsWith('file://')) {
1432
- const pkgPath = fileURLToPath(pkgUrl);
1433
- const pkgRaw = fs.readFileSync(pkgPath, 'utf8');
1434
- const pkg = JSON.parse(pkgRaw);
1435
- if (pkg.bin && typeof pkg.bin === 'object' && pkg.bin.esbuild) {
1436
- const binPath = path.resolve(path.dirname(pkgPath), pkg.bin.esbuild);
1437
- if (fs.existsSync(binPath)) return binPath;
1438
- } else if (typeof pkg.bin === 'string') {
1439
- const binPath = path.resolve(path.dirname(pkgPath), pkg.bin);
1440
- if (fs.existsSync(binPath)) return binPath;
1441
- }
1442
- }
1443
- } catch {
1444
- // ignore package resolution failures
1445
- }
1446
- }
1447
-
1448
- // Strategy 3: fallback to node_modules/.bin/esbuild (Unix)
1449
- const binFallback = path.join(hostRoot, 'node_modules', '.bin', 'esbuild');
1450
- if (fs.existsSync(binFallback)) {
1451
- return binFallback;
1452
- }
1453
-
1454
- // Strategy 4: global esbuild in PATH
1455
- try {
1456
- const lookupCmd = isWindows ? 'where esbuild' : 'which esbuild';
1457
- // `where` on Windows may return multiple lines; take only the first match.
1458
- const globalBin = execSync(lookupCmd, { encoding: 'utf-8', stdio: 'pipe' }).trim().split('\n')[0].trim();
1459
- if (globalBin && fs.existsSync(globalBin)) {
1460
- return globalBin;
1461
- }
1462
- } catch {
1463
- // ignore PATH lookup failures
1464
- }
1465
-
1466
- return null;
1467
- }
1468
-
1469
- /**
1470
- * Transpile TS plugin files to JS so they work in production mode.
1471
- * Uses esbuild from the host opencli's node_modules for fast single-file transpilation.
1472
- */
1473
- function transpilePluginTs(pluginDir: string): void {
1474
- try {
1475
- const esbuildBin = resolveEsbuildBin();
1476
-
1477
- if (!esbuildBin) {
1478
- log.warn(
1479
- 'esbuild not found. TS plugin files will not be transpiled and may fail to load. ' +
1480
- 'Install esbuild (`npm i -g esbuild`) or ensure it is available in the opencli host node_modules.'
1481
- );
1482
- return;
1483
- }
1484
-
1485
- const files = fs.readdirSync(pluginDir);
1486
- const tsFiles = files.filter(f =>
1487
- f.endsWith('.ts') && !f.endsWith('.d.ts') && !f.endsWith('.test.ts')
1488
- );
1489
-
1490
- for (const tsFile of tsFiles) {
1491
- const jsFile = tsFile.replace(/\.ts$/, '.js');
1492
- const jsPath = path.join(pluginDir, jsFile);
1493
-
1494
- // Skip if .js already exists (plugin may ship pre-compiled)
1495
- if (fs.existsSync(jsPath)) continue;
1496
-
1497
- try {
1498
- execFileSync(esbuildBin, [tsFile, `--outfile=${jsFile}`, '--format=esm', '--platform=node'], {
1499
- cwd: pluginDir,
1500
- encoding: 'utf-8',
1501
- stdio: ['pipe', 'pipe', 'pipe'],
1502
- ...(isWindows && { shell: true }),
1503
- });
1504
- log.debug(`Transpiled plugin file: ${tsFile} → ${jsFile}`);
1505
- } catch (err) {
1506
- log.warn(`Failed to transpile ${tsFile}: ${getErrorMessage(err)}`);
1507
- }
1508
- }
1509
- } catch (err) {
1510
- log.warn(`TS transpilation setup failed: ${getErrorMessage(err)}`);
1511
- }
1512
- }
1513
-
1514
- export {
1515
- resolveEsbuildBin as _resolveEsbuildBin,
1516
- getCommitHash as _getCommitHash,
1517
- installDependencies as _installDependencies,
1518
- parseSource as _parseSource,
1519
- postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle,
1520
- readLockFile as _readLockFile,
1521
- readLockFileWithWriter as _readLockFileWithWriter,
1522
- updateAllPlugins as _updateAllPlugins,
1523
- validatePluginStructure as _validatePluginStructure,
1524
- writeLockFile as _writeLockFile,
1525
- writeLockFileWithFs as _writeLockFileWithFs,
1526
- isSymlinkSync as _isSymlinkSync,
1527
- getMonoreposDir as _getMonoreposDir,
1528
- installLocalPlugin as _installLocalPlugin,
1529
- isLocalPluginSource as _isLocalPluginSource,
1530
- moveDir as _moveDir,
1531
- promoteDir as _promoteDir,
1532
- replaceDir as _replaceDir,
1533
- resolvePluginSource as _resolvePluginSource,
1534
- resolveStoredPluginSource as _resolveStoredPluginSource,
1535
- toStoredPluginSource as _toStoredPluginSource,
1536
- toLocalPluginSource as _toLocalPluginSource,
1537
- };