@jackwener/opencli 1.6.2 → 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 (1894) hide show
  1. package/README.md +7 -7
  2. package/README.zh-CN.md +9 -9
  3. package/dist/browser/cdp.d.ts +1 -40
  4. package/dist/browser/cdp.js +2 -310
  5. package/dist/browser/page.d.ts +1 -62
  6. package/dist/browser/page.js +2 -304
  7. package/dist/browser/utils.d.ts +1 -10
  8. package/dist/browser/utils.js +2 -27
  9. package/dist/cli-manifest.json +546 -2
  10. package/dist/clis/1688/item.js +3 -3
  11. package/dist/clis/1688/search.js +2 -2
  12. package/dist/clis/1688/shared.d.ts +1 -1
  13. package/dist/clis/1688/shared.js +1 -1
  14. package/dist/clis/1688/store.js +2 -2
  15. package/dist/clis/36kr/article.js +2 -2
  16. package/dist/clis/36kr/hot.js +12 -6
  17. package/dist/clis/36kr/news.js +1 -1
  18. package/dist/clis/36kr/search.js +12 -6
  19. package/dist/clis/_shared/desktop-commands.d.ts +5 -5
  20. package/dist/clis/_shared/desktop-commands.js +1 -1
  21. package/dist/clis/amazon/bestsellers.js +1 -1
  22. package/dist/clis/amazon/discussion.js +2 -2
  23. package/dist/clis/amazon/movers-shakers.js +1 -1
  24. package/dist/clis/amazon/new-releases.js +1 -1
  25. package/dist/clis/amazon/offer.js +2 -2
  26. package/dist/clis/amazon/product.js +2 -2
  27. package/dist/clis/amazon/rankings.d.ts +1 -1
  28. package/dist/clis/amazon/rankings.js +2 -2
  29. package/dist/clis/amazon/search.js +2 -2
  30. package/dist/clis/amazon/shared.d.ts +1 -1
  31. package/dist/clis/amazon/shared.js +1 -1
  32. package/dist/clis/antigravity/dump.d.ts +1 -1
  33. package/dist/clis/antigravity/dump.js +1 -1
  34. package/dist/clis/antigravity/extract-code.d.ts +1 -1
  35. package/dist/clis/antigravity/extract-code.js +1 -1
  36. package/dist/clis/antigravity/model.d.ts +1 -1
  37. package/dist/clis/antigravity/model.js +1 -1
  38. package/dist/clis/antigravity/new.d.ts +1 -1
  39. package/dist/clis/antigravity/new.js +1 -1
  40. package/dist/clis/antigravity/read.d.ts +1 -1
  41. package/dist/clis/antigravity/read.js +1 -1
  42. package/dist/clis/antigravity/send.d.ts +1 -1
  43. package/dist/clis/antigravity/send.js +1 -1
  44. package/dist/clis/antigravity/serve.js +2 -2
  45. package/dist/clis/antigravity/status.d.ts +1 -1
  46. package/dist/clis/antigravity/status.js +1 -1
  47. package/dist/clis/antigravity/watch.d.ts +1 -1
  48. package/dist/clis/antigravity/watch.js +1 -1
  49. package/dist/clis/apple-podcasts/commands.test.js +1 -1
  50. package/dist/clis/apple-podcasts/episodes.js +2 -2
  51. package/dist/clis/apple-podcasts/search.js +2 -2
  52. package/dist/clis/apple-podcasts/top.js +2 -2
  53. package/dist/clis/apple-podcasts/utils.js +1 -1
  54. package/dist/clis/arxiv/paper.js +2 -2
  55. package/dist/clis/arxiv/search.js +2 -2
  56. package/dist/clis/arxiv/utils.js +1 -1
  57. package/dist/clis/band/bands.js +2 -2
  58. package/dist/clis/band/mentions.js +2 -2
  59. package/dist/clis/band/post.js +2 -2
  60. package/dist/clis/band/posts.js +2 -2
  61. package/dist/clis/barchart/flow.js +1 -1
  62. package/dist/clis/barchart/greeks.js +1 -1
  63. package/dist/clis/barchart/options.js +1 -1
  64. package/dist/clis/barchart/quote.js +1 -1
  65. package/dist/clis/bbc/news.js +1 -1
  66. package/dist/clis/bilibili/comments.js +1 -1
  67. package/dist/clis/bilibili/comments.test.js +1 -1
  68. package/dist/clis/bilibili/download.js +1 -1
  69. package/dist/clis/bilibili/dynamic.js +1 -1
  70. package/dist/clis/bilibili/dynamic.test.js +1 -1
  71. package/dist/clis/bilibili/favorite.js +1 -1
  72. package/dist/clis/bilibili/feed.js +1 -1
  73. package/dist/clis/bilibili/following.js +2 -2
  74. package/dist/clis/bilibili/history.js +1 -1
  75. package/dist/clis/bilibili/me.js +1 -1
  76. package/dist/clis/bilibili/ranking.js +1 -1
  77. package/dist/clis/bilibili/search.js +1 -1
  78. package/dist/clis/bilibili/subtitle.js +2 -2
  79. package/dist/clis/bilibili/subtitle.test.js +2 -2
  80. package/dist/clis/bilibili/user-videos.js +1 -1
  81. package/dist/clis/bilibili/utils.d.ts +1 -1
  82. package/dist/clis/bilibili/utils.js +1 -1
  83. package/dist/clis/bloomberg/businessweek.js +1 -1
  84. package/dist/clis/bloomberg/economics.js +1 -1
  85. package/dist/clis/bloomberg/feeds.js +1 -1
  86. package/dist/clis/bloomberg/industries.js +1 -1
  87. package/dist/clis/bloomberg/main.js +1 -1
  88. package/dist/clis/bloomberg/markets.js +1 -1
  89. package/dist/clis/bloomberg/news.js +2 -2
  90. package/dist/clis/bloomberg/opinions.js +1 -1
  91. package/dist/clis/bloomberg/politics.js +1 -1
  92. package/dist/clis/bloomberg/tech.js +1 -1
  93. package/dist/clis/bloomberg/utils.js +1 -1
  94. package/dist/clis/boss/batchgreet.js +1 -1
  95. package/dist/clis/boss/chatlist.js +1 -1
  96. package/dist/clis/boss/chatmsg.js +1 -1
  97. package/dist/clis/boss/detail.js +1 -1
  98. package/dist/clis/boss/exchange.js +1 -1
  99. package/dist/clis/boss/greet.js +1 -1
  100. package/dist/clis/boss/invite.js +1 -1
  101. package/dist/clis/boss/joblist.js +1 -1
  102. package/dist/clis/boss/mark.js +2 -2
  103. package/dist/clis/boss/recommend.js +1 -1
  104. package/dist/clis/boss/resume.js +1 -1
  105. package/dist/clis/boss/search.js +1 -1
  106. package/dist/clis/boss/send.js +2 -2
  107. package/dist/clis/boss/stats.js +1 -1
  108. package/dist/clis/boss/utils.d.ts +1 -1
  109. package/dist/clis/chaoxing/assignments.js +2 -2
  110. package/dist/clis/chaoxing/exams.js +1 -1
  111. package/dist/clis/chaoxing/utils.d.ts +1 -1
  112. package/dist/clis/chatgpt/ask.d.ts +1 -1
  113. package/dist/clis/chatgpt/ask.js +2 -2
  114. package/dist/clis/chatgpt/model.d.ts +1 -1
  115. package/dist/clis/chatgpt/model.js +2 -2
  116. package/dist/clis/chatgpt/new.d.ts +1 -1
  117. package/dist/clis/chatgpt/new.js +2 -2
  118. package/dist/clis/chatgpt/read.d.ts +1 -1
  119. package/dist/clis/chatgpt/read.js +2 -2
  120. package/dist/clis/chatgpt/send.d.ts +1 -1
  121. package/dist/clis/chatgpt/send.js +2 -2
  122. package/dist/clis/chatgpt/status.d.ts +1 -1
  123. package/dist/clis/chatgpt/status.js +2 -2
  124. package/dist/clis/chatwise/ask.d.ts +1 -1
  125. package/dist/clis/chatwise/ask.js +2 -2
  126. package/dist/clis/chatwise/export.d.ts +1 -1
  127. package/dist/clis/chatwise/export.js +1 -1
  128. package/dist/clis/chatwise/history.d.ts +1 -1
  129. package/dist/clis/chatwise/history.js +1 -1
  130. package/dist/clis/chatwise/model.d.ts +1 -1
  131. package/dist/clis/chatwise/model.js +2 -2
  132. package/dist/clis/chatwise/new.d.ts +1 -1
  133. package/dist/clis/chatwise/read.d.ts +1 -1
  134. package/dist/clis/chatwise/read.js +1 -1
  135. package/dist/clis/chatwise/screenshot.d.ts +1 -1
  136. package/dist/clis/chatwise/send.d.ts +1 -1
  137. package/dist/clis/chatwise/send.js +2 -2
  138. package/dist/clis/chatwise/status.d.ts +1 -1
  139. package/dist/clis/codex/ask.d.ts +1 -1
  140. package/dist/clis/codex/ask.js +2 -2
  141. package/dist/clis/codex/dump.d.ts +1 -1
  142. package/dist/clis/codex/export.d.ts +1 -1
  143. package/dist/clis/codex/export.js +1 -1
  144. package/dist/clis/codex/extract-diff.d.ts +1 -1
  145. package/dist/clis/codex/extract-diff.js +1 -1
  146. package/dist/clis/codex/history.d.ts +1 -1
  147. package/dist/clis/codex/history.js +1 -1
  148. package/dist/clis/codex/model.d.ts +1 -1
  149. package/dist/clis/codex/model.js +1 -1
  150. package/dist/clis/codex/new.d.ts +1 -1
  151. package/dist/clis/codex/read.d.ts +1 -1
  152. package/dist/clis/codex/read.js +1 -1
  153. package/dist/clis/codex/screenshot.d.ts +1 -1
  154. package/dist/clis/codex/send.d.ts +1 -1
  155. package/dist/clis/codex/send.js +2 -2
  156. package/dist/clis/codex/status.d.ts +1 -1
  157. package/dist/clis/coupang/add-to-cart.js +1 -1
  158. package/dist/clis/coupang/search.js +1 -1
  159. package/dist/clis/ctrip/search.js +2 -2
  160. package/dist/clis/ctrip/search.test.js +1 -1
  161. package/dist/clis/cursor/ask.d.ts +1 -1
  162. package/dist/clis/cursor/ask.js +2 -2
  163. package/dist/clis/cursor/composer.d.ts +1 -1
  164. package/dist/clis/cursor/composer.js +2 -2
  165. package/dist/clis/cursor/dump.d.ts +1 -1
  166. package/dist/clis/cursor/export.d.ts +1 -1
  167. package/dist/clis/cursor/export.js +1 -1
  168. package/dist/clis/cursor/extract-code.d.ts +1 -1
  169. package/dist/clis/cursor/extract-code.js +1 -1
  170. package/dist/clis/cursor/history.d.ts +1 -1
  171. package/dist/clis/cursor/history.js +1 -1
  172. package/dist/clis/cursor/model.d.ts +1 -1
  173. package/dist/clis/cursor/model.js +1 -1
  174. package/dist/clis/cursor/new.d.ts +1 -1
  175. package/dist/clis/cursor/read.d.ts +1 -1
  176. package/dist/clis/cursor/read.js +2 -2
  177. package/dist/clis/cursor/screenshot.d.ts +1 -1
  178. package/dist/clis/cursor/send.d.ts +1 -1
  179. package/dist/clis/cursor/send.js +2 -2
  180. package/dist/clis/cursor/status.d.ts +1 -1
  181. package/dist/clis/discord-app/channels.d.ts +1 -1
  182. package/dist/clis/discord-app/channels.js +1 -1
  183. package/dist/clis/discord-app/members.d.ts +1 -1
  184. package/dist/clis/discord-app/members.js +1 -1
  185. package/dist/clis/discord-app/read.d.ts +1 -1
  186. package/dist/clis/discord-app/read.js +1 -1
  187. package/dist/clis/discord-app/search.d.ts +1 -1
  188. package/dist/clis/discord-app/search.js +1 -1
  189. package/dist/clis/discord-app/send.d.ts +1 -1
  190. package/dist/clis/discord-app/send.js +1 -1
  191. package/dist/clis/discord-app/servers.d.ts +1 -1
  192. package/dist/clis/discord-app/servers.js +1 -1
  193. package/dist/clis/discord-app/status.d.ts +1 -1
  194. package/dist/clis/discord-app/status.js +1 -1
  195. package/dist/clis/douban/book-hot.js +1 -1
  196. package/dist/clis/douban/download.js +2 -2
  197. package/dist/clis/douban/download.test.js +1 -1
  198. package/dist/clis/douban/marks.js +1 -1
  199. package/dist/clis/douban/movie-hot.js +1 -1
  200. package/dist/clis/douban/photos.js +1 -1
  201. package/dist/clis/douban/reviews.js +1 -1
  202. package/dist/clis/douban/search.js +1 -1
  203. package/dist/clis/douban/utils.d.ts +1 -1
  204. package/dist/clis/douban/utils.js +1 -1
  205. package/dist/clis/doubao/ask.d.ts +1 -1
  206. package/dist/clis/doubao/ask.js +1 -1
  207. package/dist/clis/doubao/detail.d.ts +1 -1
  208. package/dist/clis/doubao/detail.js +1 -1
  209. package/dist/clis/doubao/detail.test.js +1 -1
  210. package/dist/clis/doubao/history.d.ts +1 -1
  211. package/dist/clis/doubao/history.js +1 -1
  212. package/dist/clis/doubao/history.test.js +1 -1
  213. package/dist/clis/doubao/meeting-summary.d.ts +1 -1
  214. package/dist/clis/doubao/meeting-summary.js +1 -1
  215. package/dist/clis/doubao/meeting-transcript.d.ts +1 -1
  216. package/dist/clis/doubao/meeting-transcript.js +1 -1
  217. package/dist/clis/doubao/new.d.ts +1 -1
  218. package/dist/clis/doubao/new.js +1 -1
  219. package/dist/clis/doubao/read.d.ts +1 -1
  220. package/dist/clis/doubao/read.js +1 -1
  221. package/dist/clis/doubao/send.d.ts +1 -1
  222. package/dist/clis/doubao/send.js +1 -1
  223. package/dist/clis/doubao/status.d.ts +1 -1
  224. package/dist/clis/doubao/status.js +1 -1
  225. package/dist/clis/doubao/utils.d.ts +1 -1
  226. package/dist/clis/doubao-app/ask.d.ts +1 -1
  227. package/dist/clis/doubao-app/ask.js +1 -1
  228. package/dist/clis/doubao-app/dump.d.ts +1 -1
  229. package/dist/clis/doubao-app/dump.js +1 -1
  230. package/dist/clis/doubao-app/new.d.ts +1 -1
  231. package/dist/clis/doubao-app/new.js +1 -1
  232. package/dist/clis/doubao-app/read.d.ts +1 -1
  233. package/dist/clis/doubao-app/read.js +1 -1
  234. package/dist/clis/doubao-app/screenshot.d.ts +1 -1
  235. package/dist/clis/doubao-app/screenshot.js +1 -1
  236. package/dist/clis/doubao-app/send.d.ts +1 -1
  237. package/dist/clis/doubao-app/send.js +1 -1
  238. package/dist/clis/doubao-app/status.d.ts +1 -1
  239. package/dist/clis/doubao-app/status.js +1 -1
  240. package/dist/clis/douyin/_shared/browser-fetch.d.ts +1 -1
  241. package/dist/clis/douyin/_shared/browser-fetch.js +1 -1
  242. package/dist/clis/douyin/_shared/imagex-upload.js +1 -1
  243. package/dist/clis/douyin/_shared/imagex-upload.test.js +1 -1
  244. package/dist/clis/douyin/_shared/public-api.d.ts +1 -1
  245. package/dist/clis/douyin/_shared/sts2.d.ts +1 -1
  246. package/dist/clis/douyin/_shared/sts2.js +1 -1
  247. package/dist/clis/douyin/_shared/sts2.test.js +1 -1
  248. package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +1 -1
  249. package/dist/clis/douyin/_shared/tos-upload.js +1 -1
  250. package/dist/clis/douyin/_shared/transcode.d.ts +1 -1
  251. package/dist/clis/douyin/_shared/transcode.js +1 -1
  252. package/dist/clis/douyin/_shared/transcode.test.js +1 -1
  253. package/dist/clis/douyin/activities.js +1 -1
  254. package/dist/clis/douyin/activities.test.js +1 -1
  255. package/dist/clis/douyin/collections.js +1 -1
  256. package/dist/clis/douyin/collections.test.js +1 -1
  257. package/dist/clis/douyin/delete.js +1 -1
  258. package/dist/clis/douyin/delete.test.js +1 -1
  259. package/dist/clis/douyin/draft.js +2 -2
  260. package/dist/clis/douyin/draft.test.js +1 -1
  261. package/dist/clis/douyin/drafts.js +1 -1
  262. package/dist/clis/douyin/drafts.test.js +1 -1
  263. package/dist/clis/douyin/hashtag.js +2 -2
  264. package/dist/clis/douyin/hashtag.test.js +1 -1
  265. package/dist/clis/douyin/location.js +1 -1
  266. package/dist/clis/douyin/location.test.js +1 -1
  267. package/dist/clis/douyin/profile.js +2 -2
  268. package/dist/clis/douyin/profile.test.js +1 -1
  269. package/dist/clis/douyin/publish.js +2 -2
  270. package/dist/clis/douyin/publish.test.js +1 -1
  271. package/dist/clis/douyin/stats.js +1 -1
  272. package/dist/clis/douyin/stats.test.js +1 -1
  273. package/dist/clis/douyin/update.js +2 -2
  274. package/dist/clis/douyin/update.test.js +1 -1
  275. package/dist/clis/douyin/user-videos.js +1 -1
  276. package/dist/clis/douyin/user-videos.test.js +1 -1
  277. package/dist/clis/douyin/videos.js +1 -1
  278. package/dist/clis/douyin/videos.test.js +1 -1
  279. package/dist/clis/gemini/ask.d.ts +1 -1
  280. package/dist/clis/gemini/ask.js +1 -1
  281. package/dist/clis/gemini/deep-research-result.d.ts +1 -0
  282. package/dist/clis/gemini/deep-research-result.js +91 -0
  283. package/dist/clis/gemini/deep-research-result.test.js +154 -0
  284. package/dist/clis/gemini/deep-research.d.ts +1 -0
  285. package/dist/clis/gemini/deep-research.js +98 -0
  286. package/dist/clis/gemini/deep-research.test.js +184 -0
  287. package/dist/clis/gemini/image.d.ts +1 -1
  288. package/dist/clis/gemini/image.js +2 -2
  289. package/dist/clis/gemini/new.d.ts +1 -1
  290. package/dist/clis/gemini/new.js +1 -1
  291. package/dist/clis/gemini/reply-state.test.js +30 -0
  292. package/dist/clis/gemini/utils.d.ts +30 -1
  293. package/dist/clis/gemini/utils.js +1014 -2
  294. package/dist/clis/gemini/utils.test.js +21 -1
  295. package/dist/clis/google/news.js +2 -2
  296. package/dist/clis/google/search.js +2 -2
  297. package/dist/clis/google/suggest.js +2 -2
  298. package/dist/clis/google/trends.js +2 -2
  299. package/dist/clis/grok/ask.d.ts +2 -2
  300. package/dist/clis/grok/ask.js +1 -1
  301. package/dist/clis/hf/top.js +2 -2
  302. package/dist/clis/hupu/detail.js +1 -1
  303. package/dist/clis/hupu/like.js +2 -2
  304. package/dist/clis/hupu/mentions.js +159 -0
  305. package/dist/clis/hupu/reply.js +2 -2
  306. package/dist/clis/hupu/search.js +1 -1
  307. package/dist/clis/hupu/unlike.js +2 -2
  308. package/dist/clis/hupu/utils.d.ts +1 -1
  309. package/dist/clis/hupu/utils.js +1 -1
  310. package/dist/clis/imdb/person.js +2 -2
  311. package/dist/clis/imdb/reviews.js +2 -2
  312. package/dist/clis/imdb/search.js +2 -2
  313. package/dist/clis/imdb/title.js +2 -2
  314. package/dist/clis/imdb/top.js +2 -2
  315. package/dist/clis/imdb/trending.js +2 -2
  316. package/dist/clis/imdb/utils.d.ts +1 -1
  317. package/dist/clis/imdb/utils.js +1 -1
  318. package/dist/clis/instagram/_shared/private-publish.d.ts +1 -1
  319. package/dist/clis/instagram/_shared/private-publish.js +1 -1
  320. package/dist/clis/instagram/_shared/protocol-capture.d.ts +1 -1
  321. package/dist/clis/instagram/_shared/runtime-info.d.ts +1 -1
  322. package/dist/clis/instagram/download.js +2 -2
  323. package/dist/clis/instagram/download.test.js +2 -2
  324. package/dist/clis/instagram/note.js +2 -2
  325. package/dist/clis/instagram/note.test.js +2 -2
  326. package/dist/clis/instagram/post.js +2 -2
  327. package/dist/clis/instagram/post.test.js +2 -2
  328. package/dist/clis/instagram/reel.js +2 -2
  329. package/dist/clis/instagram/reel.test.js +2 -2
  330. package/dist/clis/instagram/story.js +2 -2
  331. package/dist/clis/instagram/story.test.js +2 -2
  332. package/dist/clis/jd/item.js +1 -1
  333. package/dist/clis/jd/item.test.js +1 -1
  334. package/dist/clis/jike/comment.js +1 -1
  335. package/dist/clis/jike/create.js +1 -1
  336. package/dist/clis/jike/feed.js +1 -1
  337. package/dist/clis/jike/like.js +1 -1
  338. package/dist/clis/jike/notifications.js +1 -1
  339. package/dist/clis/jike/repost.js +1 -1
  340. package/dist/clis/jike/search.js +1 -1
  341. package/dist/clis/lesswrong/_helpers.d.ts +15 -0
  342. package/dist/clis/lesswrong/_helpers.js +75 -0
  343. package/dist/clis/lesswrong/comments.js +64 -0
  344. package/dist/clis/lesswrong/curated.js +30 -0
  345. package/dist/clis/lesswrong/frontpage.js +30 -0
  346. package/dist/clis/lesswrong/new.js +30 -0
  347. package/dist/clis/lesswrong/read.js +45 -0
  348. package/dist/clis/lesswrong/sequences.js +27 -0
  349. package/dist/clis/lesswrong/shortform.js +30 -0
  350. package/dist/clis/lesswrong/tag.js +45 -0
  351. package/dist/clis/lesswrong/tags.js +27 -0
  352. package/dist/clis/lesswrong/top-month.js +30 -0
  353. package/dist/clis/lesswrong/top-week.js +30 -0
  354. package/dist/clis/lesswrong/top-year.js +30 -0
  355. package/dist/clis/lesswrong/top.js +30 -0
  356. package/dist/clis/lesswrong/user-posts.js +41 -0
  357. package/dist/clis/lesswrong/user.js +44 -0
  358. package/dist/clis/linkedin/search.js +2 -2
  359. package/dist/clis/linkedin/timeline.js +2 -2
  360. package/dist/clis/linkedin/timeline.test.js +1 -1
  361. package/dist/clis/linux-do/category.js +1 -1
  362. package/dist/clis/linux-do/feed.d.ts +2 -2
  363. package/dist/clis/linux-do/feed.js +2 -2
  364. package/dist/clis/linux-do/hot.js +1 -1
  365. package/dist/clis/linux-do/latest.js +1 -1
  366. package/dist/clis/medium/feed.js +1 -1
  367. package/dist/clis/medium/search.js +1 -1
  368. package/dist/clis/medium/user.js +1 -1
  369. package/dist/clis/medium/utils.d.ts +1 -1
  370. package/dist/clis/medium/utils.js +1 -1
  371. package/dist/clis/notebooklm/compat.test.js +1 -1
  372. package/dist/clis/notebooklm/current.js +2 -2
  373. package/dist/clis/notebooklm/get.js +2 -2
  374. package/dist/clis/notebooklm/history.js +2 -2
  375. package/dist/clis/notebooklm/history.test.js +1 -1
  376. package/dist/clis/notebooklm/list.js +2 -2
  377. package/dist/clis/notebooklm/note-list.js +2 -2
  378. package/dist/clis/notebooklm/note-list.test.js +1 -1
  379. package/dist/clis/notebooklm/notes-get.js +2 -2
  380. package/dist/clis/notebooklm/notes-get.test.js +1 -1
  381. package/dist/clis/notebooklm/open.js +2 -2
  382. package/dist/clis/notebooklm/open.test.js +1 -1
  383. package/dist/clis/notebooklm/rpc.d.ts +1 -1
  384. package/dist/clis/notebooklm/rpc.js +1 -1
  385. package/dist/clis/notebooklm/rpc.test.js +1 -1
  386. package/dist/clis/notebooklm/source-fulltext.js +2 -2
  387. package/dist/clis/notebooklm/source-fulltext.test.js +1 -1
  388. package/dist/clis/notebooklm/source-get.js +2 -2
  389. package/dist/clis/notebooklm/source-get.test.js +1 -1
  390. package/dist/clis/notebooklm/source-guide.js +2 -2
  391. package/dist/clis/notebooklm/source-guide.test.js +1 -1
  392. package/dist/clis/notebooklm/source-list.js +2 -2
  393. package/dist/clis/notebooklm/status.js +1 -1
  394. package/dist/clis/notebooklm/summary.js +2 -2
  395. package/dist/clis/notebooklm/summary.test.js +1 -1
  396. package/dist/clis/notebooklm/utils.d.ts +1 -1
  397. package/dist/clis/notebooklm/utils.js +1 -1
  398. package/dist/clis/notion/export.d.ts +1 -1
  399. package/dist/clis/notion/export.js +1 -1
  400. package/dist/clis/notion/favorites.d.ts +1 -1
  401. package/dist/clis/notion/favorites.js +1 -1
  402. package/dist/clis/notion/new.d.ts +1 -1
  403. package/dist/clis/notion/new.js +1 -1
  404. package/dist/clis/notion/read.d.ts +1 -1
  405. package/dist/clis/notion/read.js +1 -1
  406. package/dist/clis/notion/search.d.ts +1 -1
  407. package/dist/clis/notion/search.js +1 -1
  408. package/dist/clis/notion/sidebar.d.ts +1 -1
  409. package/dist/clis/notion/sidebar.js +1 -1
  410. package/dist/clis/notion/status.d.ts +1 -1
  411. package/dist/clis/notion/status.js +1 -1
  412. package/dist/clis/notion/write.d.ts +1 -1
  413. package/dist/clis/notion/write.js +1 -1
  414. package/dist/clis/ones/common.d.ts +1 -1
  415. package/dist/clis/ones/common.js +1 -1
  416. package/dist/clis/ones/enrich-tasks.d.ts +1 -1
  417. package/dist/clis/ones/login.js +2 -2
  418. package/dist/clis/ones/logout.js +1 -1
  419. package/dist/clis/ones/me.js +2 -2
  420. package/dist/clis/ones/my-tasks.js +2 -2
  421. package/dist/clis/ones/resolve-labels.d.ts +1 -1
  422. package/dist/clis/ones/task-helpers.js +1 -1
  423. package/dist/clis/ones/task.js +2 -2
  424. package/dist/clis/ones/tasks.js +2 -2
  425. package/dist/clis/ones/token-info.js +2 -2
  426. package/dist/clis/ones/worklog.js +2 -2
  427. package/dist/clis/paperreview/commands.test.js +1 -1
  428. package/dist/clis/paperreview/feedback.js +2 -2
  429. package/dist/clis/paperreview/review.js +2 -2
  430. package/dist/clis/paperreview/submit.js +2 -2
  431. package/dist/clis/paperreview/utils.js +1 -1
  432. package/dist/clis/paperreview/utils.test.js +1 -1
  433. package/dist/clis/pixiv/download.js +2 -2
  434. package/dist/clis/pixiv/download.test.js +2 -2
  435. package/dist/clis/pixiv/illusts.js +2 -2
  436. package/dist/clis/pixiv/illusts.test.js +2 -2
  437. package/dist/clis/pixiv/search.js +1 -1
  438. package/dist/clis/pixiv/search.test.js +2 -2
  439. package/dist/clis/pixiv/test-utils.d.ts +1 -1
  440. package/dist/clis/pixiv/utils.d.ts +1 -1
  441. package/dist/clis/pixiv/utils.js +1 -1
  442. package/dist/clis/producthunt/browse.js +2 -2
  443. package/dist/clis/producthunt/hot.js +2 -2
  444. package/dist/clis/producthunt/posts.js +1 -1
  445. package/dist/clis/producthunt/today.js +1 -1
  446. package/dist/clis/reddit/comment.js +2 -2
  447. package/dist/clis/reddit/read.js +2 -2
  448. package/dist/clis/reddit/read.test.js +1 -1
  449. package/dist/clis/reddit/save.js +2 -2
  450. package/dist/clis/reddit/saved.js +2 -2
  451. package/dist/clis/reddit/subscribe.js +2 -2
  452. package/dist/clis/reddit/upvote.js +2 -2
  453. package/dist/clis/reddit/upvoted.js +2 -2
  454. package/dist/clis/reuters/search.js +1 -1
  455. package/dist/clis/sinablog/article.js +1 -1
  456. package/dist/clis/sinablog/hot.js +1 -1
  457. package/dist/clis/sinablog/search.js +1 -1
  458. package/dist/clis/sinablog/user.js +1 -1
  459. package/dist/clis/sinablog/utils.d.ts +1 -1
  460. package/dist/clis/sinafinance/news.js +2 -2
  461. package/dist/clis/sinafinance/rolling-news.js +1 -1
  462. package/dist/clis/sinafinance/stock-rank.js +1 -1
  463. package/dist/clis/sinafinance/stock.js +2 -2
  464. package/dist/clis/smzdm/search.js +1 -1
  465. package/dist/clis/spotify/spotify.js +2 -2
  466. package/dist/clis/spotify/utils.js +1 -1
  467. package/dist/clis/substack/feed.js +1 -1
  468. package/dist/clis/substack/publication.js +1 -1
  469. package/dist/clis/substack/search.js +2 -2
  470. package/dist/clis/substack/utils.d.ts +1 -1
  471. package/dist/clis/substack/utils.js +1 -1
  472. package/dist/clis/tieba/commands.test.js +1 -1
  473. package/dist/clis/tieba/hot.js +2 -2
  474. package/dist/clis/tieba/posts.js +2 -2
  475. package/dist/clis/tieba/read.js +2 -2
  476. package/dist/clis/tieba/search.js +2 -2
  477. package/dist/clis/twitter/accept.js +2 -2
  478. package/dist/clis/twitter/article.js +2 -2
  479. package/dist/clis/twitter/block.js +2 -2
  480. package/dist/clis/twitter/bookmark.js +2 -2
  481. package/dist/clis/twitter/bookmarks.js +2 -2
  482. package/dist/clis/twitter/delete.d.ts +6 -0
  483. package/dist/clis/twitter/delete.js +82 -47
  484. package/dist/clis/twitter/delete.test.d.ts +1 -0
  485. package/dist/clis/twitter/delete.test.js +73 -0
  486. package/dist/clis/twitter/download.js +1 -1
  487. package/dist/clis/twitter/follow.js +2 -2
  488. package/dist/clis/twitter/followers.js +2 -2
  489. package/dist/clis/twitter/following.js +2 -2
  490. package/dist/clis/twitter/hide-reply.js +2 -2
  491. package/dist/clis/twitter/like.js +2 -2
  492. package/dist/clis/twitter/likes.js +2 -2
  493. package/dist/clis/twitter/notifications.js +2 -2
  494. package/dist/clis/twitter/post.js +2 -2
  495. package/dist/clis/twitter/post.test.js +1 -1
  496. package/dist/clis/twitter/profile.js +2 -2
  497. package/dist/clis/twitter/reply-dm.js +2 -2
  498. package/dist/clis/twitter/reply.js +2 -2
  499. package/dist/clis/twitter/reply.test.js +1 -1
  500. package/dist/clis/twitter/search.js +2 -2
  501. package/dist/clis/twitter/search.test.js +1 -1
  502. package/dist/clis/twitter/shared.d.ts +1 -1
  503. package/dist/clis/twitter/thread.js +2 -2
  504. package/dist/clis/twitter/timeline.js +2 -2
  505. package/dist/clis/twitter/trending.js +2 -2
  506. package/dist/clis/twitter/unblock.js +2 -2
  507. package/dist/clis/twitter/unbookmark.js +2 -2
  508. package/dist/clis/twitter/unfollow.js +2 -2
  509. package/dist/clis/v2ex/daily.js +2 -2
  510. package/dist/clis/v2ex/me.js +2 -2
  511. package/dist/clis/v2ex/notifications.js +2 -2
  512. package/dist/clis/web/read.js +1 -1
  513. package/dist/clis/weibo/comments.js +1 -1
  514. package/dist/clis/weibo/feed.js +1 -1
  515. package/dist/clis/weibo/hot.js +1 -1
  516. package/dist/clis/weibo/me.js +2 -2
  517. package/dist/clis/weibo/post.js +2 -2
  518. package/dist/clis/weibo/search.js +2 -2
  519. package/dist/clis/weibo/user.js +2 -2
  520. package/dist/clis/weibo/utils.d.ts +1 -1
  521. package/dist/clis/weibo/utils.js +1 -1
  522. package/dist/clis/weixin/download.js +1 -1
  523. package/dist/clis/weread/book.js +2 -2
  524. package/dist/clis/weread/commands.test.js +2 -2
  525. package/dist/clis/weread/highlights.js +1 -1
  526. package/dist/clis/weread/notebooks.js +1 -1
  527. package/dist/clis/weread/notes.js +1 -1
  528. package/dist/clis/weread/private-api-regression.test.js +2 -2
  529. package/dist/clis/weread/ranking.js +1 -1
  530. package/dist/clis/weread/search-regression.test.js +1 -1
  531. package/dist/clis/weread/search.js +1 -1
  532. package/dist/clis/weread/shelf.js +3 -3
  533. package/dist/clis/weread/utils.d.ts +1 -1
  534. package/dist/clis/weread/utils.js +1 -1
  535. package/dist/clis/wikipedia/random.js +2 -2
  536. package/dist/clis/wikipedia/search.js +2 -2
  537. package/dist/clis/wikipedia/summary.js +2 -2
  538. package/dist/clis/wikipedia/trending.js +2 -2
  539. package/dist/clis/wikipedia/utils.js +1 -1
  540. package/dist/clis/xianyu/chat.js +2 -2
  541. package/dist/clis/xianyu/item.js +2 -2
  542. package/dist/clis/xianyu/item.test.js +2 -2
  543. package/dist/clis/xianyu/search.js +2 -2
  544. package/dist/clis/xianyu/utils.js +1 -1
  545. package/dist/clis/xiaohongshu/comments.js +2 -2
  546. package/dist/clis/xiaohongshu/comments.test.js +3 -3
  547. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +1 -1
  548. package/dist/clis/xiaohongshu/creator-note-detail.js +1 -1
  549. package/dist/clis/xiaohongshu/creator-note-detail.test.js +1 -1
  550. package/dist/clis/xiaohongshu/creator-notes-summary.js +1 -1
  551. package/dist/clis/xiaohongshu/creator-notes.d.ts +1 -1
  552. package/dist/clis/xiaohongshu/creator-notes.js +1 -1
  553. package/dist/clis/xiaohongshu/creator-notes.test.js +1 -1
  554. package/dist/clis/xiaohongshu/creator-profile.js +1 -1
  555. package/dist/clis/xiaohongshu/creator-stats.js +1 -1
  556. package/dist/clis/xiaohongshu/download.js +1 -1
  557. package/dist/clis/xiaohongshu/download.test.js +1 -1
  558. package/dist/clis/xiaohongshu/note-helpers.d.ts +2 -2
  559. package/dist/clis/xiaohongshu/note-helpers.js +5 -3
  560. package/dist/clis/xiaohongshu/note.d.ts +4 -0
  561. package/dist/clis/xiaohongshu/note.js +10 -12
  562. package/dist/clis/xiaohongshu/note.test.js +6 -6
  563. package/dist/clis/xiaohongshu/publish.js +1 -1
  564. package/dist/clis/xiaohongshu/publish.test.js +1 -1
  565. package/dist/clis/xiaohongshu/search.js +2 -2
  566. package/dist/clis/xiaohongshu/search.test.js +1 -1
  567. package/dist/clis/xiaohongshu/user.js +1 -1
  568. package/dist/clis/xiaoyuzhou/episode.js +2 -2
  569. package/dist/clis/xiaoyuzhou/podcast-episodes.js +2 -2
  570. package/dist/clis/xiaoyuzhou/podcast.js +2 -2
  571. package/dist/clis/xiaoyuzhou/utils.js +1 -1
  572. package/dist/clis/xueqiu/comments.d.ts +1 -1
  573. package/dist/clis/xueqiu/comments.js +4 -4
  574. package/dist/clis/xueqiu/comments.test.js +3 -3
  575. package/dist/clis/xueqiu/danjuan-utils.d.ts +1 -1
  576. package/dist/clis/xueqiu/fund-holdings.js +1 -1
  577. package/dist/clis/xueqiu/fund-snapshot.js +1 -1
  578. package/dist/clis/yahoo-finance/quote.js +1 -1
  579. package/dist/clis/yollomi/background.js +2 -2
  580. package/dist/clis/yollomi/edit.js +2 -2
  581. package/dist/clis/yollomi/face-swap.js +2 -2
  582. package/dist/clis/yollomi/generate.js +2 -2
  583. package/dist/clis/yollomi/models.js +1 -1
  584. package/dist/clis/yollomi/object-remover.js +2 -2
  585. package/dist/clis/yollomi/remove-bg.js +2 -2
  586. package/dist/clis/yollomi/restore.js +2 -2
  587. package/dist/clis/yollomi/try-on.js +2 -2
  588. package/dist/clis/yollomi/upload.js +2 -2
  589. package/dist/clis/yollomi/upscale.js +2 -2
  590. package/dist/clis/yollomi/utils.d.ts +1 -1
  591. package/dist/clis/yollomi/utils.js +1 -1
  592. package/dist/clis/yollomi/video.js +2 -2
  593. package/dist/clis/youtube/channel.js +2 -2
  594. package/dist/clis/youtube/comments.js +2 -2
  595. package/dist/clis/youtube/search.js +1 -1
  596. package/dist/clis/youtube/transcript.js +2 -2
  597. package/dist/clis/youtube/utils.d.ts +1 -1
  598. package/dist/clis/youtube/video.js +2 -2
  599. package/dist/clis/yuanbao/ask.d.ts +1 -1
  600. package/dist/clis/yuanbao/ask.js +2 -2
  601. package/dist/clis/yuanbao/ask.test.js +1 -1
  602. package/dist/clis/yuanbao/new.d.ts +1 -1
  603. package/dist/clis/yuanbao/new.js +1 -1
  604. package/dist/clis/yuanbao/new.test.js +1 -1
  605. package/dist/clis/yuanbao/shared.d.ts +2 -2
  606. package/dist/clis/yuanbao/shared.js +1 -1
  607. package/dist/clis/zhihu/download.js +1 -1
  608. package/dist/clis/zhihu/question.js +2 -2
  609. package/dist/clis/zhihu/question.test.js +2 -2
  610. package/dist/clis/zsxq/dynamics.js +1 -1
  611. package/dist/clis/zsxq/groups.js +1 -1
  612. package/dist/clis/zsxq/search.js +1 -1
  613. package/dist/clis/zsxq/search.test.js +1 -1
  614. package/dist/clis/zsxq/topic.js +2 -2
  615. package/dist/clis/zsxq/topic.test.js +1 -1
  616. package/dist/clis/zsxq/topics.js +1 -1
  617. package/dist/clis/zsxq/topics.test.js +1 -1
  618. package/dist/clis/zsxq/utils.d.ts +1 -1
  619. package/dist/clis/zsxq/utils.js +1 -1
  620. package/dist/download/article-download.d.ts +1 -59
  621. package/dist/download/article-download.js +2 -178
  622. package/dist/download/index.d.ts +1 -71
  623. package/dist/download/index.js +2 -345
  624. package/dist/download/media-download.d.ts +1 -49
  625. package/dist/download/media-download.js +2 -114
  626. package/dist/download/progress.d.ts +1 -36
  627. package/dist/download/progress.js +2 -111
  628. package/dist/pipeline/index.d.ts +1 -5
  629. package/dist/pipeline/index.js +2 -5
  630. package/dist/src/browser/cdp.d.ts +40 -0
  631. package/dist/src/browser/cdp.js +310 -0
  632. package/dist/src/browser/page.d.ts +62 -0
  633. package/dist/src/browser/page.js +304 -0
  634. package/dist/src/browser/utils.d.ts +10 -0
  635. package/dist/src/browser/utils.js +27 -0
  636. package/dist/{build-manifest.js → src/build-manifest.js} +5 -4
  637. package/dist/{cascade.js → src/cascade.js} +16 -31
  638. package/dist/src/cli.d.ts +22 -0
  639. package/dist/{cli.js → src/cli.js} +78 -8
  640. package/dist/{cli.test.js → src/cli.test.js} +84 -1
  641. package/dist/{commanderAdapter.d.ts → src/commanderAdapter.d.ts} +1 -0
  642. package/dist/{commanderAdapter.js → src/commanderAdapter.js} +26 -46
  643. package/dist/{discovery.d.ts → src/discovery.d.ts} +11 -2
  644. package/dist/{discovery.js → src/discovery.js} +96 -12
  645. package/dist/src/doctor.test.d.ts +1 -0
  646. package/dist/src/download/article-download.d.ts +59 -0
  647. package/dist/src/download/article-download.js +178 -0
  648. package/dist/src/download/index.d.ts +71 -0
  649. package/dist/src/download/index.js +345 -0
  650. package/dist/src/download/index.test.d.ts +1 -0
  651. package/dist/src/download/media-download.d.ts +49 -0
  652. package/dist/src/download/media-download.js +114 -0
  653. package/dist/src/download/progress.d.ts +36 -0
  654. package/dist/src/download/progress.js +111 -0
  655. package/dist/src/electron-apps.test.d.ts +1 -0
  656. package/dist/src/engine.test.d.ts +1 -0
  657. package/dist/src/errors.test.d.ts +1 -0
  658. package/dist/src/execution.test.d.ts +1 -0
  659. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  660. package/dist/src/external.test.d.ts +1 -0
  661. package/dist/{interceptor.d.ts → src/interceptor.d.ts} +2 -0
  662. package/dist/{interceptor.js → src/interceptor.js} +3 -6
  663. package/dist/src/launcher.test.d.ts +1 -0
  664. package/dist/{main.js → src/main.js} +3 -2
  665. package/dist/src/node-network.test.d.ts +1 -0
  666. package/dist/src/output.test.d.ts +1 -0
  667. package/{src/pipeline/index.ts → dist/src/pipeline/index.d.ts} +0 -1
  668. package/dist/src/pipeline/index.js +5 -0
  669. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  670. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  671. package/dist/{record.js → src/record.js} +1 -1
  672. package/dist/src/record.test.d.ts +1 -0
  673. package/dist/src/runtime-detect.test.d.ts +1 -0
  674. package/dist/src/serialization.test.d.ts +1 -0
  675. package/dist/{synthesize.d.ts → src/synthesize.d.ts} +0 -4
  676. package/dist/{synthesize.js → src/synthesize.js} +4 -15
  677. package/dist/src/tui.test.d.ts +1 -0
  678. package/dist/src/weixin-download.test.d.ts +1 -0
  679. package/dist/{weixin-download.test.js → src/weixin-download.test.js} +1 -1
  680. package/package.json +26 -9
  681. package/scripts/check-doc-coverage.sh +2 -2
  682. package/scripts/copy-yaml.cjs +4 -4
  683. package/scripts/fetch-adapters.js +157 -0
  684. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -83
  685. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  686. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  687. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +0 -57
  688. package/.github/actions/setup-chrome/action.yml +0 -27
  689. package/.github/dependabot.yml +0 -27
  690. package/.github/pull_request_template.md +0 -33
  691. package/.github/workflows/build-extension.yml +0 -67
  692. package/.github/workflows/ci.yml +0 -147
  693. package/.github/workflows/doc-check.yml +0 -36
  694. package/.github/workflows/docs.yml +0 -17
  695. package/.github/workflows/e2e-headed.yml +0 -74
  696. package/.github/workflows/release.yml +0 -44
  697. package/.github/workflows/security.yml +0 -33
  698. package/CHANGELOG.md +0 -321
  699. package/CONTRIBUTING.md +0 -208
  700. package/PRIVACY.md +0 -57
  701. package/TESTING.md +0 -252
  702. package/autoresearch/baseline-browse.txt +0 -1
  703. package/autoresearch/baseline-skill.txt +0 -1
  704. package/autoresearch/browse-tasks.json +0 -686
  705. package/autoresearch/commands/debug.ts +0 -163
  706. package/autoresearch/commands/fix.ts +0 -145
  707. package/autoresearch/commands/plan.ts +0 -88
  708. package/autoresearch/commands/run.ts +0 -138
  709. package/autoresearch/config.ts +0 -82
  710. package/autoresearch/engine.ts +0 -359
  711. package/autoresearch/eval-all.ts +0 -127
  712. package/autoresearch/eval-browse.ts +0 -185
  713. package/autoresearch/eval-publish.ts +0 -238
  714. package/autoresearch/eval-save.ts +0 -249
  715. package/autoresearch/eval-skill.ts +0 -254
  716. package/autoresearch/eval-v2ex.ts +0 -220
  717. package/autoresearch/eval-zhihu.ts +0 -230
  718. package/autoresearch/logger.ts +0 -69
  719. package/autoresearch/presets/combined-reliability.ts +0 -27
  720. package/autoresearch/presets/index.ts +0 -23
  721. package/autoresearch/presets/operate-reliability.ts +0 -24
  722. package/autoresearch/presets/save-reliability.ts +0 -26
  723. package/autoresearch/presets/skill-quality.ts +0 -20
  724. package/autoresearch/presets/v2ex-reliability.ts +0 -24
  725. package/autoresearch/presets/zhihu-reliability.ts +0 -25
  726. package/autoresearch/publish-tasks.json +0 -345
  727. package/autoresearch/run-browse.sh +0 -9
  728. package/autoresearch/run-save.sh +0 -11
  729. package/autoresearch/run-skill.sh +0 -9
  730. package/autoresearch/save-adapters/xhs-explore-deep.ts +0 -64
  731. package/autoresearch/save-adapters/xhs-note-comments.ts +0 -61
  732. package/autoresearch/save-adapters/xhs-search-full.ts +0 -62
  733. package/autoresearch/save-adapters/zhihu-hot-detail.ts +0 -52
  734. package/autoresearch/save-adapters/zhihu-question-full.ts +0 -57
  735. package/autoresearch/save-adapters/zhihu-search-detail.ts +0 -53
  736. package/autoresearch/save-tasks.json +0 -281
  737. package/autoresearch/v2ex-tasks.json +0 -899
  738. package/autoresearch/zhihu-tasks.json +0 -848
  739. package/bun.lock +0 -615
  740. package/dist/cli.d.ts +0 -9
  741. package/docs/.vitepress/config.mts +0 -238
  742. package/docs/adapters/browser/1688.md +0 -52
  743. package/docs/adapters/browser/36kr.md +0 -48
  744. package/docs/adapters/browser/amazon.md +0 -53
  745. package/docs/adapters/browser/apple-podcasts.md +0 -28
  746. package/docs/adapters/browser/arxiv.md +0 -27
  747. package/docs/adapters/browser/band.md +0 -63
  748. package/docs/adapters/browser/barchart.md +0 -33
  749. package/docs/adapters/browser/bbc.md +0 -26
  750. package/docs/adapters/browser/bilibili.md +0 -47
  751. package/docs/adapters/browser/bloomberg.md +0 -70
  752. package/docs/adapters/browser/bluesky.md +0 -53
  753. package/docs/adapters/browser/boss.md +0 -28
  754. package/docs/adapters/browser/chaoxing.md +0 -39
  755. package/docs/adapters/browser/coupang.md +0 -28
  756. package/docs/adapters/browser/ctrip.md +0 -27
  757. package/docs/adapters/browser/devto.md +0 -35
  758. package/docs/adapters/browser/dictionary.md +0 -27
  759. package/docs/adapters/browser/douban.md +0 -62
  760. package/docs/adapters/browser/doubao.md +0 -39
  761. package/docs/adapters/browser/douyin.md +0 -75
  762. package/docs/adapters/browser/facebook.md +0 -36
  763. package/docs/adapters/browser/gemini.md +0 -72
  764. package/docs/adapters/browser/google.md +0 -62
  765. package/docs/adapters/browser/grok.md +0 -53
  766. package/docs/adapters/browser/hackernews.md +0 -42
  767. package/docs/adapters/browser/hf.md +0 -42
  768. package/docs/adapters/browser/hupu.md +0 -53
  769. package/docs/adapters/browser/imdb.md +0 -47
  770. package/docs/adapters/browser/instagram.md +0 -46
  771. package/docs/adapters/browser/jd.md +0 -27
  772. package/docs/adapters/browser/jike.md +0 -45
  773. package/docs/adapters/browser/jimeng.md +0 -39
  774. package/docs/adapters/browser/linkedin.md +0 -33
  775. package/docs/adapters/browser/linux-do.md +0 -206
  776. package/docs/adapters/browser/lobsters.md +0 -32
  777. package/docs/adapters/browser/medium.md +0 -32
  778. package/docs/adapters/browser/notebooklm.md +0 -69
  779. package/docs/adapters/browser/ones.md +0 -59
  780. package/docs/adapters/browser/paperreview.md +0 -43
  781. package/docs/adapters/browser/pixiv.md +0 -92
  782. package/docs/adapters/browser/producthunt.md +0 -49
  783. package/docs/adapters/browser/reddit.md +0 -50
  784. package/docs/adapters/browser/reuters.md +0 -27
  785. package/docs/adapters/browser/sinablog.md +0 -36
  786. package/docs/adapters/browser/sinafinance.md +0 -115
  787. package/docs/adapters/browser/smzdm.md +0 -27
  788. package/docs/adapters/browser/spotify.md +0 -62
  789. package/docs/adapters/browser/stackoverflow.md +0 -35
  790. package/docs/adapters/browser/steam.md +0 -26
  791. package/docs/adapters/browser/substack.md +0 -38
  792. package/docs/adapters/browser/tieba.md +0 -45
  793. package/docs/adapters/browser/tiktok.md +0 -68
  794. package/docs/adapters/browser/twitter.md +0 -56
  795. package/docs/adapters/browser/v2ex.md +0 -53
  796. package/docs/adapters/browser/web.md +0 -30
  797. package/docs/adapters/browser/weibo.md +0 -36
  798. package/docs/adapters/browser/weixin.md +0 -33
  799. package/docs/adapters/browser/weread.md +0 -48
  800. package/docs/adapters/browser/wikipedia.md +0 -32
  801. package/docs/adapters/browser/xianyu.md +0 -42
  802. package/docs/adapters/browser/xiaoe.md +0 -44
  803. package/docs/adapters/browser/xiaohongshu.md +0 -47
  804. package/docs/adapters/browser/xiaoyuzhou.md +0 -28
  805. package/docs/adapters/browser/xueqiu.md +0 -65
  806. package/docs/adapters/browser/yahoo-finance.md +0 -27
  807. package/docs/adapters/browser/yollomi.md +0 -69
  808. package/docs/adapters/browser/youtube.md +0 -29
  809. package/docs/adapters/browser/yuanbao.md +0 -64
  810. package/docs/adapters/browser/zhihu.md +0 -30
  811. package/docs/adapters/browser/zsxq.md +0 -49
  812. package/docs/adapters/desktop/antigravity.md +0 -49
  813. package/docs/adapters/desktop/chatgpt.md +0 -49
  814. package/docs/adapters/desktop/chatwise.md +0 -38
  815. package/docs/adapters/desktop/codex.md +0 -36
  816. package/docs/adapters/desktop/cursor.md +0 -37
  817. package/docs/adapters/desktop/discord.md +0 -28
  818. package/docs/adapters/desktop/doubao-app.md +0 -35
  819. package/docs/adapters/desktop/notion.md +0 -29
  820. package/docs/adapters/index.md +0 -96
  821. package/docs/adapters-doc/ones.md +0 -32
  822. package/docs/advanced/cdp.md +0 -103
  823. package/docs/advanced/download.md +0 -71
  824. package/docs/advanced/electron.md +0 -125
  825. package/docs/advanced/rate-limiter-plugin.md +0 -99
  826. package/docs/advanced/remote-chrome.md +0 -72
  827. package/docs/comparison.md +0 -125
  828. package/docs/developer/ai-workflow.md +0 -66
  829. package/docs/developer/architecture.md +0 -103
  830. package/docs/developer/contributing.md +0 -155
  831. package/docs/developer/testing.md +0 -263
  832. package/docs/developer/ts-adapter.md +0 -105
  833. package/docs/developer/yaml-adapter.md +0 -124
  834. package/docs/guide/browser-bridge.md +0 -49
  835. package/docs/guide/electron-app-cli.md +0 -200
  836. package/docs/guide/getting-started.md +0 -79
  837. package/docs/guide/installation.md +0 -37
  838. package/docs/guide/plugins.md +0 -261
  839. package/docs/guide/troubleshooting.md +0 -72
  840. package/docs/index.md +0 -35
  841. package/docs/superpowers/plans/2026-03-28-perf-smart-wait.md +0 -1143
  842. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +0 -857
  843. package/docs/superpowers/specs/2026-03-28-perf-smart-wait-design.md +0 -170
  844. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +0 -208
  845. package/docs/superpowers/specs/2026-04-02-browse-skill-testing-design.md +0 -144
  846. package/docs/superpowers/specs/2026-04-03-v2ex-autoresearch-design.md +0 -41
  847. package/docs/zh/adapters/index.md +0 -5
  848. package/docs/zh/advanced/cdp.md +0 -3
  849. package/docs/zh/developer/contributing.md +0 -24
  850. package/docs/zh/guide/browser-bridge.md +0 -36
  851. package/docs/zh/guide/electron-app-cli.md +0 -188
  852. package/docs/zh/guide/getting-started.md +0 -62
  853. package/docs/zh/guide/installation.md +0 -37
  854. package/docs/zh/guide/plugins.md +0 -183
  855. package/docs/zh/index.md +0 -29
  856. package/extension/dist/background.js +0 -1127
  857. package/extension/icons/icon-128.png +0 -0
  858. package/extension/icons/icon-16.png +0 -0
  859. package/extension/icons/icon-32.png +0 -0
  860. package/extension/icons/icon-48.png +0 -0
  861. package/extension/manifest.json +0 -39
  862. package/extension/package-lock.json +0 -1156
  863. package/extension/package.json +0 -17
  864. package/extension/popup.html +0 -84
  865. package/extension/popup.js +0 -25
  866. package/extension/scripts/package-release.mjs +0 -179
  867. package/extension/src/background.test.ts +0 -279
  868. package/extension/src/background.ts +0 -878
  869. package/extension/src/cdp.test.ts +0 -75
  870. package/extension/src/cdp.ts +0 -440
  871. package/extension/src/protocol.ts +0 -87
  872. package/extension/store-assets/screenshot-1280x800.png +0 -0
  873. package/extension/tsconfig.json +0 -15
  874. package/extension/vite.config.ts +0 -18
  875. package/skills/opencli-explorer/SKILL.md +0 -853
  876. package/skills/opencli-oneshot/SKILL.md +0 -222
  877. package/skills/opencli-operate/SKILL.md +0 -306
  878. package/skills/opencli-usage/SKILL.md +0 -163
  879. package/skills/opencli-usage/browser.md +0 -527
  880. package/skills/opencli-usage/desktop.md +0 -118
  881. package/skills/opencli-usage/plugins.md +0 -82
  882. package/skills/opencli-usage/public-api.md +0 -178
  883. package/skills/smart-search/SKILL.md +0 -156
  884. package/skills/smart-search/references/sources-ai.md +0 -74
  885. package/skills/smart-search/references/sources-info.md +0 -43
  886. package/skills/smart-search/references/sources-media.md +0 -50
  887. package/skills/smart-search/references/sources-other.md +0 -42
  888. package/skills/smart-search/references/sources-shopping.md +0 -31
  889. package/skills/smart-search/references/sources-social.md +0 -51
  890. package/skills/smart-search/references/sources-tech.md +0 -42
  891. package/skills/smart-search/references/sources-travel.md +0 -20
  892. package/src/analysis.ts +0 -170
  893. package/src/browser/base-page.ts +0 -232
  894. package/src/browser/bridge.ts +0 -129
  895. package/src/browser/cdp.test.ts +0 -66
  896. package/src/browser/cdp.ts +0 -341
  897. package/src/browser/daemon-client.test.ts +0 -103
  898. package/src/browser/daemon-client.ts +0 -175
  899. package/src/browser/discover.ts +0 -26
  900. package/src/browser/dom-helpers.test.ts +0 -114
  901. package/src/browser/dom-helpers.ts +0 -238
  902. package/src/browser/dom-snapshot.test.ts +0 -291
  903. package/src/browser/dom-snapshot.ts +0 -845
  904. package/src/browser/errors.ts +0 -63
  905. package/src/browser/index.ts +0 -14
  906. package/src/browser/page.test.ts +0 -58
  907. package/src/browser/page.ts +0 -315
  908. package/src/browser/stealth.test.ts +0 -153
  909. package/src/browser/stealth.ts +0 -354
  910. package/src/browser/tabs.ts +0 -76
  911. package/src/browser/utils.ts +0 -27
  912. package/src/browser.test.ts +0 -195
  913. package/src/build-manifest.test.ts +0 -200
  914. package/src/build-manifest.ts +0 -279
  915. package/src/capabilityRouting.test.ts +0 -47
  916. package/src/capabilityRouting.ts +0 -29
  917. package/src/cascade.ts +0 -192
  918. package/src/cli.test.ts +0 -133
  919. package/src/cli.ts +0 -1012
  920. package/src/clis/1688/item.test.ts +0 -69
  921. package/src/clis/1688/item.ts +0 -282
  922. package/src/clis/1688/search.test.ts +0 -81
  923. package/src/clis/1688/search.ts +0 -402
  924. package/src/clis/1688/shared.test.ts +0 -75
  925. package/src/clis/1688/shared.ts +0 -623
  926. package/src/clis/1688/store.test.ts +0 -69
  927. package/src/clis/1688/store.ts +0 -300
  928. package/src/clis/36kr/article.ts +0 -69
  929. package/src/clis/36kr/hot.test.ts +0 -19
  930. package/src/clis/36kr/hot.ts +0 -100
  931. package/src/clis/36kr/news.test.ts +0 -90
  932. package/src/clis/36kr/news.ts +0 -54
  933. package/src/clis/36kr/search.ts +0 -78
  934. package/src/clis/_shared/common.ts +0 -11
  935. package/src/clis/_shared/desktop-commands.ts +0 -121
  936. package/src/clis/amazon/bestsellers.test.ts +0 -31
  937. package/src/clis/amazon/bestsellers.ts +0 -8
  938. package/src/clis/amazon/discussion.test.ts +0 -38
  939. package/src/clis/amazon/discussion.ts +0 -131
  940. package/src/clis/amazon/movers-shakers.ts +0 -8
  941. package/src/clis/amazon/new-releases.ts +0 -8
  942. package/src/clis/amazon/offer.test.ts +0 -35
  943. package/src/clis/amazon/offer.ts +0 -185
  944. package/src/clis/amazon/product.test.ts +0 -26
  945. package/src/clis/amazon/product.ts +0 -131
  946. package/src/clis/amazon/rankings.test.ts +0 -47
  947. package/src/clis/amazon/rankings.ts +0 -312
  948. package/src/clis/amazon/search.test.ts +0 -24
  949. package/src/clis/amazon/search.ts +0 -128
  950. package/src/clis/amazon/shared.test.ts +0 -53
  951. package/src/clis/amazon/shared.ts +0 -438
  952. package/src/clis/antigravity/SKILL.md +0 -38
  953. package/src/clis/antigravity/dump.ts +0 -30
  954. package/src/clis/antigravity/extract-code.ts +0 -34
  955. package/src/clis/antigravity/model.ts +0 -47
  956. package/src/clis/antigravity/new.ts +0 -28
  957. package/src/clis/antigravity/read.ts +0 -36
  958. package/src/clis/antigravity/send.ts +0 -40
  959. package/src/clis/antigravity/serve.ts +0 -600
  960. package/src/clis/antigravity/status.ts +0 -19
  961. package/src/clis/antigravity/watch.ts +0 -45
  962. package/src/clis/apple-podcasts/commands.test.ts +0 -123
  963. package/src/clis/apple-podcasts/episodes.ts +0 -28
  964. package/src/clis/apple-podcasts/search.ts +0 -30
  965. package/src/clis/apple-podcasts/top.ts +0 -47
  966. package/src/clis/apple-podcasts/utils.test.ts +0 -72
  967. package/src/clis/apple-podcasts/utils.ts +0 -37
  968. package/src/clis/arxiv/paper.ts +0 -21
  969. package/src/clis/arxiv/search.ts +0 -24
  970. package/src/clis/arxiv/utils.ts +0 -63
  971. package/src/clis/band/bands.ts +0 -76
  972. package/src/clis/band/mentions.ts +0 -134
  973. package/src/clis/band/post.ts +0 -187
  974. package/src/clis/band/posts.ts +0 -106
  975. package/src/clis/barchart/flow.ts +0 -120
  976. package/src/clis/barchart/greeks.ts +0 -123
  977. package/src/clis/barchart/options.ts +0 -110
  978. package/src/clis/barchart/quote.ts +0 -137
  979. package/src/clis/bbc/news.ts +0 -41
  980. package/src/clis/bilibili/comments.test.ts +0 -103
  981. package/src/clis/bilibili/comments.ts +0 -44
  982. package/src/clis/bilibili/download.ts +0 -93
  983. package/src/clis/bilibili/dynamic.test.ts +0 -79
  984. package/src/clis/bilibili/dynamic.ts +0 -34
  985. package/src/clis/bilibili/favorite.ts +0 -45
  986. package/src/clis/bilibili/feed.ts +0 -71
  987. package/src/clis/bilibili/following.ts +0 -51
  988. package/src/clis/bilibili/history.ts +0 -48
  989. package/src/clis/bilibili/hot.yaml +0 -38
  990. package/src/clis/bilibili/me.ts +0 -14
  991. package/src/clis/bilibili/ranking.ts +0 -25
  992. package/src/clis/bilibili/search.ts +0 -25
  993. package/src/clis/bilibili/subtitle.test.ts +0 -61
  994. package/src/clis/bilibili/subtitle.ts +0 -106
  995. package/src/clis/bilibili/user-videos.ts +0 -42
  996. package/src/clis/bilibili/utils.test.ts +0 -21
  997. package/src/clis/bilibili/utils.ts +0 -143
  998. package/src/clis/bloomberg/businessweek.ts +0 -18
  999. package/src/clis/bloomberg/economics.ts +0 -18
  1000. package/src/clis/bloomberg/feeds.ts +0 -16
  1001. package/src/clis/bloomberg/industries.ts +0 -18
  1002. package/src/clis/bloomberg/main.ts +0 -18
  1003. package/src/clis/bloomberg/markets.ts +0 -18
  1004. package/src/clis/bloomberg/news.ts +0 -136
  1005. package/src/clis/bloomberg/opinions.ts +0 -18
  1006. package/src/clis/bloomberg/politics.ts +0 -18
  1007. package/src/clis/bloomberg/tech.ts +0 -18
  1008. package/src/clis/bloomberg/utils.test.ts +0 -135
  1009. package/src/clis/bloomberg/utils.ts +0 -429
  1010. package/src/clis/bluesky/feeds.yaml +0 -29
  1011. package/src/clis/bluesky/followers.yaml +0 -33
  1012. package/src/clis/bluesky/following.yaml +0 -33
  1013. package/src/clis/bluesky/profile.yaml +0 -27
  1014. package/src/clis/bluesky/search.yaml +0 -34
  1015. package/src/clis/bluesky/starter-packs.yaml +0 -34
  1016. package/src/clis/bluesky/thread.yaml +0 -32
  1017. package/src/clis/bluesky/trending.yaml +0 -27
  1018. package/src/clis/bluesky/user.yaml +0 -34
  1019. package/src/clis/boss/batchgreet.ts +0 -75
  1020. package/src/clis/boss/chatlist.ts +0 -36
  1021. package/src/clis/boss/chatmsg.ts +0 -46
  1022. package/src/clis/boss/detail.ts +0 -69
  1023. package/src/clis/boss/exchange.ts +0 -52
  1024. package/src/clis/boss/greet.ts +0 -61
  1025. package/src/clis/boss/invite.ts +0 -80
  1026. package/src/clis/boss/joblist.ts +0 -34
  1027. package/src/clis/boss/mark.ts +0 -75
  1028. package/src/clis/boss/recommend.ts +0 -49
  1029. package/src/clis/boss/resume.ts +0 -157
  1030. package/src/clis/boss/search.ts +0 -162
  1031. package/src/clis/boss/send.ts +0 -54
  1032. package/src/clis/boss/stats.ts +0 -75
  1033. package/src/clis/boss/utils.ts +0 -287
  1034. package/src/clis/chaoxing/assignments.ts +0 -89
  1035. package/src/clis/chaoxing/exams.ts +0 -88
  1036. package/src/clis/chaoxing/utils.test.ts +0 -53
  1037. package/src/clis/chaoxing/utils.ts +0 -266
  1038. package/src/clis/chatgpt/ask.ts +0 -95
  1039. package/src/clis/chatgpt/ax.ts +0 -260
  1040. package/src/clis/chatgpt/model.ts +0 -27
  1041. package/src/clis/chatgpt/new.ts +0 -29
  1042. package/src/clis/chatgpt/read.ts +0 -35
  1043. package/src/clis/chatgpt/send.ts +0 -59
  1044. package/src/clis/chatgpt/status.ts +0 -27
  1045. package/src/clis/chatwise/ask.ts +0 -90
  1046. package/src/clis/chatwise/export.ts +0 -51
  1047. package/src/clis/chatwise/history.ts +0 -61
  1048. package/src/clis/chatwise/model.ts +0 -89
  1049. package/src/clis/chatwise/new.ts +0 -3
  1050. package/src/clis/chatwise/read.ts +0 -42
  1051. package/src/clis/chatwise/screenshot.ts +0 -3
  1052. package/src/clis/chatwise/send.ts +0 -53
  1053. package/src/clis/chatwise/status.ts +0 -3
  1054. package/src/clis/codex/ask.ts +0 -80
  1055. package/src/clis/codex/dump.ts +0 -3
  1056. package/src/clis/codex/export.ts +0 -42
  1057. package/src/clis/codex/extract-diff.ts +0 -48
  1058. package/src/clis/codex/history.ts +0 -47
  1059. package/src/clis/codex/model.ts +0 -59
  1060. package/src/clis/codex/new.ts +0 -3
  1061. package/src/clis/codex/read.ts +0 -37
  1062. package/src/clis/codex/screenshot.ts +0 -3
  1063. package/src/clis/codex/send.ts +0 -48
  1064. package/src/clis/codex/status.ts +0 -3
  1065. package/src/clis/coupang/add-to-cart.ts +0 -148
  1066. package/src/clis/coupang/search.ts +0 -464
  1067. package/src/clis/coupang/utils.test.ts +0 -78
  1068. package/src/clis/coupang/utils.ts +0 -302
  1069. package/src/clis/ctrip/search.test.ts +0 -73
  1070. package/src/clis/ctrip/search.ts +0 -111
  1071. package/src/clis/cursor/ask.ts +0 -82
  1072. package/src/clis/cursor/composer.ts +0 -51
  1073. package/src/clis/cursor/dump.ts +0 -3
  1074. package/src/clis/cursor/export.ts +0 -57
  1075. package/src/clis/cursor/extract-code.ts +0 -39
  1076. package/src/clis/cursor/history.ts +0 -47
  1077. package/src/clis/cursor/model.ts +0 -57
  1078. package/src/clis/cursor/new.ts +0 -3
  1079. package/src/clis/cursor/read.ts +0 -48
  1080. package/src/clis/cursor/screenshot.ts +0 -3
  1081. package/src/clis/cursor/send.ts +0 -48
  1082. package/src/clis/cursor/status.ts +0 -3
  1083. package/src/clis/devto/tag.yaml +0 -34
  1084. package/src/clis/devto/top.yaml +0 -29
  1085. package/src/clis/devto/user.yaml +0 -33
  1086. package/src/clis/dictionary/examples.yaml +0 -25
  1087. package/src/clis/dictionary/search.yaml +0 -27
  1088. package/src/clis/dictionary/synonyms.yaml +0 -25
  1089. package/src/clis/discord-app/channels.ts +0 -60
  1090. package/src/clis/discord-app/members.ts +0 -41
  1091. package/src/clis/discord-app/read.ts +0 -49
  1092. package/src/clis/discord-app/search.ts +0 -64
  1093. package/src/clis/discord-app/send.ts +0 -32
  1094. package/src/clis/discord-app/servers.ts +0 -39
  1095. package/src/clis/discord-app/status.ts +0 -18
  1096. package/src/clis/douban/book-hot.ts +0 -15
  1097. package/src/clis/douban/download.test.ts +0 -196
  1098. package/src/clis/douban/download.ts +0 -78
  1099. package/src/clis/douban/marks.ts +0 -135
  1100. package/src/clis/douban/movie-hot.ts +0 -15
  1101. package/src/clis/douban/photos.ts +0 -36
  1102. package/src/clis/douban/reviews.ts +0 -127
  1103. package/src/clis/douban/search.ts +0 -17
  1104. package/src/clis/douban/subject.yaml +0 -107
  1105. package/src/clis/douban/top250.yaml +0 -70
  1106. package/src/clis/douban/utils.test.ts +0 -97
  1107. package/src/clis/douban/utils.ts +0 -472
  1108. package/src/clis/doubao/ask.ts +0 -40
  1109. package/src/clis/doubao/detail.test.ts +0 -53
  1110. package/src/clis/doubao/detail.ts +0 -41
  1111. package/src/clis/doubao/history.test.ts +0 -45
  1112. package/src/clis/doubao/history.ts +0 -32
  1113. package/src/clis/doubao/meeting-summary.ts +0 -53
  1114. package/src/clis/doubao/meeting-transcript.ts +0 -48
  1115. package/src/clis/doubao/new.ts +0 -22
  1116. package/src/clis/doubao/read.ts +0 -20
  1117. package/src/clis/doubao/send.ts +0 -25
  1118. package/src/clis/doubao/status.ts +0 -27
  1119. package/src/clis/doubao/utils.test.ts +0 -45
  1120. package/src/clis/doubao/utils.ts +0 -1010
  1121. package/src/clis/doubao-app/ask.ts +0 -60
  1122. package/src/clis/doubao-app/dump.ts +0 -28
  1123. package/src/clis/doubao-app/new.ts +0 -21
  1124. package/src/clis/doubao-app/read.ts +0 -21
  1125. package/src/clis/doubao-app/screenshot.ts +0 -19
  1126. package/src/clis/doubao-app/send.ts +0 -30
  1127. package/src/clis/doubao-app/status.ts +0 -17
  1128. package/src/clis/doubao-app/utils.ts +0 -116
  1129. package/src/clis/douyin/_shared/browser-fetch.test.ts +0 -37
  1130. package/src/clis/douyin/_shared/browser-fetch.ts +0 -45
  1131. package/src/clis/douyin/_shared/creation-id.test.ts +0 -26
  1132. package/src/clis/douyin/_shared/creation-id.ts +0 -8
  1133. package/src/clis/douyin/_shared/imagex-upload.test.ts +0 -113
  1134. package/src/clis/douyin/_shared/imagex-upload.ts +0 -76
  1135. package/src/clis/douyin/_shared/public-api.ts +0 -84
  1136. package/src/clis/douyin/_shared/sts2.test.ts +0 -31
  1137. package/src/clis/douyin/_shared/sts2.ts +0 -28
  1138. package/src/clis/douyin/_shared/text-extra.test.ts +0 -42
  1139. package/src/clis/douyin/_shared/text-extra.ts +0 -33
  1140. package/src/clis/douyin/_shared/timing.test.ts +0 -38
  1141. package/src/clis/douyin/_shared/timing.ts +0 -22
  1142. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +0 -102
  1143. package/src/clis/douyin/_shared/tos-upload.test.ts +0 -281
  1144. package/src/clis/douyin/_shared/tos-upload.ts +0 -444
  1145. package/src/clis/douyin/_shared/transcode.test.ts +0 -115
  1146. package/src/clis/douyin/_shared/transcode.ts +0 -78
  1147. package/src/clis/douyin/_shared/types.ts +0 -29
  1148. package/src/clis/douyin/activities.test.ts +0 -65
  1149. package/src/clis/douyin/activities.ts +0 -32
  1150. package/src/clis/douyin/collections.test.ts +0 -59
  1151. package/src/clis/douyin/collections.ts +0 -25
  1152. package/src/clis/douyin/delete.test.ts +0 -12
  1153. package/src/clis/douyin/delete.ts +0 -20
  1154. package/src/clis/douyin/draft.test.ts +0 -452
  1155. package/src/clis/douyin/draft.ts +0 -446
  1156. package/src/clis/douyin/drafts.test.ts +0 -12
  1157. package/src/clis/douyin/drafts.ts +0 -27
  1158. package/src/clis/douyin/hashtag.test.ts +0 -68
  1159. package/src/clis/douyin/hashtag.ts +0 -64
  1160. package/src/clis/douyin/location.test.ts +0 -26
  1161. package/src/clis/douyin/location.ts +0 -27
  1162. package/src/clis/douyin/profile.test.ts +0 -54
  1163. package/src/clis/douyin/profile.ts +0 -44
  1164. package/src/clis/douyin/publish.test.ts +0 -45
  1165. package/src/clis/douyin/publish.ts +0 -340
  1166. package/src/clis/douyin/stats.test.ts +0 -25
  1167. package/src/clis/douyin/stats.ts +0 -30
  1168. package/src/clis/douyin/update.test.ts +0 -12
  1169. package/src/clis/douyin/update.ts +0 -43
  1170. package/src/clis/douyin/user-videos.test.ts +0 -122
  1171. package/src/clis/douyin/user-videos.ts +0 -101
  1172. package/src/clis/douyin/videos.test.ts +0 -62
  1173. package/src/clis/douyin/videos.ts +0 -83
  1174. package/src/clis/facebook/add-friend.yaml +0 -43
  1175. package/src/clis/facebook/events.yaml +0 -44
  1176. package/src/clis/facebook/feed.yaml +0 -63
  1177. package/src/clis/facebook/friends.yaml +0 -42
  1178. package/src/clis/facebook/groups.yaml +0 -50
  1179. package/src/clis/facebook/join-group.yaml +0 -44
  1180. package/src/clis/facebook/memories.yaml +0 -39
  1181. package/src/clis/facebook/notifications.yaml +0 -40
  1182. package/src/clis/facebook/profile.yaml +0 -37
  1183. package/src/clis/facebook/search.test.ts +0 -68
  1184. package/src/clis/facebook/search.yaml +0 -47
  1185. package/src/clis/gemini/ask.test.ts +0 -116
  1186. package/src/clis/gemini/ask.ts +0 -53
  1187. package/src/clis/gemini/image.ts +0 -115
  1188. package/src/clis/gemini/new.ts +0 -22
  1189. package/src/clis/gemini/reply-state.test.ts +0 -708
  1190. package/src/clis/gemini/utils.test.ts +0 -218
  1191. package/src/clis/gemini/utils.ts +0 -1051
  1192. package/src/clis/google/news.ts +0 -66
  1193. package/src/clis/google/search.ts +0 -133
  1194. package/src/clis/google/suggest.ts +0 -40
  1195. package/src/clis/google/trends.ts +0 -44
  1196. package/src/clis/google/utils.test.ts +0 -82
  1197. package/src/clis/google/utils.ts +0 -24
  1198. package/src/clis/grok/ask.test.ts +0 -78
  1199. package/src/clis/grok/ask.ts +0 -334
  1200. package/src/clis/hackernews/ask.yaml +0 -38
  1201. package/src/clis/hackernews/best.yaml +0 -38
  1202. package/src/clis/hackernews/jobs.yaml +0 -36
  1203. package/src/clis/hackernews/new.yaml +0 -38
  1204. package/src/clis/hackernews/search.yaml +0 -44
  1205. package/src/clis/hackernews/show.yaml +0 -38
  1206. package/src/clis/hackernews/top.yaml +0 -38
  1207. package/src/clis/hackernews/user.yaml +0 -25
  1208. package/src/clis/hf/top.ts +0 -141
  1209. package/src/clis/hupu/detail.ts +0 -126
  1210. package/src/clis/hupu/hot.yaml +0 -43
  1211. package/src/clis/hupu/like.ts +0 -76
  1212. package/src/clis/hupu/reply.ts +0 -76
  1213. package/src/clis/hupu/search.ts +0 -95
  1214. package/src/clis/hupu/unlike.ts +0 -76
  1215. package/src/clis/hupu/utils.ts +0 -381
  1216. package/src/clis/imdb/person.ts +0 -232
  1217. package/src/clis/imdb/reviews.ts +0 -111
  1218. package/src/clis/imdb/search.ts +0 -179
  1219. package/src/clis/imdb/title.ts +0 -121
  1220. package/src/clis/imdb/top.ts +0 -67
  1221. package/src/clis/imdb/trending.ts +0 -66
  1222. package/src/clis/imdb/utils.test.ts +0 -117
  1223. package/src/clis/imdb/utils.ts +0 -305
  1224. package/src/clis/instagram/_shared/private-publish.test.ts +0 -827
  1225. package/src/clis/instagram/_shared/private-publish.ts +0 -1303
  1226. package/src/clis/instagram/_shared/protocol-capture.test.ts +0 -148
  1227. package/src/clis/instagram/_shared/protocol-capture.ts +0 -321
  1228. package/src/clis/instagram/_shared/runtime-info.ts +0 -91
  1229. package/src/clis/instagram/comment.yaml +0 -52
  1230. package/src/clis/instagram/download.test.ts +0 -159
  1231. package/src/clis/instagram/download.ts +0 -286
  1232. package/src/clis/instagram/explore.yaml +0 -43
  1233. package/src/clis/instagram/follow.yaml +0 -41
  1234. package/src/clis/instagram/followers.yaml +0 -51
  1235. package/src/clis/instagram/following.yaml +0 -51
  1236. package/src/clis/instagram/like.yaml +0 -46
  1237. package/src/clis/instagram/note.test.ts +0 -96
  1238. package/src/clis/instagram/note.ts +0 -254
  1239. package/src/clis/instagram/post.test.ts +0 -1716
  1240. package/src/clis/instagram/post.ts +0 -1620
  1241. package/src/clis/instagram/profile.yaml +0 -42
  1242. package/src/clis/instagram/reel.test.ts +0 -191
  1243. package/src/clis/instagram/reel.ts +0 -886
  1244. package/src/clis/instagram/save.yaml +0 -46
  1245. package/src/clis/instagram/saved.yaml +0 -40
  1246. package/src/clis/instagram/search.yaml +0 -44
  1247. package/src/clis/instagram/story.test.ts +0 -191
  1248. package/src/clis/instagram/story.ts +0 -151
  1249. package/src/clis/instagram/unfollow.yaml +0 -38
  1250. package/src/clis/instagram/unlike.yaml +0 -46
  1251. package/src/clis/instagram/unsave.yaml +0 -46
  1252. package/src/clis/instagram/user.yaml +0 -54
  1253. package/src/clis/jd/item.test.ts +0 -52
  1254. package/src/clis/jd/item.ts +0 -104
  1255. package/src/clis/jike/comment.ts +0 -112
  1256. package/src/clis/jike/create.ts +0 -112
  1257. package/src/clis/jike/feed.ts +0 -73
  1258. package/src/clis/jike/like.ts +0 -64
  1259. package/src/clis/jike/notifications.ts +0 -184
  1260. package/src/clis/jike/post.yaml +0 -59
  1261. package/src/clis/jike/repost.ts +0 -113
  1262. package/src/clis/jike/search.ts +0 -73
  1263. package/src/clis/jike/topic.yaml +0 -53
  1264. package/src/clis/jike/user.yaml +0 -52
  1265. package/src/clis/jike/utils.ts +0 -36
  1266. package/src/clis/jimeng/generate.yaml +0 -85
  1267. package/src/clis/jimeng/history.yaml +0 -46
  1268. package/src/clis/linkedin/search.ts +0 -417
  1269. package/src/clis/linkedin/timeline.test.ts +0 -99
  1270. package/src/clis/linkedin/timeline.ts +0 -532
  1271. package/src/clis/linux-do/categories.yaml +0 -70
  1272. package/src/clis/linux-do/category.ts +0 -37
  1273. package/src/clis/linux-do/feed.test.ts +0 -132
  1274. package/src/clis/linux-do/feed.ts +0 -501
  1275. package/src/clis/linux-do/hot.ts +0 -26
  1276. package/src/clis/linux-do/latest.ts +0 -19
  1277. package/src/clis/linux-do/search.yaml +0 -48
  1278. package/src/clis/linux-do/tags.yaml +0 -41
  1279. package/src/clis/linux-do/topic.yaml +0 -77
  1280. package/src/clis/linux-do/user-posts.yaml +0 -67
  1281. package/src/clis/linux-do/user-topics.yaml +0 -54
  1282. package/src/clis/lobsters/active.yaml +0 -29
  1283. package/src/clis/lobsters/hot.yaml +0 -29
  1284. package/src/clis/lobsters/newest.yaml +0 -29
  1285. package/src/clis/lobsters/tag.yaml +0 -34
  1286. package/src/clis/medium/feed.ts +0 -16
  1287. package/src/clis/medium/search.ts +0 -16
  1288. package/src/clis/medium/user.ts +0 -16
  1289. package/src/clis/medium/utils.ts +0 -84
  1290. package/src/clis/notebooklm/compat.test.ts +0 -19
  1291. package/src/clis/notebooklm/current.ts +0 -37
  1292. package/src/clis/notebooklm/get.ts +0 -51
  1293. package/src/clis/notebooklm/history.test.ts +0 -70
  1294. package/src/clis/notebooklm/history.ts +0 -34
  1295. package/src/clis/notebooklm/list.ts +0 -40
  1296. package/src/clis/notebooklm/note-list.test.ts +0 -64
  1297. package/src/clis/notebooklm/note-list.ts +0 -40
  1298. package/src/clis/notebooklm/notes-get.test.ts +0 -88
  1299. package/src/clis/notebooklm/notes-get.ts +0 -65
  1300. package/src/clis/notebooklm/open.test.ts +0 -78
  1301. package/src/clis/notebooklm/open.ts +0 -61
  1302. package/src/clis/notebooklm/rpc.test.ts +0 -126
  1303. package/src/clis/notebooklm/rpc.ts +0 -286
  1304. package/src/clis/notebooklm/shared.ts +0 -98
  1305. package/src/clis/notebooklm/source-fulltext.test.ts +0 -123
  1306. package/src/clis/notebooklm/source-fulltext.ts +0 -67
  1307. package/src/clis/notebooklm/source-get.test.ts +0 -100
  1308. package/src/clis/notebooklm/source-get.ts +0 -58
  1309. package/src/clis/notebooklm/source-guide.test.ts +0 -121
  1310. package/src/clis/notebooklm/source-guide.ts +0 -67
  1311. package/src/clis/notebooklm/source-list.ts +0 -43
  1312. package/src/clis/notebooklm/status.ts +0 -33
  1313. package/src/clis/notebooklm/summary.test.ts +0 -94
  1314. package/src/clis/notebooklm/summary.ts +0 -43
  1315. package/src/clis/notebooklm/utils.test.ts +0 -446
  1316. package/src/clis/notebooklm/utils.ts +0 -902
  1317. package/src/clis/notion/export.ts +0 -36
  1318. package/src/clis/notion/favorites.ts +0 -87
  1319. package/src/clis/notion/new.ts +0 -39
  1320. package/src/clis/notion/read.ts +0 -33
  1321. package/src/clis/notion/search.ts +0 -54
  1322. package/src/clis/notion/sidebar.ts +0 -44
  1323. package/src/clis/notion/status.ts +0 -18
  1324. package/src/clis/notion/write.ts +0 -45
  1325. package/src/clis/ones/common.ts +0 -187
  1326. package/src/clis/ones/enrich-tasks.ts +0 -47
  1327. package/src/clis/ones/login.ts +0 -103
  1328. package/src/clis/ones/logout.ts +0 -19
  1329. package/src/clis/ones/me.ts +0 -34
  1330. package/src/clis/ones/my-tasks.ts +0 -148
  1331. package/src/clis/ones/resolve-labels.ts +0 -80
  1332. package/src/clis/ones/task-helpers.test.ts +0 -14
  1333. package/src/clis/ones/task-helpers.ts +0 -214
  1334. package/src/clis/ones/task.ts +0 -79
  1335. package/src/clis/ones/tasks.ts +0 -92
  1336. package/src/clis/ones/token-info.ts +0 -46
  1337. package/src/clis/ones/worklog.test.ts +0 -24
  1338. package/src/clis/ones/worklog.ts +0 -306
  1339. package/src/clis/paperreview/commands.test.ts +0 -283
  1340. package/src/clis/paperreview/feedback.ts +0 -64
  1341. package/src/clis/paperreview/review.ts +0 -47
  1342. package/src/clis/paperreview/submit.ts +0 -119
  1343. package/src/clis/paperreview/utils.test.ts +0 -68
  1344. package/src/clis/paperreview/utils.ts +0 -276
  1345. package/src/clis/pixiv/detail.yaml +0 -49
  1346. package/src/clis/pixiv/download.test.ts +0 -114
  1347. package/src/clis/pixiv/download.ts +0 -91
  1348. package/src/clis/pixiv/illusts.test.ts +0 -115
  1349. package/src/clis/pixiv/illusts.ts +0 -78
  1350. package/src/clis/pixiv/ranking.yaml +0 -53
  1351. package/src/clis/pixiv/search.test.ts +0 -97
  1352. package/src/clis/pixiv/search.ts +0 -53
  1353. package/src/clis/pixiv/test-utils.ts +0 -29
  1354. package/src/clis/pixiv/user.yaml +0 -46
  1355. package/src/clis/pixiv/utils.ts +0 -62
  1356. package/src/clis/producthunt/browse.ts +0 -109
  1357. package/src/clis/producthunt/hot.ts +0 -127
  1358. package/src/clis/producthunt/posts.ts +0 -29
  1359. package/src/clis/producthunt/today.ts +0 -37
  1360. package/src/clis/producthunt/utils.test.ts +0 -72
  1361. package/src/clis/producthunt/utils.ts +0 -122
  1362. package/src/clis/reddit/comment.ts +0 -60
  1363. package/src/clis/reddit/frontpage.yaml +0 -30
  1364. package/src/clis/reddit/hot.yaml +0 -47
  1365. package/src/clis/reddit/popular.yaml +0 -40
  1366. package/src/clis/reddit/read.test.ts +0 -34
  1367. package/src/clis/reddit/read.ts +0 -186
  1368. package/src/clis/reddit/save.ts +0 -54
  1369. package/src/clis/reddit/saved.ts +0 -51
  1370. package/src/clis/reddit/search.yaml +0 -61
  1371. package/src/clis/reddit/subreddit.yaml +0 -50
  1372. package/src/clis/reddit/subscribe.ts +0 -53
  1373. package/src/clis/reddit/upvote.ts +0 -67
  1374. package/src/clis/reddit/upvoted.ts +0 -51
  1375. package/src/clis/reddit/user-comments.yaml +0 -46
  1376. package/src/clis/reddit/user-posts.yaml +0 -44
  1377. package/src/clis/reddit/user.yaml +0 -40
  1378. package/src/clis/reuters/search.ts +0 -51
  1379. package/src/clis/sinablog/article.ts +0 -15
  1380. package/src/clis/sinablog/hot.ts +0 -15
  1381. package/src/clis/sinablog/search.ts +0 -56
  1382. package/src/clis/sinablog/user.ts +0 -16
  1383. package/src/clis/sinablog/utils.ts +0 -197
  1384. package/src/clis/sinafinance/news.ts +0 -76
  1385. package/src/clis/sinafinance/rolling-news.ts +0 -42
  1386. package/src/clis/sinafinance/stock-rank.ts +0 -68
  1387. package/src/clis/sinafinance/stock.ts +0 -127
  1388. package/src/clis/smzdm/search.ts +0 -56
  1389. package/src/clis/spotify/spotify.ts +0 -328
  1390. package/src/clis/spotify/utils.test.ts +0 -87
  1391. package/src/clis/spotify/utils.ts +0 -92
  1392. package/src/clis/stackoverflow/bounties.yaml +0 -29
  1393. package/src/clis/stackoverflow/hot.yaml +0 -28
  1394. package/src/clis/stackoverflow/search.yaml +0 -33
  1395. package/src/clis/stackoverflow/unanswered.yaml +0 -28
  1396. package/src/clis/steam/top-sellers.yaml +0 -29
  1397. package/src/clis/substack/feed.ts +0 -16
  1398. package/src/clis/substack/publication.ts +0 -16
  1399. package/src/clis/substack/search.ts +0 -92
  1400. package/src/clis/substack/utils.test.ts +0 -52
  1401. package/src/clis/substack/utils.ts +0 -141
  1402. package/src/clis/tieba/commands.test.ts +0 -86
  1403. package/src/clis/tieba/hot.ts +0 -52
  1404. package/src/clis/tieba/posts.ts +0 -108
  1405. package/src/clis/tieba/read.ts +0 -158
  1406. package/src/clis/tieba/search.ts +0 -119
  1407. package/src/clis/tieba/utils.test.ts +0 -322
  1408. package/src/clis/tieba/utils.ts +0 -348
  1409. package/src/clis/tiktok/comment.yaml +0 -66
  1410. package/src/clis/tiktok/explore.yaml +0 -39
  1411. package/src/clis/tiktok/follow.yaml +0 -39
  1412. package/src/clis/tiktok/following.yaml +0 -46
  1413. package/src/clis/tiktok/friends.yaml +0 -47
  1414. package/src/clis/tiktok/like.yaml +0 -38
  1415. package/src/clis/tiktok/live.yaml +0 -51
  1416. package/src/clis/tiktok/notifications.yaml +0 -52
  1417. package/src/clis/tiktok/profile.yaml +0 -45
  1418. package/src/clis/tiktok/save.yaml +0 -34
  1419. package/src/clis/tiktok/search.yaml +0 -47
  1420. package/src/clis/tiktok/unfollow.yaml +0 -44
  1421. package/src/clis/tiktok/unlike.yaml +0 -38
  1422. package/src/clis/tiktok/unsave.yaml +0 -36
  1423. package/src/clis/tiktok/user.yaml +0 -44
  1424. package/src/clis/twitter/accept.ts +0 -214
  1425. package/src/clis/twitter/article.ts +0 -170
  1426. package/src/clis/twitter/block.ts +0 -93
  1427. package/src/clis/twitter/bookmark.ts +0 -68
  1428. package/src/clis/twitter/bookmarks.ts +0 -202
  1429. package/src/clis/twitter/delete.ts +0 -78
  1430. package/src/clis/twitter/download.ts +0 -118
  1431. package/src/clis/twitter/follow.ts +0 -70
  1432. package/src/clis/twitter/followers.ts +0 -116
  1433. package/src/clis/twitter/following.ts +0 -109
  1434. package/src/clis/twitter/hide-reply.ts +0 -71
  1435. package/src/clis/twitter/like.ts +0 -74
  1436. package/src/clis/twitter/likes.test.ts +0 -91
  1437. package/src/clis/twitter/likes.ts +0 -256
  1438. package/src/clis/twitter/notifications.ts +0 -136
  1439. package/src/clis/twitter/post.test.ts +0 -157
  1440. package/src/clis/twitter/post.ts +0 -110
  1441. package/src/clis/twitter/profile.ts +0 -108
  1442. package/src/clis/twitter/reply-dm.ts +0 -194
  1443. package/src/clis/twitter/reply.test.ts +0 -177
  1444. package/src/clis/twitter/reply.ts +0 -309
  1445. package/src/clis/twitter/search.test.ts +0 -265
  1446. package/src/clis/twitter/search.ts +0 -185
  1447. package/src/clis/twitter/shared.ts +0 -45
  1448. package/src/clis/twitter/thread.ts +0 -182
  1449. package/src/clis/twitter/timeline.test.ts +0 -109
  1450. package/src/clis/twitter/timeline.ts +0 -248
  1451. package/src/clis/twitter/trending.ts +0 -66
  1452. package/src/clis/twitter/unblock.ts +0 -76
  1453. package/src/clis/twitter/unbookmark.ts +0 -67
  1454. package/src/clis/twitter/unfollow.ts +0 -76
  1455. package/src/clis/v2ex/daily.ts +0 -106
  1456. package/src/clis/v2ex/hot.yaml +0 -28
  1457. package/src/clis/v2ex/latest.yaml +0 -28
  1458. package/src/clis/v2ex/me.ts +0 -104
  1459. package/src/clis/v2ex/member.yaml +0 -29
  1460. package/src/clis/v2ex/node.yaml +0 -34
  1461. package/src/clis/v2ex/nodes.yaml +0 -31
  1462. package/src/clis/v2ex/notifications.ts +0 -76
  1463. package/src/clis/v2ex/replies.yaml +0 -32
  1464. package/src/clis/v2ex/topic.yaml +0 -33
  1465. package/src/clis/v2ex/user.yaml +0 -34
  1466. package/src/clis/web/read.ts +0 -210
  1467. package/src/clis/weibo/comments.ts +0 -54
  1468. package/src/clis/weibo/feed.ts +0 -57
  1469. package/src/clis/weibo/hot.ts +0 -39
  1470. package/src/clis/weibo/me.ts +0 -77
  1471. package/src/clis/weibo/post.ts +0 -77
  1472. package/src/clis/weibo/search.ts +0 -78
  1473. package/src/clis/weibo/user.ts +0 -64
  1474. package/src/clis/weibo/utils.ts +0 -32
  1475. package/src/clis/weixin/download.ts +0 -382
  1476. package/src/clis/weread/book.ts +0 -271
  1477. package/src/clis/weread/commands.test.ts +0 -466
  1478. package/src/clis/weread/highlights.ts +0 -25
  1479. package/src/clis/weread/notebooks.ts +0 -23
  1480. package/src/clis/weread/notes.ts +0 -31
  1481. package/src/clis/weread/private-api-regression.test.ts +0 -435
  1482. package/src/clis/weread/ranking.ts +0 -29
  1483. package/src/clis/weread/search-regression.test.ts +0 -440
  1484. package/src/clis/weread/search.ts +0 -207
  1485. package/src/clis/weread/shelf.ts +0 -84
  1486. package/src/clis/weread/utils.test.ts +0 -153
  1487. package/src/clis/weread/utils.ts +0 -390
  1488. package/src/clis/wikipedia/random.ts +0 -19
  1489. package/src/clis/wikipedia/search.ts +0 -38
  1490. package/src/clis/wikipedia/summary.ts +0 -23
  1491. package/src/clis/wikipedia/trending.ts +0 -41
  1492. package/src/clis/wikipedia/utils.ts +0 -51
  1493. package/src/clis/xianyu/chat.test.ts +0 -20
  1494. package/src/clis/xianyu/chat.ts +0 -175
  1495. package/src/clis/xianyu/item.test.ts +0 -67
  1496. package/src/clis/xianyu/item.ts +0 -172
  1497. package/src/clis/xianyu/search.test.ts +0 -22
  1498. package/src/clis/xianyu/search.ts +0 -151
  1499. package/src/clis/xianyu/utils.ts +0 -9
  1500. package/src/clis/xiaoe/catalog.yaml +0 -129
  1501. package/src/clis/xiaoe/content.yaml +0 -43
  1502. package/src/clis/xiaoe/courses.yaml +0 -73
  1503. package/src/clis/xiaoe/detail.yaml +0 -39
  1504. package/src/clis/xiaoe/play-url.yaml +0 -124
  1505. package/src/clis/xiaohongshu/comments.test.ts +0 -171
  1506. package/src/clis/xiaohongshu/comments.ts +0 -140
  1507. package/src/clis/xiaohongshu/creator-note-detail.test.ts +0 -273
  1508. package/src/clis/xiaohongshu/creator-note-detail.ts +0 -447
  1509. package/src/clis/xiaohongshu/creator-notes-summary.test.ts +0 -54
  1510. package/src/clis/xiaohongshu/creator-notes-summary.ts +0 -120
  1511. package/src/clis/xiaohongshu/creator-notes.test.ts +0 -212
  1512. package/src/clis/xiaohongshu/creator-notes.ts +0 -295
  1513. package/src/clis/xiaohongshu/creator-profile.ts +0 -59
  1514. package/src/clis/xiaohongshu/creator-stats.ts +0 -80
  1515. package/src/clis/xiaohongshu/download.test.ts +0 -94
  1516. package/src/clis/xiaohongshu/download.ts +0 -174
  1517. package/src/clis/xiaohongshu/feed.yaml +0 -31
  1518. package/src/clis/xiaohongshu/note-helpers.ts +0 -25
  1519. package/src/clis/xiaohongshu/note.test.ts +0 -213
  1520. package/src/clis/xiaohongshu/note.ts +0 -104
  1521. package/src/clis/xiaohongshu/notifications.yaml +0 -37
  1522. package/src/clis/xiaohongshu/publish.test.ts +0 -228
  1523. package/src/clis/xiaohongshu/publish.ts +0 -598
  1524. package/src/clis/xiaohongshu/search.test.ts +0 -191
  1525. package/src/clis/xiaohongshu/search.ts +0 -143
  1526. package/src/clis/xiaohongshu/user-helpers.test.ts +0 -129
  1527. package/src/clis/xiaohongshu/user-helpers.ts +0 -89
  1528. package/src/clis/xiaohongshu/user.ts +0 -64
  1529. package/src/clis/xiaoyuzhou/episode.ts +0 -28
  1530. package/src/clis/xiaoyuzhou/podcast-episodes.ts +0 -36
  1531. package/src/clis/xiaoyuzhou/podcast.ts +0 -27
  1532. package/src/clis/xiaoyuzhou/utils.test.ts +0 -122
  1533. package/src/clis/xiaoyuzhou/utils.ts +0 -65
  1534. package/src/clis/xueqiu/comments.test.ts +0 -823
  1535. package/src/clis/xueqiu/comments.ts +0 -461
  1536. package/src/clis/xueqiu/danjuan-utils.test.ts +0 -49
  1537. package/src/clis/xueqiu/danjuan-utils.ts +0 -176
  1538. package/src/clis/xueqiu/earnings-date.yaml +0 -69
  1539. package/src/clis/xueqiu/feed.yaml +0 -53
  1540. package/src/clis/xueqiu/fund-holdings.ts +0 -32
  1541. package/src/clis/xueqiu/fund-snapshot.ts +0 -27
  1542. package/src/clis/xueqiu/hot-stock.yaml +0 -49
  1543. package/src/clis/xueqiu/hot.yaml +0 -46
  1544. package/src/clis/xueqiu/search.yaml +0 -55
  1545. package/src/clis/xueqiu/stock.yaml +0 -69
  1546. package/src/clis/xueqiu/watchlist.yaml +0 -46
  1547. package/src/clis/yahoo-finance/quote.ts +0 -72
  1548. package/src/clis/yollomi/background.ts +0 -48
  1549. package/src/clis/yollomi/edit.ts +0 -58
  1550. package/src/clis/yollomi/face-swap.ts +0 -45
  1551. package/src/clis/yollomi/generate.ts +0 -95
  1552. package/src/clis/yollomi/models.ts +0 -38
  1553. package/src/clis/yollomi/object-remover.ts +0 -44
  1554. package/src/clis/yollomi/remove-bg.ts +0 -40
  1555. package/src/clis/yollomi/restore.ts +0 -40
  1556. package/src/clis/yollomi/try-on.ts +0 -48
  1557. package/src/clis/yollomi/upload.ts +0 -78
  1558. package/src/clis/yollomi/upscale.ts +0 -49
  1559. package/src/clis/yollomi/utils.ts +0 -202
  1560. package/src/clis/yollomi/video.ts +0 -61
  1561. package/src/clis/youtube/channel.ts +0 -155
  1562. package/src/clis/youtube/comments.ts +0 -97
  1563. package/src/clis/youtube/search.ts +0 -99
  1564. package/src/clis/youtube/transcript-group.test.ts +0 -108
  1565. package/src/clis/youtube/transcript-group.ts +0 -287
  1566. package/src/clis/youtube/transcript.ts +0 -279
  1567. package/src/clis/youtube/utils.test.ts +0 -43
  1568. package/src/clis/youtube/utils.ts +0 -97
  1569. package/src/clis/youtube/video.ts +0 -118
  1570. package/src/clis/yuanbao/ask.test.ts +0 -156
  1571. package/src/clis/yuanbao/ask.ts +0 -522
  1572. package/src/clis/yuanbao/new.test.ts +0 -36
  1573. package/src/clis/yuanbao/new.ts +0 -81
  1574. package/src/clis/yuanbao/shared.ts +0 -57
  1575. package/src/clis/zhihu/download.test.ts +0 -14
  1576. package/src/clis/zhihu/download.ts +0 -87
  1577. package/src/clis/zhihu/hot.yaml +0 -46
  1578. package/src/clis/zhihu/question.test.ts +0 -96
  1579. package/src/clis/zhihu/question.ts +0 -63
  1580. package/src/clis/zhihu/search.yaml +0 -59
  1581. package/src/clis/zsxq/dynamics.ts +0 -60
  1582. package/src/clis/zsxq/groups.ts +0 -41
  1583. package/src/clis/zsxq/search.test.ts +0 -29
  1584. package/src/clis/zsxq/search.ts +0 -54
  1585. package/src/clis/zsxq/topic.test.ts +0 -34
  1586. package/src/clis/zsxq/topic.ts +0 -68
  1587. package/src/clis/zsxq/topics.test.ts +0 -29
  1588. package/src/clis/zsxq/topics.ts +0 -36
  1589. package/src/clis/zsxq/utils.ts +0 -351
  1590. package/src/commanderAdapter.test.ts +0 -315
  1591. package/src/commanderAdapter.ts +0 -319
  1592. package/src/commands/daemon.test.ts +0 -204
  1593. package/src/commands/daemon.ts +0 -87
  1594. package/src/completion.test.ts +0 -30
  1595. package/src/completion.ts +0 -132
  1596. package/src/constants.ts +0 -41
  1597. package/src/daemon.test.ts +0 -88
  1598. package/src/daemon.ts +0 -339
  1599. package/src/discovery.ts +0 -328
  1600. package/src/doctor.test.ts +0 -111
  1601. package/src/doctor.ts +0 -163
  1602. package/src/download/article-download.ts +0 -272
  1603. package/src/download/index.test.ts +0 -135
  1604. package/src/download/index.ts +0 -422
  1605. package/src/download/media-download.ts +0 -180
  1606. package/src/download/progress.ts +0 -125
  1607. package/src/electron-apps.test.ts +0 -50
  1608. package/src/electron-apps.ts +0 -97
  1609. package/src/engine.test.ts +0 -323
  1610. package/src/errors.test.ts +0 -79
  1611. package/src/errors.ts +0 -162
  1612. package/src/execution.test.ts +0 -47
  1613. package/src/execution.ts +0 -235
  1614. package/src/explore.ts +0 -502
  1615. package/src/extension-manifest-regression.test.ts +0 -18
  1616. package/src/external-clis.yaml +0 -56
  1617. package/src/external.test.ts +0 -97
  1618. package/src/external.ts +0 -246
  1619. package/src/generate.ts +0 -161
  1620. package/src/hooks.test.ts +0 -126
  1621. package/src/hooks.ts +0 -91
  1622. package/src/idle-manager.ts +0 -60
  1623. package/src/interceptor.test.ts +0 -94
  1624. package/src/interceptor.ts +0 -204
  1625. package/src/launcher.test.ts +0 -181
  1626. package/src/launcher.ts +0 -263
  1627. package/src/logger.ts +0 -57
  1628. package/src/main.ts +0 -66
  1629. package/src/node-network.test.ts +0 -93
  1630. package/src/node-network.ts +0 -213
  1631. package/src/output.test.ts +0 -69
  1632. package/src/output.ts +0 -145
  1633. package/src/pipeline/executor.test.ts +0 -191
  1634. package/src/pipeline/executor.ts +0 -110
  1635. package/src/pipeline/registry.ts +0 -62
  1636. package/src/pipeline/steps/browser.ts +0 -76
  1637. package/src/pipeline/steps/download.test.ts +0 -135
  1638. package/src/pipeline/steps/download.ts +0 -320
  1639. package/src/pipeline/steps/fetch.test.ts +0 -179
  1640. package/src/pipeline/steps/fetch.ts +0 -160
  1641. package/src/pipeline/steps/intercept.ts +0 -55
  1642. package/src/pipeline/steps/tap.ts +0 -100
  1643. package/src/pipeline/steps/transform.ts +0 -71
  1644. package/src/pipeline/template.test.ts +0 -177
  1645. package/src/pipeline/template.ts +0 -269
  1646. package/src/pipeline/transform.test.ts +0 -140
  1647. package/src/plugin-manifest.test.ts +0 -223
  1648. package/src/plugin-manifest.ts +0 -206
  1649. package/src/plugin-scaffold.test.ts +0 -98
  1650. package/src/plugin-scaffold.ts +0 -170
  1651. package/src/plugin.test.ts +0 -1427
  1652. package/src/plugin.ts +0 -1537
  1653. package/src/record.test.ts +0 -362
  1654. package/src/record.ts +0 -824
  1655. package/src/registry-api.ts +0 -14
  1656. package/src/registry.test.ts +0 -133
  1657. package/src/registry.ts +0 -160
  1658. package/src/runtime-detect.test.ts +0 -30
  1659. package/src/runtime-detect.ts +0 -36
  1660. package/src/runtime.ts +0 -86
  1661. package/src/scripts/framework.ts +0 -20
  1662. package/src/scripts/interact.ts +0 -22
  1663. package/src/scripts/store.ts +0 -40
  1664. package/src/serialization.test.ts +0 -44
  1665. package/src/serialization.ts +0 -92
  1666. package/src/snapshotFormatter.test.ts +0 -579
  1667. package/src/snapshotFormatter.ts +0 -359
  1668. package/src/synthesize.ts +0 -296
  1669. package/src/tui.test.ts +0 -23
  1670. package/src/tui.ts +0 -237
  1671. package/src/types.ts +0 -95
  1672. package/src/update-check.ts +0 -114
  1673. package/src/utils.ts +0 -44
  1674. package/src/validate.ts +0 -103
  1675. package/src/verify.ts +0 -93
  1676. package/src/version.ts +0 -18
  1677. package/src/weixin-download.test.ts +0 -91
  1678. package/src/yaml-schema.ts +0 -48
  1679. package/tests/e2e/band-auth.test.ts +0 -20
  1680. package/tests/e2e/browser-auth-helpers.ts +0 -18
  1681. package/tests/e2e/browser-auth.test.ts +0 -150
  1682. package/tests/e2e/browser-public-extended.test.ts +0 -166
  1683. package/tests/e2e/browser-public.test.ts +0 -417
  1684. package/tests/e2e/helpers.ts +0 -64
  1685. package/tests/e2e/management.test.ts +0 -106
  1686. package/tests/e2e/output-formats.test.ts +0 -44
  1687. package/tests/e2e/plugin-management.test.ts +0 -140
  1688. package/tests/e2e/public-commands.test.ts +0 -569
  1689. package/tests/smoke/api-health.test.ts +0 -131
  1690. package/tsconfig.json +0 -17
  1691. package/vitest.config.ts +0 -50
  1692. /package/dist/{browser.test.d.ts → clis/gemini/deep-research-result.test.d.ts} +0 -0
  1693. /package/dist/{browser/cdp.test.d.ts → clis/gemini/deep-research.test.d.ts} +0 -0
  1694. /package/dist/{browser/daemon-client.test.d.ts → clis/hupu/mentions.d.ts} +0 -0
  1695. /package/dist/{browser/dom-helpers.test.d.ts → clis/lesswrong/comments.d.ts} +0 -0
  1696. /package/dist/{browser/page.test.d.ts → clis/lesswrong/curated.d.ts} +0 -0
  1697. /package/dist/{browser/stealth.test.d.ts → clis/lesswrong/frontpage.d.ts} +0 -0
  1698. /package/dist/{build-manifest.test.d.ts → clis/lesswrong/new.d.ts} +0 -0
  1699. /package/dist/{capabilityRouting.test.d.ts → clis/lesswrong/read.d.ts} +0 -0
  1700. /package/dist/{cli.test.d.ts → clis/lesswrong/sequences.d.ts} +0 -0
  1701. /package/dist/{commanderAdapter.test.d.ts → clis/lesswrong/shortform.d.ts} +0 -0
  1702. /package/dist/{commands/daemon.test.d.ts → clis/lesswrong/tag.d.ts} +0 -0
  1703. /package/dist/{completion.test.d.ts → clis/lesswrong/tags.d.ts} +0 -0
  1704. /package/dist/{daemon.test.d.ts → clis/lesswrong/top-month.d.ts} +0 -0
  1705. /package/dist/{doctor.test.d.ts → clis/lesswrong/top-week.d.ts} +0 -0
  1706. /package/dist/{download/index.test.d.ts → clis/lesswrong/top-year.d.ts} +0 -0
  1707. /package/dist/{electron-apps.test.d.ts → clis/lesswrong/top.d.ts} +0 -0
  1708. /package/dist/{engine.test.d.ts → clis/lesswrong/user-posts.d.ts} +0 -0
  1709. /package/dist/{errors.test.d.ts → clis/lesswrong/user.d.ts} +0 -0
  1710. /package/dist/{analysis.d.ts → src/analysis.d.ts} +0 -0
  1711. /package/dist/{analysis.js → src/analysis.js} +0 -0
  1712. /package/dist/{browser → src/browser}/base-page.d.ts +0 -0
  1713. /package/dist/{browser → src/browser}/base-page.js +0 -0
  1714. /package/dist/{browser → src/browser}/bridge.d.ts +0 -0
  1715. /package/dist/{browser → src/browser}/bridge.js +0 -0
  1716. /package/dist/{extension-manifest-regression.test.d.ts → src/browser/cdp.test.d.ts} +0 -0
  1717. /package/dist/{browser → src/browser}/cdp.test.js +0 -0
  1718. /package/dist/{browser → src/browser}/daemon-client.d.ts +0 -0
  1719. /package/dist/{browser → src/browser}/daemon-client.js +0 -0
  1720. /package/dist/{external.test.d.ts → src/browser/daemon-client.test.d.ts} +0 -0
  1721. /package/dist/{browser → src/browser}/daemon-client.test.js +0 -0
  1722. /package/dist/{browser → src/browser}/discover.d.ts +0 -0
  1723. /package/dist/{browser → src/browser}/discover.js +0 -0
  1724. /package/dist/{browser → src/browser}/dom-helpers.d.ts +0 -0
  1725. /package/dist/{browser → src/browser}/dom-helpers.js +0 -0
  1726. /package/dist/{launcher.test.d.ts → src/browser/dom-helpers.test.d.ts} +0 -0
  1727. /package/dist/{browser → src/browser}/dom-helpers.test.js +0 -0
  1728. /package/dist/{browser → src/browser}/dom-snapshot.d.ts +0 -0
  1729. /package/dist/{browser → src/browser}/dom-snapshot.js +0 -0
  1730. /package/dist/{browser → src/browser}/dom-snapshot.test.d.ts +0 -0
  1731. /package/dist/{browser → src/browser}/dom-snapshot.test.js +0 -0
  1732. /package/dist/{browser → src/browser}/errors.d.ts +0 -0
  1733. /package/dist/{browser → src/browser}/errors.js +0 -0
  1734. /package/dist/{browser → src/browser}/index.d.ts +0 -0
  1735. /package/dist/{browser → src/browser}/index.js +0 -0
  1736. /package/dist/{node-network.test.d.ts → src/browser/page.test.d.ts} +0 -0
  1737. /package/dist/{browser → src/browser}/page.test.js +0 -0
  1738. /package/dist/{browser → src/browser}/stealth.d.ts +0 -0
  1739. /package/dist/{browser → src/browser}/stealth.js +0 -0
  1740. /package/dist/{output.test.d.ts → src/browser/stealth.test.d.ts} +0 -0
  1741. /package/dist/{browser → src/browser}/stealth.test.js +0 -0
  1742. /package/dist/{browser → src/browser}/tabs.d.ts +0 -0
  1743. /package/dist/{browser → src/browser}/tabs.js +0 -0
  1744. /package/dist/{execution.test.d.ts → src/browser.test.d.ts} +0 -0
  1745. /package/dist/{browser.test.js → src/browser.test.js} +0 -0
  1746. /package/dist/{build-manifest.d.ts → src/build-manifest.d.ts} +0 -0
  1747. /package/dist/{pipeline/steps/download.test.d.ts → src/build-manifest.test.d.ts} +0 -0
  1748. /package/dist/{build-manifest.test.js → src/build-manifest.test.js} +0 -0
  1749. /package/dist/{capabilityRouting.d.ts → src/capabilityRouting.d.ts} +0 -0
  1750. /package/dist/{capabilityRouting.js → src/capabilityRouting.js} +0 -0
  1751. /package/dist/{pipeline/steps/fetch.test.d.ts → src/capabilityRouting.test.d.ts} +0 -0
  1752. /package/dist/{capabilityRouting.test.js → src/capabilityRouting.test.js} +0 -0
  1753. /package/dist/{cascade.d.ts → src/cascade.d.ts} +0 -0
  1754. /package/dist/{record.test.d.ts → src/cli.test.d.ts} +0 -0
  1755. /package/dist/{runtime-detect.test.d.ts → src/commanderAdapter.test.d.ts} +0 -0
  1756. /package/dist/{commanderAdapter.test.js → src/commanderAdapter.test.js} +0 -0
  1757. /package/dist/{commands → src/commands}/daemon.d.ts +0 -0
  1758. /package/dist/{commands → src/commands}/daemon.js +0 -0
  1759. /package/dist/{serialization.test.d.ts → src/commands/daemon.test.d.ts} +0 -0
  1760. /package/dist/{commands → src/commands}/daemon.test.js +0 -0
  1761. /package/dist/{completion.d.ts → src/completion.d.ts} +0 -0
  1762. /package/dist/{completion.js → src/completion.js} +0 -0
  1763. /package/dist/{tui.test.d.ts → src/completion.test.d.ts} +0 -0
  1764. /package/dist/{completion.test.js → src/completion.test.js} +0 -0
  1765. /package/dist/{constants.d.ts → src/constants.d.ts} +0 -0
  1766. /package/dist/{constants.js → src/constants.js} +0 -0
  1767. /package/dist/{daemon.d.ts → src/daemon.d.ts} +0 -0
  1768. /package/dist/{daemon.js → src/daemon.js} +0 -0
  1769. /package/dist/{weixin-download.test.d.ts → src/daemon.test.d.ts} +0 -0
  1770. /package/dist/{daemon.test.js → src/daemon.test.js} +0 -0
  1771. /package/dist/{doctor.d.ts → src/doctor.d.ts} +0 -0
  1772. /package/dist/{doctor.js → src/doctor.js} +0 -0
  1773. /package/dist/{doctor.test.js → src/doctor.test.js} +0 -0
  1774. /package/dist/{download → src/download}/index.test.js +0 -0
  1775. /package/dist/{electron-apps.d.ts → src/electron-apps.d.ts} +0 -0
  1776. /package/dist/{electron-apps.js → src/electron-apps.js} +0 -0
  1777. /package/dist/{electron-apps.test.js → src/electron-apps.test.js} +0 -0
  1778. /package/dist/{engine.test.js → src/engine.test.js} +0 -0
  1779. /package/dist/{errors.d.ts → src/errors.d.ts} +0 -0
  1780. /package/dist/{errors.js → src/errors.js} +0 -0
  1781. /package/dist/{errors.test.js → src/errors.test.js} +0 -0
  1782. /package/dist/{execution.d.ts → src/execution.d.ts} +0 -0
  1783. /package/dist/{execution.js → src/execution.js} +0 -0
  1784. /package/dist/{execution.test.js → src/execution.test.js} +0 -0
  1785. /package/dist/{explore.d.ts → src/explore.d.ts} +0 -0
  1786. /package/dist/{explore.js → src/explore.js} +0 -0
  1787. /package/dist/{extension-manifest-regression.test.js → src/extension-manifest-regression.test.js} +0 -0
  1788. /package/dist/{external-clis.yaml → src/external-clis.yaml} +0 -0
  1789. /package/dist/{external.d.ts → src/external.d.ts} +0 -0
  1790. /package/dist/{external.js → src/external.js} +0 -0
  1791. /package/dist/{external.test.js → src/external.test.js} +0 -0
  1792. /package/dist/{generate.d.ts → src/generate.d.ts} +0 -0
  1793. /package/dist/{generate.js → src/generate.js} +0 -0
  1794. /package/dist/{hooks.d.ts → src/hooks.d.ts} +0 -0
  1795. /package/dist/{hooks.js → src/hooks.js} +0 -0
  1796. /package/dist/{hooks.test.d.ts → src/hooks.test.d.ts} +0 -0
  1797. /package/dist/{hooks.test.js → src/hooks.test.js} +0 -0
  1798. /package/dist/{idle-manager.d.ts → src/idle-manager.d.ts} +0 -0
  1799. /package/dist/{idle-manager.js → src/idle-manager.js} +0 -0
  1800. /package/dist/{interceptor.test.d.ts → src/interceptor.test.d.ts} +0 -0
  1801. /package/dist/{interceptor.test.js → src/interceptor.test.js} +0 -0
  1802. /package/dist/{launcher.d.ts → src/launcher.d.ts} +0 -0
  1803. /package/dist/{launcher.js → src/launcher.js} +0 -0
  1804. /package/dist/{launcher.test.js → src/launcher.test.js} +0 -0
  1805. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  1806. /package/dist/{logger.js → src/logger.js} +0 -0
  1807. /package/dist/{main.d.ts → src/main.d.ts} +0 -0
  1808. /package/dist/{node-network.d.ts → src/node-network.d.ts} +0 -0
  1809. /package/dist/{node-network.js → src/node-network.js} +0 -0
  1810. /package/dist/{node-network.test.js → src/node-network.test.js} +0 -0
  1811. /package/dist/{output.d.ts → src/output.d.ts} +0 -0
  1812. /package/dist/{output.js → src/output.js} +0 -0
  1813. /package/dist/{output.test.js → src/output.test.js} +0 -0
  1814. /package/dist/{pipeline → src/pipeline}/executor.d.ts +0 -0
  1815. /package/dist/{pipeline → src/pipeline}/executor.js +0 -0
  1816. /package/dist/{pipeline → src/pipeline}/executor.test.d.ts +0 -0
  1817. /package/dist/{pipeline → src/pipeline}/executor.test.js +0 -0
  1818. /package/dist/{pipeline → src/pipeline}/registry.d.ts +0 -0
  1819. /package/dist/{pipeline → src/pipeline}/registry.js +0 -0
  1820. /package/dist/{pipeline → src/pipeline}/steps/browser.d.ts +0 -0
  1821. /package/dist/{pipeline → src/pipeline}/steps/browser.js +0 -0
  1822. /package/dist/{pipeline → src/pipeline}/steps/download.d.ts +0 -0
  1823. /package/dist/{pipeline → src/pipeline}/steps/download.js +0 -0
  1824. /package/dist/{pipeline → src/pipeline}/steps/download.test.js +0 -0
  1825. /package/dist/{pipeline → src/pipeline}/steps/fetch.d.ts +0 -0
  1826. /package/dist/{pipeline → src/pipeline}/steps/fetch.js +0 -0
  1827. /package/dist/{pipeline → src/pipeline}/steps/fetch.test.js +0 -0
  1828. /package/dist/{pipeline → src/pipeline}/steps/intercept.d.ts +0 -0
  1829. /package/dist/{pipeline → src/pipeline}/steps/intercept.js +0 -0
  1830. /package/dist/{pipeline → src/pipeline}/steps/tap.d.ts +0 -0
  1831. /package/dist/{pipeline → src/pipeline}/steps/tap.js +0 -0
  1832. /package/dist/{pipeline → src/pipeline}/steps/transform.d.ts +0 -0
  1833. /package/dist/{pipeline → src/pipeline}/steps/transform.js +0 -0
  1834. /package/dist/{pipeline → src/pipeline}/template.d.ts +0 -0
  1835. /package/dist/{pipeline → src/pipeline}/template.js +0 -0
  1836. /package/dist/{pipeline → src/pipeline}/template.test.d.ts +0 -0
  1837. /package/dist/{pipeline → src/pipeline}/template.test.js +0 -0
  1838. /package/dist/{pipeline → src/pipeline}/transform.test.d.ts +0 -0
  1839. /package/dist/{pipeline → src/pipeline}/transform.test.js +0 -0
  1840. /package/dist/{plugin-manifest.d.ts → src/plugin-manifest.d.ts} +0 -0
  1841. /package/dist/{plugin-manifest.js → src/plugin-manifest.js} +0 -0
  1842. /package/dist/{plugin-manifest.test.d.ts → src/plugin-manifest.test.d.ts} +0 -0
  1843. /package/dist/{plugin-manifest.test.js → src/plugin-manifest.test.js} +0 -0
  1844. /package/dist/{plugin-scaffold.d.ts → src/plugin-scaffold.d.ts} +0 -0
  1845. /package/dist/{plugin-scaffold.js → src/plugin-scaffold.js} +0 -0
  1846. /package/dist/{plugin-scaffold.test.d.ts → src/plugin-scaffold.test.d.ts} +0 -0
  1847. /package/dist/{plugin-scaffold.test.js → src/plugin-scaffold.test.js} +0 -0
  1848. /package/dist/{plugin.d.ts → src/plugin.d.ts} +0 -0
  1849. /package/dist/{plugin.js → src/plugin.js} +0 -0
  1850. /package/dist/{plugin.test.d.ts → src/plugin.test.d.ts} +0 -0
  1851. /package/dist/{plugin.test.js → src/plugin.test.js} +0 -0
  1852. /package/dist/{record.d.ts → src/record.d.ts} +0 -0
  1853. /package/dist/{record.test.js → src/record.test.js} +0 -0
  1854. /package/dist/{registry-api.d.ts → src/registry-api.d.ts} +0 -0
  1855. /package/dist/{registry-api.js → src/registry-api.js} +0 -0
  1856. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  1857. /package/dist/{registry.js → src/registry.js} +0 -0
  1858. /package/dist/{registry.test.d.ts → src/registry.test.d.ts} +0 -0
  1859. /package/dist/{registry.test.js → src/registry.test.js} +0 -0
  1860. /package/dist/{runtime-detect.d.ts → src/runtime-detect.d.ts} +0 -0
  1861. /package/dist/{runtime-detect.js → src/runtime-detect.js} +0 -0
  1862. /package/dist/{runtime-detect.test.js → src/runtime-detect.test.js} +0 -0
  1863. /package/dist/{runtime.d.ts → src/runtime.d.ts} +0 -0
  1864. /package/dist/{runtime.js → src/runtime.js} +0 -0
  1865. /package/dist/{scripts → src/scripts}/framework.d.ts +0 -0
  1866. /package/dist/{scripts → src/scripts}/framework.js +0 -0
  1867. /package/dist/{scripts → src/scripts}/interact.d.ts +0 -0
  1868. /package/dist/{scripts → src/scripts}/interact.js +0 -0
  1869. /package/dist/{scripts → src/scripts}/store.d.ts +0 -0
  1870. /package/dist/{scripts → src/scripts}/store.js +0 -0
  1871. /package/dist/{serialization.d.ts → src/serialization.d.ts} +0 -0
  1872. /package/dist/{serialization.js → src/serialization.js} +0 -0
  1873. /package/dist/{serialization.test.js → src/serialization.test.js} +0 -0
  1874. /package/dist/{snapshotFormatter.d.ts → src/snapshotFormatter.d.ts} +0 -0
  1875. /package/dist/{snapshotFormatter.js → src/snapshotFormatter.js} +0 -0
  1876. /package/dist/{snapshotFormatter.test.d.ts → src/snapshotFormatter.test.d.ts} +0 -0
  1877. /package/dist/{snapshotFormatter.test.js → src/snapshotFormatter.test.js} +0 -0
  1878. /package/dist/{tui.d.ts → src/tui.d.ts} +0 -0
  1879. /package/dist/{tui.js → src/tui.js} +0 -0
  1880. /package/dist/{tui.test.js → src/tui.test.js} +0 -0
  1881. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  1882. /package/dist/{types.js → src/types.js} +0 -0
  1883. /package/dist/{update-check.d.ts → src/update-check.d.ts} +0 -0
  1884. /package/dist/{update-check.js → src/update-check.js} +0 -0
  1885. /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
  1886. /package/dist/{utils.js → src/utils.js} +0 -0
  1887. /package/dist/{validate.d.ts → src/validate.d.ts} +0 -0
  1888. /package/dist/{validate.js → src/validate.js} +0 -0
  1889. /package/dist/{verify.d.ts → src/verify.d.ts} +0 -0
  1890. /package/dist/{verify.js → src/verify.js} +0 -0
  1891. /package/dist/{version.d.ts → src/version.d.ts} +0 -0
  1892. /package/dist/{version.js → src/version.js} +0 -0
  1893. /package/dist/{yaml-schema.d.ts → src/yaml-schema.d.ts} +0 -0
  1894. /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
- };