@hasna/connectors 0.0.1

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 (1269) hide show
  1. package/README.md +304 -0
  2. package/bin/index.js +5281 -0
  3. package/connectors/connect-anthropic/.env.example +4 -0
  4. package/connectors/connect-anthropic/.npmrc.example +2 -0
  5. package/connectors/connect-anthropic/AGENTS.md +97 -0
  6. package/connectors/connect-anthropic/CLAUDE.md +97 -0
  7. package/connectors/connect-anthropic/GEMINI.md +97 -0
  8. package/connectors/connect-anthropic/README.md +106 -0
  9. package/connectors/connect-anthropic/package.json +60 -0
  10. package/connectors/connect-anthropic/src/api/client.ts +122 -0
  11. package/connectors/connect-anthropic/src/api/index.ts +51 -0
  12. package/connectors/connect-anthropic/src/api/messages.ts +109 -0
  13. package/connectors/connect-anthropic/src/cli/index.ts +336 -0
  14. package/connectors/connect-anthropic/src/index.ts +24 -0
  15. package/connectors/connect-anthropic/src/types/index.ts +198 -0
  16. package/connectors/connect-anthropic/src/utils/config.ts +208 -0
  17. package/connectors/connect-anthropic/src/utils/output.ts +119 -0
  18. package/connectors/connect-anthropic/tsconfig.json +16 -0
  19. package/connectors/connect-aws/.env.example +11 -0
  20. package/connectors/connect-aws/.npmrc.example +2 -0
  21. package/connectors/connect-aws/AGENTS.md +145 -0
  22. package/connectors/connect-aws/CLAUDE.md +145 -0
  23. package/connectors/connect-aws/GEMINI.md +145 -0
  24. package/connectors/connect-aws/README.md +131 -0
  25. package/connectors/connect-aws/package.json +51 -0
  26. package/connectors/connect-aws/src/api/client.ts +349 -0
  27. package/connectors/connect-aws/src/api/dynamodb.ts +542 -0
  28. package/connectors/connect-aws/src/api/index.ts +71 -0
  29. package/connectors/connect-aws/src/api/lambda.ts +326 -0
  30. package/connectors/connect-aws/src/api/s3.ts +305 -0
  31. package/connectors/connect-aws/src/cli/index.ts +614 -0
  32. package/connectors/connect-aws/src/index.ts +28 -0
  33. package/connectors/connect-aws/src/types/index.ts +276 -0
  34. package/connectors/connect-aws/src/utils/config.ts +230 -0
  35. package/connectors/connect-aws/src/utils/output.ts +119 -0
  36. package/connectors/connect-aws/tsconfig.json +16 -0
  37. package/connectors/connect-brandsight/.env.example +8 -0
  38. package/connectors/connect-brandsight/.npmrc.example +2 -0
  39. package/connectors/connect-brandsight/AGENTS.md +128 -0
  40. package/connectors/connect-brandsight/CLAUDE.md +128 -0
  41. package/connectors/connect-brandsight/GEMINI.md +128 -0
  42. package/connectors/connect-brandsight/README.md +129 -0
  43. package/connectors/connect-brandsight/package.json +56 -0
  44. package/connectors/connect-brandsight/src/api/client.ts +171 -0
  45. package/connectors/connect-brandsight/src/api/domains.ts +387 -0
  46. package/connectors/connect-brandsight/src/api/example.ts +59 -0
  47. package/connectors/connect-brandsight/src/api/index.ts +50 -0
  48. package/connectors/connect-brandsight/src/cli/index.ts +775 -0
  49. package/connectors/connect-brandsight/src/index.ts +11 -0
  50. package/connectors/connect-brandsight/src/types/index.ts +197 -0
  51. package/connectors/connect-brandsight/src/utils/config.ts +244 -0
  52. package/connectors/connect-brandsight/src/utils/contacts.ts +204 -0
  53. package/connectors/connect-brandsight/src/utils/output.ts +119 -0
  54. package/connectors/connect-brandsight/tsconfig.json +29 -0
  55. package/connectors/connect-browseruse/.env.example +7 -0
  56. package/connectors/connect-browseruse/.npmrc.example +2 -0
  57. package/connectors/connect-browseruse/AGENTS.md +172 -0
  58. package/connectors/connect-browseruse/CLAUDE.md +172 -0
  59. package/connectors/connect-browseruse/GEMINI.md +172 -0
  60. package/connectors/connect-browseruse/README.md +153 -0
  61. package/connectors/connect-browseruse/package.json +52 -0
  62. package/connectors/connect-browseruse/src/api/billing.ts +32 -0
  63. package/connectors/connect-browseruse/src/api/browsers.ts +50 -0
  64. package/connectors/connect-browseruse/src/api/client.ts +168 -0
  65. package/connectors/connect-browseruse/src/api/files.ts +70 -0
  66. package/connectors/connect-browseruse/src/api/index.ts +95 -0
  67. package/connectors/connect-browseruse/src/api/profiles.ts +59 -0
  68. package/connectors/connect-browseruse/src/api/sessions.ts +88 -0
  69. package/connectors/connect-browseruse/src/api/skills.ts +194 -0
  70. package/connectors/connect-browseruse/src/api/tasks.ts +127 -0
  71. package/connectors/connect-browseruse/src/cli/index.ts +888 -0
  72. package/connectors/connect-browseruse/src/index.ts +35 -0
  73. package/connectors/connect-browseruse/src/types/index.ts +312 -0
  74. package/connectors/connect-browseruse/src/utils/config.ts +212 -0
  75. package/connectors/connect-browseruse/src/utils/output.ts +119 -0
  76. package/connectors/connect-browseruse/tsconfig.json +16 -0
  77. package/connectors/connect-cloudflare/.env.example +10 -0
  78. package/connectors/connect-cloudflare/.npmrc.example +2 -0
  79. package/connectors/connect-cloudflare/AGENTS.md +84 -0
  80. package/connectors/connect-cloudflare/CLAUDE.md +84 -0
  81. package/connectors/connect-cloudflare/GEMINI.md +84 -0
  82. package/connectors/connect-cloudflare/README.md +94 -0
  83. package/connectors/connect-cloudflare/package.json +59 -0
  84. package/connectors/connect-cloudflare/scripts/init.sh +62 -0
  85. package/connectors/connect-cloudflare/src/api/accounts.ts +352 -0
  86. package/connectors/connect-cloudflare/src/api/analytics.ts +638 -0
  87. package/connectors/connect-cloudflare/src/api/bulk.ts +1104 -0
  88. package/connectors/connect-cloudflare/src/api/cache.ts +192 -0
  89. package/connectors/connect-cloudflare/src/api/client.ts +201 -0
  90. package/connectors/connect-cloudflare/src/api/dns.ts +109 -0
  91. package/connectors/connect-cloudflare/src/api/firewall.ts +405 -0
  92. package/connectors/connect-cloudflare/src/api/index.ts +150 -0
  93. package/connectors/connect-cloudflare/src/api/kv.ts +171 -0
  94. package/connectors/connect-cloudflare/src/api/pages.ts +241 -0
  95. package/connectors/connect-cloudflare/src/api/r2.ts +270 -0
  96. package/connectors/connect-cloudflare/src/api/ssl.ts +416 -0
  97. package/connectors/connect-cloudflare/src/api/workers.ts +235 -0
  98. package/connectors/connect-cloudflare/src/api/zones.ts +121 -0
  99. package/connectors/connect-cloudflare/src/cli/index.ts +1644 -0
  100. package/connectors/connect-cloudflare/src/index.ts +21 -0
  101. package/connectors/connect-cloudflare/src/types/index.ts +754 -0
  102. package/connectors/connect-cloudflare/src/utils/config.ts +365 -0
  103. package/connectors/connect-cloudflare/src/utils/output.ts +119 -0
  104. package/connectors/connect-cloudflare/tsconfig.json +29 -0
  105. package/connectors/connect-discord/.env.example +9 -0
  106. package/connectors/connect-discord/.npmrc.example +2 -0
  107. package/connectors/connect-discord/AGENTS.md +187 -0
  108. package/connectors/connect-discord/CLAUDE.md +187 -0
  109. package/connectors/connect-discord/GEMINI.md +187 -0
  110. package/connectors/connect-discord/README.md +158 -0
  111. package/connectors/connect-discord/package.json +55 -0
  112. package/connectors/connect-discord/src/api/channels.ts +451 -0
  113. package/connectors/connect-discord/src/api/client.ts +147 -0
  114. package/connectors/connect-discord/src/api/commands.ts +212 -0
  115. package/connectors/connect-discord/src/api/gateway.ts +27 -0
  116. package/connectors/connect-discord/src/api/guilds.ts +434 -0
  117. package/connectors/connect-discord/src/api/index.ts +82 -0
  118. package/connectors/connect-discord/src/api/invites.ts +27 -0
  119. package/connectors/connect-discord/src/api/users.ts +66 -0
  120. package/connectors/connect-discord/src/api/webhooks.ts +188 -0
  121. package/connectors/connect-discord/src/cli/index.ts +788 -0
  122. package/connectors/connect-discord/src/index.ts +35 -0
  123. package/connectors/connect-discord/src/types/index.ts +545 -0
  124. package/connectors/connect-discord/src/utils/config.ts +219 -0
  125. package/connectors/connect-discord/src/utils/output.ts +119 -0
  126. package/connectors/connect-discord/tsconfig.json +16 -0
  127. package/connectors/connect-docker/.env.example +11 -0
  128. package/connectors/connect-docker/.npmrc.example +2 -0
  129. package/connectors/connect-docker/AGENTS.md +112 -0
  130. package/connectors/connect-docker/CLAUDE.md +112 -0
  131. package/connectors/connect-docker/GEMINI.md +112 -0
  132. package/connectors/connect-docker/README.md +97 -0
  133. package/connectors/connect-docker/package.json +57 -0
  134. package/connectors/connect-docker/src/api/client.ts +181 -0
  135. package/connectors/connect-docker/src/api/example.ts +79 -0
  136. package/connectors/connect-docker/src/api/index.ts +63 -0
  137. package/connectors/connect-docker/src/cli/index.ts +318 -0
  138. package/connectors/connect-docker/src/index.ts +30 -0
  139. package/connectors/connect-docker/src/types/index.ts +172 -0
  140. package/connectors/connect-docker/src/utils/config.ts +238 -0
  141. package/connectors/connect-docker/src/utils/output.ts +119 -0
  142. package/connectors/connect-docker/tsconfig.json +16 -0
  143. package/connectors/connect-e2b/.env.example +7 -0
  144. package/connectors/connect-e2b/.npmrc.example +2 -0
  145. package/connectors/connect-e2b/AGENTS.md +126 -0
  146. package/connectors/connect-e2b/CLAUDE.md +126 -0
  147. package/connectors/connect-e2b/GEMINI.md +126 -0
  148. package/connectors/connect-e2b/README.md +135 -0
  149. package/connectors/connect-e2b/package.json +51 -0
  150. package/connectors/connect-e2b/src/api/client.ts +150 -0
  151. package/connectors/connect-e2b/src/api/code.ts +188 -0
  152. package/connectors/connect-e2b/src/api/filesystem.ts +168 -0
  153. package/connectors/connect-e2b/src/api/index.ts +131 -0
  154. package/connectors/connect-e2b/src/api/sandbox.ts +91 -0
  155. package/connectors/connect-e2b/src/cli/index.ts +481 -0
  156. package/connectors/connect-e2b/src/index.ts +28 -0
  157. package/connectors/connect-e2b/src/types/index.ts +136 -0
  158. package/connectors/connect-e2b/src/utils/config.ts +231 -0
  159. package/connectors/connect-e2b/src/utils/output.ts +119 -0
  160. package/connectors/connect-e2b/tsconfig.json +16 -0
  161. package/connectors/connect-elevenlabs/.env.example +15 -0
  162. package/connectors/connect-elevenlabs/.npmrc.example +2 -0
  163. package/connectors/connect-elevenlabs/AGENTS.md +80 -0
  164. package/connectors/connect-elevenlabs/CLAUDE.md +80 -0
  165. package/connectors/connect-elevenlabs/GEMINI.md +80 -0
  166. package/connectors/connect-elevenlabs/README.md +98 -0
  167. package/connectors/connect-elevenlabs/package.json +57 -0
  168. package/connectors/connect-elevenlabs/src/api/client.ts +175 -0
  169. package/connectors/connect-elevenlabs/src/api/history.ts +103 -0
  170. package/connectors/connect-elevenlabs/src/api/index.ts +101 -0
  171. package/connectors/connect-elevenlabs/src/api/models.ts +49 -0
  172. package/connectors/connect-elevenlabs/src/api/sound-effects.ts +62 -0
  173. package/connectors/connect-elevenlabs/src/api/sts.ts +109 -0
  174. package/connectors/connect-elevenlabs/src/api/stt.ts +93 -0
  175. package/connectors/connect-elevenlabs/src/api/tts.ts +175 -0
  176. package/connectors/connect-elevenlabs/src/api/user.ts +43 -0
  177. package/connectors/connect-elevenlabs/src/api/voices.ts +169 -0
  178. package/connectors/connect-elevenlabs/src/cli/index.ts +739 -0
  179. package/connectors/connect-elevenlabs/src/index.ts +40 -0
  180. package/connectors/connect-elevenlabs/src/types/index.ts +432 -0
  181. package/connectors/connect-elevenlabs/src/utils/config.ts +242 -0
  182. package/connectors/connect-elevenlabs/src/utils/output.ts +119 -0
  183. package/connectors/connect-elevenlabs/tsconfig.json +16 -0
  184. package/connectors/connect-exa/.npmrc.example +2 -0
  185. package/connectors/connect-exa/AGENTS.md +76 -0
  186. package/connectors/connect-exa/CLAUDE.md +76 -0
  187. package/connectors/connect-exa/GEMINI.md +76 -0
  188. package/connectors/connect-exa/README.md +94 -0
  189. package/connectors/connect-exa/package.json +59 -0
  190. package/connectors/connect-exa/src/api/answer.ts +150 -0
  191. package/connectors/connect-exa/src/api/client.ts +171 -0
  192. package/connectors/connect-exa/src/api/contents.ts +150 -0
  193. package/connectors/connect-exa/src/api/context.ts +84 -0
  194. package/connectors/connect-exa/src/api/index.ts +77 -0
  195. package/connectors/connect-exa/src/api/research.ts +154 -0
  196. package/connectors/connect-exa/src/api/search.ts +153 -0
  197. package/connectors/connect-exa/src/api/similar.ts +138 -0
  198. package/connectors/connect-exa/src/api/team.ts +165 -0
  199. package/connectors/connect-exa/src/api/websets.ts +228 -0
  200. package/connectors/connect-exa/src/cli/index.ts +813 -0
  201. package/connectors/connect-exa/src/index.ts +32 -0
  202. package/connectors/connect-exa/src/types/index.ts +410 -0
  203. package/connectors/connect-exa/src/utils/config.ts +336 -0
  204. package/connectors/connect-exa/src/utils/output.ts +119 -0
  205. package/connectors/connect-exa/tsconfig.json +21 -0
  206. package/connectors/connect-figma/.npmrc.example +2 -0
  207. package/connectors/connect-figma/AGENTS.md +185 -0
  208. package/connectors/connect-figma/CLAUDE.md +185 -0
  209. package/connectors/connect-figma/GEMINI.md +185 -0
  210. package/connectors/connect-figma/README.md +164 -0
  211. package/connectors/connect-figma/package.json +50 -0
  212. package/connectors/connect-figma/src/api/client.ts +111 -0
  213. package/connectors/connect-figma/src/api/comments.ts +114 -0
  214. package/connectors/connect-figma/src/api/components.ts +82 -0
  215. package/connectors/connect-figma/src/api/devresources.ts +78 -0
  216. package/connectors/connect-figma/src/api/files.ts +132 -0
  217. package/connectors/connect-figma/src/api/index.ts +86 -0
  218. package/connectors/connect-figma/src/api/projects.ts +36 -0
  219. package/connectors/connect-figma/src/api/styles.ts +46 -0
  220. package/connectors/connect-figma/src/api/teams.ts +17 -0
  221. package/connectors/connect-figma/src/api/users.ts +16 -0
  222. package/connectors/connect-figma/src/api/variables.ts +73 -0
  223. package/connectors/connect-figma/src/api/webhooks.ts +97 -0
  224. package/connectors/connect-figma/src/cli/index.ts +960 -0
  225. package/connectors/connect-figma/src/index.ts +34 -0
  226. package/connectors/connect-figma/src/types/index.ts +593 -0
  227. package/connectors/connect-figma/src/utils/config.ts +197 -0
  228. package/connectors/connect-figma/src/utils/output.ts +119 -0
  229. package/connectors/connect-figma/tsconfig.json +16 -0
  230. package/connectors/connect-firecrawl/.env.example +7 -0
  231. package/connectors/connect-firecrawl/.npmrc.example +2 -0
  232. package/connectors/connect-firecrawl/AGENTS.md +104 -0
  233. package/connectors/connect-firecrawl/CLAUDE.md +104 -0
  234. package/connectors/connect-firecrawl/GEMINI.md +104 -0
  235. package/connectors/connect-firecrawl/README.md +95 -0
  236. package/connectors/connect-firecrawl/package.json +51 -0
  237. package/connectors/connect-firecrawl/src/api/client.ts +123 -0
  238. package/connectors/connect-firecrawl/src/api/crawl.ts +93 -0
  239. package/connectors/connect-firecrawl/src/api/index.ts +61 -0
  240. package/connectors/connect-firecrawl/src/api/map.ts +51 -0
  241. package/connectors/connect-firecrawl/src/api/scrape.ts +71 -0
  242. package/connectors/connect-firecrawl/src/api/search.ts +61 -0
  243. package/connectors/connect-firecrawl/src/cli/index.ts +432 -0
  244. package/connectors/connect-firecrawl/src/index.ts +24 -0
  245. package/connectors/connect-firecrawl/src/types/index.ts +216 -0
  246. package/connectors/connect-firecrawl/src/utils/config.ts +208 -0
  247. package/connectors/connect-firecrawl/src/utils/output.ts +119 -0
  248. package/connectors/connect-firecrawl/tsconfig.json +16 -0
  249. package/connectors/connect-github/.env.example +11 -0
  250. package/connectors/connect-github/.npmrc.example +2 -0
  251. package/connectors/connect-github/AGENTS.md +150 -0
  252. package/connectors/connect-github/CLAUDE.md +150 -0
  253. package/connectors/connect-github/GEMINI.md +150 -0
  254. package/connectors/connect-github/README.md +126 -0
  255. package/connectors/connect-github/package.json +49 -0
  256. package/connectors/connect-github/src/api/client.ts +137 -0
  257. package/connectors/connect-github/src/api/index.ts +62 -0
  258. package/connectors/connect-github/src/api/issues.ts +186 -0
  259. package/connectors/connect-github/src/api/pulls.ts +284 -0
  260. package/connectors/connect-github/src/api/repos.ts +155 -0
  261. package/connectors/connect-github/src/api/users.ts +139 -0
  262. package/connectors/connect-github/src/cli/index.ts +732 -0
  263. package/connectors/connect-github/src/index.ts +24 -0
  264. package/connectors/connect-github/src/types/index.ts +497 -0
  265. package/connectors/connect-github/src/utils/config.ts +208 -0
  266. package/connectors/connect-github/src/utils/output.ts +119 -0
  267. package/connectors/connect-github/tsconfig.json +16 -0
  268. package/connectors/connect-gmail/.env.example +8 -0
  269. package/connectors/connect-gmail/.npmrc.example +2 -0
  270. package/connectors/connect-gmail/AGENTS.md +79 -0
  271. package/connectors/connect-gmail/CLAUDE.md +79 -0
  272. package/connectors/connect-gmail/GEMINI.md +79 -0
  273. package/connectors/connect-gmail/README.md +97 -0
  274. package/connectors/connect-gmail/package.json +58 -0
  275. package/connectors/connect-gmail/src/api/attachments.ts +141 -0
  276. package/connectors/connect-gmail/src/api/bulk.ts +661 -0
  277. package/connectors/connect-gmail/src/api/client.ts +131 -0
  278. package/connectors/connect-gmail/src/api/drafts.ts +198 -0
  279. package/connectors/connect-gmail/src/api/export.ts +312 -0
  280. package/connectors/connect-gmail/src/api/filters.ts +127 -0
  281. package/connectors/connect-gmail/src/api/index.ts +63 -0
  282. package/connectors/connect-gmail/src/api/labels.ts +123 -0
  283. package/connectors/connect-gmail/src/api/messages.ts +527 -0
  284. package/connectors/connect-gmail/src/api/profile.ts +72 -0
  285. package/connectors/connect-gmail/src/api/threads.ts +85 -0
  286. package/connectors/connect-gmail/src/cli/index.ts +2143 -0
  287. package/connectors/connect-gmail/src/index.ts +30 -0
  288. package/connectors/connect-gmail/src/types/index.ts +202 -0
  289. package/connectors/connect-gmail/src/utils/auth.ts +247 -0
  290. package/connectors/connect-gmail/src/utils/config.ts +466 -0
  291. package/connectors/connect-gmail/src/utils/contacts.ts +147 -0
  292. package/connectors/connect-gmail/src/utils/markdown.ts +110 -0
  293. package/connectors/connect-gmail/src/utils/output.ts +119 -0
  294. package/connectors/connect-gmail/src/utils/settings.ts +87 -0
  295. package/connectors/connect-gmail/tsconfig.json +16 -0
  296. package/connectors/connect-google/.env.example +10 -0
  297. package/connectors/connect-google/.npmrc.example +2 -0
  298. package/connectors/connect-google/AGENTS.md +76 -0
  299. package/connectors/connect-google/CLAUDE.md +76 -0
  300. package/connectors/connect-google/GEMINI.md +76 -0
  301. package/connectors/connect-google/README.md +94 -0
  302. package/connectors/connect-google/package.json +60 -0
  303. package/connectors/connect-google/src/api/calendar.ts +339 -0
  304. package/connectors/connect-google/src/api/client.ts +201 -0
  305. package/connectors/connect-google/src/api/docs.ts +372 -0
  306. package/connectors/connect-google/src/api/drive.ts +370 -0
  307. package/connectors/connect-google/src/api/gmail.ts +338 -0
  308. package/connectors/connect-google/src/api/index.ts +66 -0
  309. package/connectors/connect-google/src/api/sheets.ts +343 -0
  310. package/connectors/connect-google/src/cli/index.ts +1232 -0
  311. package/connectors/connect-google/src/index.ts +27 -0
  312. package/connectors/connect-google/src/types/index.ts +1893 -0
  313. package/connectors/connect-google/src/utils/config.ts +248 -0
  314. package/connectors/connect-google/src/utils/output.ts +119 -0
  315. package/connectors/connect-google/tsconfig.json +21 -0
  316. package/connectors/connect-googlecalendar/.npmrc.example +2 -0
  317. package/connectors/connect-googlecalendar/AGENTS.md +117 -0
  318. package/connectors/connect-googlecalendar/CLAUDE.md +117 -0
  319. package/connectors/connect-googlecalendar/GEMINI.md +117 -0
  320. package/connectors/connect-googlecalendar/README.md +97 -0
  321. package/connectors/connect-googlecalendar/package.json +57 -0
  322. package/connectors/connect-googlecalendar/src/api/calendars.ts +106 -0
  323. package/connectors/connect-googlecalendar/src/api/client.ts +266 -0
  324. package/connectors/connect-googlecalendar/src/api/events.ts +266 -0
  325. package/connectors/connect-googlecalendar/src/api/index.ts +96 -0
  326. package/connectors/connect-googlecalendar/src/cli/index.ts +819 -0
  327. package/connectors/connect-googlecalendar/src/index.ts +30 -0
  328. package/connectors/connect-googlecalendar/src/types/index.ts +347 -0
  329. package/connectors/connect-googlecalendar/src/utils/config.ts +251 -0
  330. package/connectors/connect-googlecalendar/src/utils/output.ts +119 -0
  331. package/connectors/connect-googlecalendar/tsconfig.json +16 -0
  332. package/connectors/connect-googlecloud/.env.example +11 -0
  333. package/connectors/connect-googlecloud/.npmrc.example +2 -0
  334. package/connectors/connect-googlecloud/AGENTS.md +110 -0
  335. package/connectors/connect-googlecloud/CLAUDE.md +110 -0
  336. package/connectors/connect-googlecloud/GEMINI.md +110 -0
  337. package/connectors/connect-googlecloud/README.md +96 -0
  338. package/connectors/connect-googlecloud/package.json +56 -0
  339. package/connectors/connect-googlecloud/src/api/client.ts +208 -0
  340. package/connectors/connect-googlecloud/src/api/index.ts +53 -0
  341. package/connectors/connect-googlecloud/src/api/projects.ts +75 -0
  342. package/connectors/connect-googlecloud/src/cli/index.ts +305 -0
  343. package/connectors/connect-googlecloud/src/index.ts +28 -0
  344. package/connectors/connect-googlecloud/src/types/index.ts +100 -0
  345. package/connectors/connect-googlecloud/src/utils/config.ts +232 -0
  346. package/connectors/connect-googlecloud/src/utils/output.ts +119 -0
  347. package/connectors/connect-googlecloud/tsconfig.json +16 -0
  348. package/connectors/connect-googlecontacts/.npmrc.example +2 -0
  349. package/connectors/connect-googlecontacts/AGENTS.md +181 -0
  350. package/connectors/connect-googlecontacts/CLAUDE.md +181 -0
  351. package/connectors/connect-googlecontacts/GEMINI.md +181 -0
  352. package/connectors/connect-googlecontacts/README.md +117 -0
  353. package/connectors/connect-googlecontacts/package.json +56 -0
  354. package/connectors/connect-googlecontacts/src/api/client.ts +306 -0
  355. package/connectors/connect-googlecontacts/src/api/contacts.ts +236 -0
  356. package/connectors/connect-googlecontacts/src/api/index.ts +99 -0
  357. package/connectors/connect-googlecontacts/src/cli/index.ts +654 -0
  358. package/connectors/connect-googlecontacts/src/index.ts +34 -0
  359. package/connectors/connect-googlecontacts/src/types/index.ts +254 -0
  360. package/connectors/connect-googlecontacts/src/utils/config.ts +337 -0
  361. package/connectors/connect-googlecontacts/src/utils/output.ts +119 -0
  362. package/connectors/connect-googlecontacts/tsconfig.json +16 -0
  363. package/connectors/connect-googledocs/.env.example +11 -0
  364. package/connectors/connect-googledocs/.npmrc.example +2 -0
  365. package/connectors/connect-googledocs/AGENTS.md +130 -0
  366. package/connectors/connect-googledocs/CLAUDE.md +130 -0
  367. package/connectors/connect-googledocs/GEMINI.md +130 -0
  368. package/connectors/connect-googledocs/README.md +112 -0
  369. package/connectors/connect-googledocs/package.json +50 -0
  370. package/connectors/connect-googledocs/src/api/client.ts +159 -0
  371. package/connectors/connect-googledocs/src/api/content.ts +219 -0
  372. package/connectors/connect-googledocs/src/api/documents.ts +52 -0
  373. package/connectors/connect-googledocs/src/api/index.ts +65 -0
  374. package/connectors/connect-googledocs/src/api/styles.ts +386 -0
  375. package/connectors/connect-googledocs/src/cli/index.ts +364 -0
  376. package/connectors/connect-googledocs/src/index.ts +24 -0
  377. package/connectors/connect-googledocs/src/types/index.ts +767 -0
  378. package/connectors/connect-googledocs/src/utils/config.ts +208 -0
  379. package/connectors/connect-googledocs/src/utils/output.ts +119 -0
  380. package/connectors/connect-googledocs/tsconfig.json +16 -0
  381. package/connectors/connect-googledrive/.npmrc.example +2 -0
  382. package/connectors/connect-googledrive/AGENTS.md +76 -0
  383. package/connectors/connect-googledrive/CLAUDE.md +76 -0
  384. package/connectors/connect-googledrive/GEMINI.md +76 -0
  385. package/connectors/connect-googledrive/README.md +94 -0
  386. package/connectors/connect-googledrive/package.json +55 -0
  387. package/connectors/connect-googledrive/src/api/client.ts +216 -0
  388. package/connectors/connect-googledrive/src/api/drives.ts +186 -0
  389. package/connectors/connect-googledrive/src/api/files.ts +305 -0
  390. package/connectors/connect-googledrive/src/api/folders.ts +133 -0
  391. package/connectors/connect-googledrive/src/api/index.ts +47 -0
  392. package/connectors/connect-googledrive/src/api/storage.ts +48 -0
  393. package/connectors/connect-googledrive/src/api/trash.ts +47 -0
  394. package/connectors/connect-googledrive/src/cli/index.ts +933 -0
  395. package/connectors/connect-googledrive/src/index.ts +30 -0
  396. package/connectors/connect-googledrive/src/types/index.ts +378 -0
  397. package/connectors/connect-googledrive/src/utils/auth.ts +207 -0
  398. package/connectors/connect-googledrive/src/utils/config.ts +440 -0
  399. package/connectors/connect-googledrive/src/utils/output.ts +135 -0
  400. package/connectors/connect-googledrive/tsconfig.json +25 -0
  401. package/connectors/connect-googlegemini/.env.example +7 -0
  402. package/connectors/connect-googlegemini/.npmrc.example +2 -0
  403. package/connectors/connect-googlegemini/AGENTS.md +184 -0
  404. package/connectors/connect-googlegemini/CLAUDE.md +184 -0
  405. package/connectors/connect-googlegemini/GEMINI.md +184 -0
  406. package/connectors/connect-googlegemini/README.md +143 -0
  407. package/connectors/connect-googlegemini/package.json +55 -0
  408. package/connectors/connect-googlegemini/src/api/client.ts +219 -0
  409. package/connectors/connect-googlegemini/src/api/embeddings.ts +142 -0
  410. package/connectors/connect-googlegemini/src/api/files.ts +152 -0
  411. package/connectors/connect-googlegemini/src/api/generate.ts +187 -0
  412. package/connectors/connect-googlegemini/src/api/images.ts +216 -0
  413. package/connectors/connect-googlegemini/src/api/index.ts +103 -0
  414. package/connectors/connect-googlegemini/src/api/models.ts +102 -0
  415. package/connectors/connect-googlegemini/src/api/speech.ts +195 -0
  416. package/connectors/connect-googlegemini/src/api/video.ts +224 -0
  417. package/connectors/connect-googlegemini/src/cli/index.ts +702 -0
  418. package/connectors/connect-googlegemini/src/index.ts +34 -0
  419. package/connectors/connect-googlegemini/src/types/index.ts +324 -0
  420. package/connectors/connect-googlegemini/src/utils/config.ts +139 -0
  421. package/connectors/connect-googlegemini/src/utils/output.ts +169 -0
  422. package/connectors/connect-googlegemini/tsconfig.json +15 -0
  423. package/connectors/connect-googlemaps/.npmrc.example +2 -0
  424. package/connectors/connect-googlemaps/AGENTS.md +143 -0
  425. package/connectors/connect-googlemaps/CLAUDE.md +143 -0
  426. package/connectors/connect-googlemaps/GEMINI.md +143 -0
  427. package/connectors/connect-googlemaps/README.md +152 -0
  428. package/connectors/connect-googlemaps/package.json +29 -0
  429. package/connectors/connect-googlemaps/src/api/index.ts +315 -0
  430. package/connectors/connect-googlemaps/src/cli/index.ts +423 -0
  431. package/connectors/connect-googlemaps/src/index.ts +3 -0
  432. package/connectors/connect-googlemaps/src/types/index.ts +268 -0
  433. package/connectors/connect-googlemaps/src/utils/config.ts +59 -0
  434. package/connectors/connect-googlemaps/src/utils/output.ts +178 -0
  435. package/connectors/connect-googlemaps/tsconfig.json +17 -0
  436. package/connectors/connect-googlesheets/.env.example +15 -0
  437. package/connectors/connect-googlesheets/.npmrc.example +2 -0
  438. package/connectors/connect-googlesheets/AGENTS.md +144 -0
  439. package/connectors/connect-googlesheets/CLAUDE.md +144 -0
  440. package/connectors/connect-googlesheets/GEMINI.md +144 -0
  441. package/connectors/connect-googlesheets/README.md +124 -0
  442. package/connectors/connect-googlesheets/package.json +51 -0
  443. package/connectors/connect-googlesheets/src/api/client.ts +230 -0
  444. package/connectors/connect-googlesheets/src/api/index.ts +113 -0
  445. package/connectors/connect-googlesheets/src/api/sheets.ts +249 -0
  446. package/connectors/connect-googlesheets/src/api/spreadsheets.ts +150 -0
  447. package/connectors/connect-googlesheets/src/api/values.ts +209 -0
  448. package/connectors/connect-googlesheets/src/cli/index.ts +544 -0
  449. package/connectors/connect-googlesheets/src/index.ts +32 -0
  450. package/connectors/connect-googlesheets/src/types/index.ts +764 -0
  451. package/connectors/connect-googlesheets/src/utils/config.ts +289 -0
  452. package/connectors/connect-googlesheets/src/utils/output.ts +119 -0
  453. package/connectors/connect-googlesheets/tsconfig.json +16 -0
  454. package/connectors/connect-googletasks/.env.example +6 -0
  455. package/connectors/connect-googletasks/.npmrc.example +2 -0
  456. package/connectors/connect-googletasks/AGENTS.md +122 -0
  457. package/connectors/connect-googletasks/CLAUDE.md +122 -0
  458. package/connectors/connect-googletasks/GEMINI.md +122 -0
  459. package/connectors/connect-googletasks/README.md +131 -0
  460. package/connectors/connect-googletasks/package.json +50 -0
  461. package/connectors/connect-googletasks/src/api/index.ts +321 -0
  462. package/connectors/connect-googletasks/src/cli/index.ts +542 -0
  463. package/connectors/connect-googletasks/src/index.ts +42 -0
  464. package/connectors/connect-googletasks/src/types/index.ts +167 -0
  465. package/connectors/connect-googletasks/src/utils/config.ts +287 -0
  466. package/connectors/connect-googletasks/src/utils/output.ts +145 -0
  467. package/connectors/connect-googletasks/tsconfig.json +16 -0
  468. package/connectors/connect-hedra/.env.example +7 -0
  469. package/connectors/connect-hedra/.npmrc.example +2 -0
  470. package/connectors/connect-hedra/AGENTS.md +101 -0
  471. package/connectors/connect-hedra/CLAUDE.md +101 -0
  472. package/connectors/connect-hedra/GEMINI.md +101 -0
  473. package/connectors/connect-hedra/README.md +95 -0
  474. package/connectors/connect-hedra/package.json +57 -0
  475. package/connectors/connect-hedra/src/api/characters.ts +44 -0
  476. package/connectors/connect-hedra/src/api/client.ts +136 -0
  477. package/connectors/connect-hedra/src/api/index.ts +57 -0
  478. package/connectors/connect-hedra/src/api/projects.ts +44 -0
  479. package/connectors/connect-hedra/src/api/voices.ts +23 -0
  480. package/connectors/connect-hedra/src/cli/index.ts +314 -0
  481. package/connectors/connect-hedra/src/index.ts +24 -0
  482. package/connectors/connect-hedra/src/types/index.ts +103 -0
  483. package/connectors/connect-hedra/src/utils/config.ts +211 -0
  484. package/connectors/connect-hedra/src/utils/output.ts +119 -0
  485. package/connectors/connect-hedra/tsconfig.json +16 -0
  486. package/connectors/connect-heygen/.env.example +11 -0
  487. package/connectors/connect-heygen/.npmrc.example +2 -0
  488. package/connectors/connect-heygen/AGENTS.md +102 -0
  489. package/connectors/connect-heygen/CLAUDE.md +102 -0
  490. package/connectors/connect-heygen/GEMINI.md +102 -0
  491. package/connectors/connect-heygen/README.md +96 -0
  492. package/connectors/connect-heygen/package.json +57 -0
  493. package/connectors/connect-heygen/src/api/client.ts +134 -0
  494. package/connectors/connect-heygen/src/api/example.ts +48 -0
  495. package/connectors/connect-heygen/src/api/index.ts +49 -0
  496. package/connectors/connect-heygen/src/cli/index.ts +242 -0
  497. package/connectors/connect-heygen/src/index.ts +24 -0
  498. package/connectors/connect-heygen/src/types/index.ts +69 -0
  499. package/connectors/connect-heygen/src/utils/config.ts +209 -0
  500. package/connectors/connect-heygen/src/utils/output.ts +119 -0
  501. package/connectors/connect-heygen/tsconfig.json +16 -0
  502. package/connectors/connect-huggingface/.env.example +10 -0
  503. package/connectors/connect-huggingface/.npmrc.example +2 -0
  504. package/connectors/connect-huggingface/AGENTS.md +113 -0
  505. package/connectors/connect-huggingface/CLAUDE.md +113 -0
  506. package/connectors/connect-huggingface/GEMINI.md +113 -0
  507. package/connectors/connect-huggingface/README.md +97 -0
  508. package/connectors/connect-huggingface/package.json +57 -0
  509. package/connectors/connect-huggingface/src/api/client.ts +136 -0
  510. package/connectors/connect-huggingface/src/api/example.ts +48 -0
  511. package/connectors/connect-huggingface/src/api/index.ts +49 -0
  512. package/connectors/connect-huggingface/src/cli/index.ts +243 -0
  513. package/connectors/connect-huggingface/src/index.ts +24 -0
  514. package/connectors/connect-huggingface/src/types/index.ts +69 -0
  515. package/connectors/connect-huggingface/src/utils/config.ts +211 -0
  516. package/connectors/connect-huggingface/src/utils/output.ts +119 -0
  517. package/connectors/connect-huggingface/tsconfig.json +16 -0
  518. package/connectors/connect-icons8/.env.example +7 -0
  519. package/connectors/connect-icons8/.npmrc.example +2 -0
  520. package/connectors/connect-icons8/AGENTS.md +101 -0
  521. package/connectors/connect-icons8/CLAUDE.md +101 -0
  522. package/connectors/connect-icons8/GEMINI.md +101 -0
  523. package/connectors/connect-icons8/README.md +95 -0
  524. package/connectors/connect-icons8/package.json +55 -0
  525. package/connectors/connect-icons8/src/api/client.ts +137 -0
  526. package/connectors/connect-icons8/src/api/example.ts +64 -0
  527. package/connectors/connect-icons8/src/api/index.ts +48 -0
  528. package/connectors/connect-icons8/src/cli/index.ts +286 -0
  529. package/connectors/connect-icons8/src/index.ts +24 -0
  530. package/connectors/connect-icons8/src/types/index.ts +114 -0
  531. package/connectors/connect-icons8/src/utils/config.ts +211 -0
  532. package/connectors/connect-icons8/src/utils/output.ts +119 -0
  533. package/connectors/connect-icons8/tsconfig.json +16 -0
  534. package/connectors/connect-maropost/.env.example +13 -0
  535. package/connectors/connect-maropost/.npmrc.example +2 -0
  536. package/connectors/connect-maropost/AGENTS.md +110 -0
  537. package/connectors/connect-maropost/CLAUDE.md +110 -0
  538. package/connectors/connect-maropost/GEMINI.md +110 -0
  539. package/connectors/connect-maropost/README.md +96 -0
  540. package/connectors/connect-maropost/package.json +51 -0
  541. package/connectors/connect-maropost/src/api/campaigns.ts +129 -0
  542. package/connectors/connect-maropost/src/api/client.ts +162 -0
  543. package/connectors/connect-maropost/src/api/contacts.ts +128 -0
  544. package/connectors/connect-maropost/src/api/index.ts +91 -0
  545. package/connectors/connect-maropost/src/api/journeys.ts +60 -0
  546. package/connectors/connect-maropost/src/api/lists.ts +80 -0
  547. package/connectors/connect-maropost/src/api/reports.ts +123 -0
  548. package/connectors/connect-maropost/src/api/transactional.ts +109 -0
  549. package/connectors/connect-maropost/src/cli/index.ts +958 -0
  550. package/connectors/connect-maropost/src/index.ts +33 -0
  551. package/connectors/connect-maropost/src/types/index.ts +340 -0
  552. package/connectors/connect-maropost/src/utils/config.ts +213 -0
  553. package/connectors/connect-maropost/src/utils/output.ts +119 -0
  554. package/connectors/connect-maropost/tsconfig.json +16 -0
  555. package/connectors/connect-mercury/.env.example +5 -0
  556. package/connectors/connect-mercury/.npmrc.example +2 -0
  557. package/connectors/connect-mercury/AGENTS.md +137 -0
  558. package/connectors/connect-mercury/CLAUDE.md +137 -0
  559. package/connectors/connect-mercury/GEMINI.md +137 -0
  560. package/connectors/connect-mercury/README.md +146 -0
  561. package/connectors/connect-mercury/package.json +60 -0
  562. package/connectors/connect-mercury/src/api/accounts.ts +79 -0
  563. package/connectors/connect-mercury/src/api/attachments.ts +24 -0
  564. package/connectors/connect-mercury/src/api/categories.ts +40 -0
  565. package/connectors/connect-mercury/src/api/client.ts +134 -0
  566. package/connectors/connect-mercury/src/api/credit.ts +38 -0
  567. package/connectors/connect-mercury/src/api/customers.ts +53 -0
  568. package/connectors/connect-mercury/src/api/events.ts +63 -0
  569. package/connectors/connect-mercury/src/api/index.ts +97 -0
  570. package/connectors/connect-mercury/src/api/invoices.ts +102 -0
  571. package/connectors/connect-mercury/src/api/organization.ts +88 -0
  572. package/connectors/connect-mercury/src/api/recipients.ts +84 -0
  573. package/connectors/connect-mercury/src/api/transactions.ts +128 -0
  574. package/connectors/connect-mercury/src/api/transfers.ts +96 -0
  575. package/connectors/connect-mercury/src/api/treasury.ts +82 -0
  576. package/connectors/connect-mercury/src/api/webhooks.ts +90 -0
  577. package/connectors/connect-mercury/src/cli/index.ts +1263 -0
  578. package/connectors/connect-mercury/src/index.ts +33 -0
  579. package/connectors/connect-mercury/src/types/index.ts +505 -0
  580. package/connectors/connect-mercury/src/utils/config.ts +393 -0
  581. package/connectors/connect-mercury/src/utils/output.ts +119 -0
  582. package/connectors/connect-mercury/tsconfig.json +16 -0
  583. package/connectors/connect-meta/.npmrc.example +2 -0
  584. package/connectors/connect-meta/AGENTS.md +76 -0
  585. package/connectors/connect-meta/CLAUDE.md +76 -0
  586. package/connectors/connect-meta/GEMINI.md +76 -0
  587. package/connectors/connect-meta/README.md +94 -0
  588. package/connectors/connect-meta/package.json +61 -0
  589. package/connectors/connect-meta/src/api/accounts.ts +120 -0
  590. package/connectors/connect-meta/src/api/ads.ts +274 -0
  591. package/connectors/connect-meta/src/api/adsets.ts +263 -0
  592. package/connectors/connect-meta/src/api/audiences.ts +392 -0
  593. package/connectors/connect-meta/src/api/business.ts +495 -0
  594. package/connectors/connect-meta/src/api/campaigns.ts +191 -0
  595. package/connectors/connect-meta/src/api/catalogs.ts +500 -0
  596. package/connectors/connect-meta/src/api/client.ts +154 -0
  597. package/connectors/connect-meta/src/api/creatives.ts +357 -0
  598. package/connectors/connect-meta/src/api/index.ts +100 -0
  599. package/connectors/connect-meta/src/api/insights.ts +357 -0
  600. package/connectors/connect-meta/src/api/instagram.ts +449 -0
  601. package/connectors/connect-meta/src/api/pages.ts +330 -0
  602. package/connectors/connect-meta/src/api/pixels.ts +408 -0
  603. package/connectors/connect-meta/src/cli/index.ts +1585 -0
  604. package/connectors/connect-meta/src/index.ts +44 -0
  605. package/connectors/connect-meta/src/types/index.ts +1523 -0
  606. package/connectors/connect-meta/src/utils/config.ts +458 -0
  607. package/connectors/connect-meta/src/utils/output.ts +152 -0
  608. package/connectors/connect-meta/tsconfig.json +18 -0
  609. package/connectors/connect-midjourney/.env.example +13 -0
  610. package/connectors/connect-midjourney/.npmrc.example +2 -0
  611. package/connectors/connect-midjourney/AGENTS.md +104 -0
  612. package/connectors/connect-midjourney/CLAUDE.md +104 -0
  613. package/connectors/connect-midjourney/GEMINI.md +104 -0
  614. package/connectors/connect-midjourney/README.md +96 -0
  615. package/connectors/connect-midjourney/package.json +57 -0
  616. package/connectors/connect-midjourney/src/api/client.ts +143 -0
  617. package/connectors/connect-midjourney/src/api/imagine.ts +84 -0
  618. package/connectors/connect-midjourney/src/api/index.ts +50 -0
  619. package/connectors/connect-midjourney/src/cli/index.ts +343 -0
  620. package/connectors/connect-midjourney/src/index.ts +24 -0
  621. package/connectors/connect-midjourney/src/types/index.ts +98 -0
  622. package/connectors/connect-midjourney/src/utils/config.ts +219 -0
  623. package/connectors/connect-midjourney/src/utils/output.ts +119 -0
  624. package/connectors/connect-midjourney/tsconfig.json +16 -0
  625. package/connectors/connect-mistral/.env.example +4 -0
  626. package/connectors/connect-mistral/.npmrc.example +2 -0
  627. package/connectors/connect-mistral/AGENTS.md +100 -0
  628. package/connectors/connect-mistral/CLAUDE.md +100 -0
  629. package/connectors/connect-mistral/GEMINI.md +100 -0
  630. package/connectors/connect-mistral/README.md +109 -0
  631. package/connectors/connect-mistral/package.json +60 -0
  632. package/connectors/connect-mistral/src/api/chat.ts +113 -0
  633. package/connectors/connect-mistral/src/api/client.ts +122 -0
  634. package/connectors/connect-mistral/src/api/embeddings.ts +52 -0
  635. package/connectors/connect-mistral/src/api/index.ts +62 -0
  636. package/connectors/connect-mistral/src/cli/index.ts +371 -0
  637. package/connectors/connect-mistral/src/index.ts +24 -0
  638. package/connectors/connect-mistral/src/types/index.ts +183 -0
  639. package/connectors/connect-mistral/src/utils/config.ts +208 -0
  640. package/connectors/connect-mistral/src/utils/output.ts +119 -0
  641. package/connectors/connect-mistral/tsconfig.json +16 -0
  642. package/connectors/connect-mixpanel/.env.example +8 -0
  643. package/connectors/connect-mixpanel/.npmrc.example +2 -0
  644. package/connectors/connect-mixpanel/AGENTS.md +178 -0
  645. package/connectors/connect-mixpanel/CLAUDE.md +178 -0
  646. package/connectors/connect-mixpanel/GEMINI.md +178 -0
  647. package/connectors/connect-mixpanel/README.md +149 -0
  648. package/connectors/connect-mixpanel/package.json +54 -0
  649. package/connectors/connect-mixpanel/src/api/client.ts +352 -0
  650. package/connectors/connect-mixpanel/src/api/engage.ts +209 -0
  651. package/connectors/connect-mixpanel/src/api/export.ts +122 -0
  652. package/connectors/connect-mixpanel/src/api/funnels.ts +136 -0
  653. package/connectors/connect-mixpanel/src/api/index.ts +97 -0
  654. package/connectors/connect-mixpanel/src/api/insights.ts +198 -0
  655. package/connectors/connect-mixpanel/src/api/retention.ts +139 -0
  656. package/connectors/connect-mixpanel/src/api/track.ts +69 -0
  657. package/connectors/connect-mixpanel/src/cli/index.ts +678 -0
  658. package/connectors/connect-mixpanel/src/index.ts +32 -0
  659. package/connectors/connect-mixpanel/src/types/index.ts +262 -0
  660. package/connectors/connect-mixpanel/src/utils/config.ts +255 -0
  661. package/connectors/connect-mixpanel/src/utils/output.ts +119 -0
  662. package/connectors/connect-mixpanel/tsconfig.json +16 -0
  663. package/connectors/connect-notion/.env.example +10 -0
  664. package/connectors/connect-notion/.npmrc.example +2 -0
  665. package/connectors/connect-notion/AGENTS.md +75 -0
  666. package/connectors/connect-notion/CLAUDE.md +211 -0
  667. package/connectors/connect-notion/GEMINI.md +54 -0
  668. package/connectors/connect-notion/README.md +244 -0
  669. package/connectors/connect-notion/package.json +56 -0
  670. package/connectors/connect-notion/src/api/blocks.ts +463 -0
  671. package/connectors/connect-notion/src/api/bulk.ts +614 -0
  672. package/connectors/connect-notion/src/api/client.ts +127 -0
  673. package/connectors/connect-notion/src/api/comments.ts +142 -0
  674. package/connectors/connect-notion/src/api/databases.ts +652 -0
  675. package/connectors/connect-notion/src/api/export.ts +487 -0
  676. package/connectors/connect-notion/src/api/index.ts +72 -0
  677. package/connectors/connect-notion/src/api/pages.ts +465 -0
  678. package/connectors/connect-notion/src/api/search.ts +202 -0
  679. package/connectors/connect-notion/src/api/users.ts +99 -0
  680. package/connectors/connect-notion/src/cli/index.ts +1666 -0
  681. package/connectors/connect-notion/src/index.ts +16 -0
  682. package/connectors/connect-notion/src/types/index.ts +723 -0
  683. package/connectors/connect-notion/src/utils/auth.ts +186 -0
  684. package/connectors/connect-notion/src/utils/config.ts +434 -0
  685. package/connectors/connect-notion/src/utils/output.ts +119 -0
  686. package/connectors/connect-notion/tsconfig.json +29 -0
  687. package/connectors/connect-openai/.env.example +4 -0
  688. package/connectors/connect-openai/.npmrc.example +2 -0
  689. package/connectors/connect-openai/AGENTS.md +77 -0
  690. package/connectors/connect-openai/CLAUDE.md +77 -0
  691. package/connectors/connect-openai/GEMINI.md +77 -0
  692. package/connectors/connect-openai/README.md +95 -0
  693. package/connectors/connect-openai/package.json +61 -0
  694. package/connectors/connect-openai/src/api/chat.ts +134 -0
  695. package/connectors/connect-openai/src/api/client.ts +128 -0
  696. package/connectors/connect-openai/src/api/embeddings.ts +57 -0
  697. package/connectors/connect-openai/src/api/images.ts +75 -0
  698. package/connectors/connect-openai/src/api/index.ts +67 -0
  699. package/connectors/connect-openai/src/cli/index.ts +459 -0
  700. package/connectors/connect-openai/src/index.ts +26 -0
  701. package/connectors/connect-openai/src/types/index.ts +241 -0
  702. package/connectors/connect-openai/src/utils/config.ts +219 -0
  703. package/connectors/connect-openai/src/utils/output.ts +119 -0
  704. package/connectors/connect-openai/tsconfig.json +16 -0
  705. package/connectors/connect-openweathermap/.env.example +2 -0
  706. package/connectors/connect-openweathermap/.npmrc.example +2 -0
  707. package/connectors/connect-openweathermap/AGENTS.md +106 -0
  708. package/connectors/connect-openweathermap/CLAUDE.md +106 -0
  709. package/connectors/connect-openweathermap/GEMINI.md +106 -0
  710. package/connectors/connect-openweathermap/README.md +115 -0
  711. package/connectors/connect-openweathermap/package.json +52 -0
  712. package/connectors/connect-openweathermap/src/api/client.ts +76 -0
  713. package/connectors/connect-openweathermap/src/api/index.ts +24 -0
  714. package/connectors/connect-openweathermap/src/api/weather.ts +108 -0
  715. package/connectors/connect-openweathermap/src/cli/index.ts +470 -0
  716. package/connectors/connect-openweathermap/src/index.ts +33 -0
  717. package/connectors/connect-openweathermap/src/types/index.ts +275 -0
  718. package/connectors/connect-openweathermap/src/utils/config.ts +82 -0
  719. package/connectors/connect-openweathermap/src/utils/output.ts +106 -0
  720. package/connectors/connect-openweathermap/tsconfig.json +16 -0
  721. package/connectors/connect-pandadoc/.env.example +13 -0
  722. package/connectors/connect-pandadoc/.npmrc.example +2 -0
  723. package/connectors/connect-pandadoc/AGENTS.md +76 -0
  724. package/connectors/connect-pandadoc/CLAUDE.md +76 -0
  725. package/connectors/connect-pandadoc/GEMINI.md +76 -0
  726. package/connectors/connect-pandadoc/README.md +94 -0
  727. package/connectors/connect-pandadoc/package.json +57 -0
  728. package/connectors/connect-pandadoc/src/api/catalogs.ts +58 -0
  729. package/connectors/connect-pandadoc/src/api/client.ts +169 -0
  730. package/connectors/connect-pandadoc/src/api/contacts.ts +58 -0
  731. package/connectors/connect-pandadoc/src/api/content-library.ts +57 -0
  732. package/connectors/connect-pandadoc/src/api/documents.ts +263 -0
  733. package/connectors/connect-pandadoc/src/api/folders.ts +58 -0
  734. package/connectors/connect-pandadoc/src/api/forms.ts +37 -0
  735. package/connectors/connect-pandadoc/src/api/index.ts +83 -0
  736. package/connectors/connect-pandadoc/src/api/members.ts +42 -0
  737. package/connectors/connect-pandadoc/src/api/templates.ts +61 -0
  738. package/connectors/connect-pandadoc/src/api/webhooks.ts +81 -0
  739. package/connectors/connect-pandadoc/src/cli/index.ts +1212 -0
  740. package/connectors/connect-pandadoc/src/index.ts +39 -0
  741. package/connectors/connect-pandadoc/src/types/index.ts +454 -0
  742. package/connectors/connect-pandadoc/src/utils/config.ts +259 -0
  743. package/connectors/connect-pandadoc/src/utils/output.ts +119 -0
  744. package/connectors/connect-pandadoc/tsconfig.json +16 -0
  745. package/connectors/connect-quo/.env.example +7 -0
  746. package/connectors/connect-quo/.npmrc.example +2 -0
  747. package/connectors/connect-quo/AGENTS.md +76 -0
  748. package/connectors/connect-quo/CLAUDE.md +76 -0
  749. package/connectors/connect-quo/GEMINI.md +76 -0
  750. package/connectors/connect-quo/README.md +94 -0
  751. package/connectors/connect-quo/package.json +58 -0
  752. package/connectors/connect-quo/src/api/calls.ts +64 -0
  753. package/connectors/connect-quo/src/api/client.ts +133 -0
  754. package/connectors/connect-quo/src/api/contacts.ts +57 -0
  755. package/connectors/connect-quo/src/api/conversations.ts +45 -0
  756. package/connectors/connect-quo/src/api/custom-fields.ts +17 -0
  757. package/connectors/connect-quo/src/api/index.ts +76 -0
  758. package/connectors/connect-quo/src/api/messages.ts +50 -0
  759. package/connectors/connect-quo/src/api/phone-numbers.ts +24 -0
  760. package/connectors/connect-quo/src/api/users.ts +24 -0
  761. package/connectors/connect-quo/src/api/webhooks.ts +121 -0
  762. package/connectors/connect-quo/src/cli/index.ts +713 -0
  763. package/connectors/connect-quo/src/index.ts +32 -0
  764. package/connectors/connect-quo/src/types/index.ts +361 -0
  765. package/connectors/connect-quo/src/utils/config.ts +242 -0
  766. package/connectors/connect-quo/src/utils/output.ts +119 -0
  767. package/connectors/connect-quo/tsconfig.json +16 -0
  768. package/connectors/connect-reddit/.npmrc.example +2 -0
  769. package/connectors/connect-reddit/AGENTS.md +176 -0
  770. package/connectors/connect-reddit/CLAUDE.md +176 -0
  771. package/connectors/connect-reddit/GEMINI.md +176 -0
  772. package/connectors/connect-reddit/README.md +160 -0
  773. package/connectors/connect-reddit/package.json +50 -0
  774. package/connectors/connect-reddit/src/api/client.ts +299 -0
  775. package/connectors/connect-reddit/src/api/comments.ts +268 -0
  776. package/connectors/connect-reddit/src/api/index.ts +113 -0
  777. package/connectors/connect-reddit/src/api/posts.ts +298 -0
  778. package/connectors/connect-reddit/src/api/search.ts +235 -0
  779. package/connectors/connect-reddit/src/api/subreddits.ts +279 -0
  780. package/connectors/connect-reddit/src/api/users.ts +403 -0
  781. package/connectors/connect-reddit/src/cli/index.ts +766 -0
  782. package/connectors/connect-reddit/src/index.ts +36 -0
  783. package/connectors/connect-reddit/src/types/index.ts +295 -0
  784. package/connectors/connect-reddit/src/utils/config.ts +281 -0
  785. package/connectors/connect-reddit/src/utils/output.ts +138 -0
  786. package/connectors/connect-reddit/tsconfig.json +16 -0
  787. package/connectors/connect-reducto/.npmrc.example +2 -0
  788. package/connectors/connect-reducto/AGENTS.md +136 -0
  789. package/connectors/connect-reducto/CLAUDE.md +136 -0
  790. package/connectors/connect-reducto/GEMINI.md +136 -0
  791. package/connectors/connect-reducto/README.md +145 -0
  792. package/connectors/connect-reducto/package.json +48 -0
  793. package/connectors/connect-reducto/src/api/index.ts +362 -0
  794. package/connectors/connect-reducto/src/cli/index.ts +582 -0
  795. package/connectors/connect-reducto/src/index.ts +48 -0
  796. package/connectors/connect-reducto/src/types/index.ts +204 -0
  797. package/connectors/connect-reducto/src/utils/config.ts +144 -0
  798. package/connectors/connect-reducto/src/utils/output.ts +256 -0
  799. package/connectors/connect-reducto/tsconfig.json +18 -0
  800. package/connectors/connect-resend/.npmrc.example +2 -0
  801. package/connectors/connect-resend/AGENTS.md +76 -0
  802. package/connectors/connect-resend/CLAUDE.md +76 -0
  803. package/connectors/connect-resend/GEMINI.md +76 -0
  804. package/connectors/connect-resend/README.md +94 -0
  805. package/connectors/connect-resend/package.json +58 -0
  806. package/connectors/connect-resend/src/api/api-keys.ts +41 -0
  807. package/connectors/connect-resend/src/api/audiences.ts +46 -0
  808. package/connectors/connect-resend/src/api/broadcasts.ts +65 -0
  809. package/connectors/connect-resend/src/api/client.ts +132 -0
  810. package/connectors/connect-resend/src/api/contacts.ts +64 -0
  811. package/connectors/connect-resend/src/api/domains.ts +64 -0
  812. package/connectors/connect-resend/src/api/emails.ts +66 -0
  813. package/connectors/connect-resend/src/api/index.ts +77 -0
  814. package/connectors/connect-resend/src/api/templates.ts +65 -0
  815. package/connectors/connect-resend/src/api/webhooks.ts +55 -0
  816. package/connectors/connect-resend/src/cli/index.ts +1029 -0
  817. package/connectors/connect-resend/src/index.ts +32 -0
  818. package/connectors/connect-resend/src/types/index.ts +327 -0
  819. package/connectors/connect-resend/src/utils/config.ts +228 -0
  820. package/connectors/connect-resend/src/utils/output.ts +119 -0
  821. package/connectors/connect-resend/tsconfig.json +21 -0
  822. package/connectors/connect-revolut/.npmrc.example +2 -0
  823. package/connectors/connect-revolut/AGENTS.md +162 -0
  824. package/connectors/connect-revolut/CLAUDE.md +162 -0
  825. package/connectors/connect-revolut/GEMINI.md +162 -0
  826. package/connectors/connect-revolut/README.md +145 -0
  827. package/connectors/connect-revolut/package.json +54 -0
  828. package/connectors/connect-revolut/src/api/accounts.ts +46 -0
  829. package/connectors/connect-revolut/src/api/cards.ts +87 -0
  830. package/connectors/connect-revolut/src/api/client.ts +128 -0
  831. package/connectors/connect-revolut/src/api/counterparties.ts +64 -0
  832. package/connectors/connect-revolut/src/api/exchange.ts +87 -0
  833. package/connectors/connect-revolut/src/api/index.ts +85 -0
  834. package/connectors/connect-revolut/src/api/payments.ts +64 -0
  835. package/connectors/connect-revolut/src/api/transactions.ts +62 -0
  836. package/connectors/connect-revolut/src/cli/index.ts +674 -0
  837. package/connectors/connect-revolut/src/index.ts +32 -0
  838. package/connectors/connect-revolut/src/types/index.ts +306 -0
  839. package/connectors/connect-revolut/src/utils/config.ts +212 -0
  840. package/connectors/connect-revolut/src/utils/output.ts +77 -0
  841. package/connectors/connect-revolut/tsconfig.json +16 -0
  842. package/connectors/connect-sedo/.env.example +7 -0
  843. package/connectors/connect-sedo/.npmrc.example +2 -0
  844. package/connectors/connect-sedo/AGENTS.md +111 -0
  845. package/connectors/connect-sedo/CLAUDE.md +111 -0
  846. package/connectors/connect-sedo/GEMINI.md +111 -0
  847. package/connectors/connect-sedo/README.md +112 -0
  848. package/connectors/connect-sedo/package.json +54 -0
  849. package/connectors/connect-sedo/src/api/client.ts +139 -0
  850. package/connectors/connect-sedo/src/api/domains.ts +246 -0
  851. package/connectors/connect-sedo/src/api/index.ts +30 -0
  852. package/connectors/connect-sedo/src/cli/index.ts +490 -0
  853. package/connectors/connect-sedo/src/index.ts +18 -0
  854. package/connectors/connect-sedo/src/types/index.ts +104 -0
  855. package/connectors/connect-sedo/src/utils/config.ts +234 -0
  856. package/connectors/connect-sedo/src/utils/output.ts +62 -0
  857. package/connectors/connect-sedo/tsconfig.json +29 -0
  858. package/connectors/connect-sentry/.env.example +10 -0
  859. package/connectors/connect-sentry/.npmrc.example +2 -0
  860. package/connectors/connect-sentry/AGENTS.md +102 -0
  861. package/connectors/connect-sentry/CLAUDE.md +102 -0
  862. package/connectors/connect-sentry/GEMINI.md +102 -0
  863. package/connectors/connect-sentry/README.md +96 -0
  864. package/connectors/connect-sentry/package.json +55 -0
  865. package/connectors/connect-sentry/src/api/client.ts +136 -0
  866. package/connectors/connect-sentry/src/api/example.ts +48 -0
  867. package/connectors/connect-sentry/src/api/index.ts +49 -0
  868. package/connectors/connect-sentry/src/cli/index.ts +242 -0
  869. package/connectors/connect-sentry/src/index.ts +24 -0
  870. package/connectors/connect-sentry/src/types/index.ts +69 -0
  871. package/connectors/connect-sentry/src/utils/config.ts +210 -0
  872. package/connectors/connect-sentry/src/utils/output.ts +119 -0
  873. package/connectors/connect-sentry/tsconfig.json +16 -0
  874. package/connectors/connect-shadcn/.env.example +5 -0
  875. package/connectors/connect-shadcn/.npmrc.example +2 -0
  876. package/connectors/connect-shadcn/AGENTS.md +104 -0
  877. package/connectors/connect-shadcn/CLAUDE.md +104 -0
  878. package/connectors/connect-shadcn/GEMINI.md +104 -0
  879. package/connectors/connect-shadcn/README.md +94 -0
  880. package/connectors/connect-shadcn/package.json +55 -0
  881. package/connectors/connect-shadcn/src/api/client.ts +91 -0
  882. package/connectors/connect-shadcn/src/api/components.ts +146 -0
  883. package/connectors/connect-shadcn/src/api/index.ts +50 -0
  884. package/connectors/connect-shadcn/src/cli/index.ts +320 -0
  885. package/connectors/connect-shadcn/src/index.ts +22 -0
  886. package/connectors/connect-shadcn/src/types/index.ts +89 -0
  887. package/connectors/connect-shadcn/src/utils/config.ts +208 -0
  888. package/connectors/connect-shadcn/src/utils/output.ts +119 -0
  889. package/connectors/connect-shadcn/tsconfig.json +16 -0
  890. package/connectors/connect-shopify/.npmrc.example +2 -0
  891. package/connectors/connect-shopify/AGENTS.md +170 -0
  892. package/connectors/connect-shopify/CLAUDE.md +170 -0
  893. package/connectors/connect-shopify/GEMINI.md +170 -0
  894. package/connectors/connect-shopify/README.md +153 -0
  895. package/connectors/connect-shopify/package.json +29 -0
  896. package/connectors/connect-shopify/src/api/client.ts +163 -0
  897. package/connectors/connect-shopify/src/api/collections.ts +322 -0
  898. package/connectors/connect-shopify/src/api/customers.ts +239 -0
  899. package/connectors/connect-shopify/src/api/index.ts +89 -0
  900. package/connectors/connect-shopify/src/api/inventory.ts +236 -0
  901. package/connectors/connect-shopify/src/api/orders.ts +367 -0
  902. package/connectors/connect-shopify/src/api/products.ts +252 -0
  903. package/connectors/connect-shopify/src/api/shop.ts +50 -0
  904. package/connectors/connect-shopify/src/cli/index.ts +870 -0
  905. package/connectors/connect-shopify/src/index.ts +35 -0
  906. package/connectors/connect-shopify/src/types/index.ts +262 -0
  907. package/connectors/connect-shopify/src/utils/config.ts +240 -0
  908. package/connectors/connect-shopify/src/utils/output.ts +119 -0
  909. package/connectors/connect-shopify/tsconfig.json +17 -0
  910. package/connectors/connect-snap/.npmrc.example +2 -0
  911. package/connectors/connect-snap/AGENTS.md +76 -0
  912. package/connectors/connect-snap/CLAUDE.md +76 -0
  913. package/connectors/connect-snap/GEMINI.md +76 -0
  914. package/connectors/connect-snap/README.md +94 -0
  915. package/connectors/connect-snap/package.json +62 -0
  916. package/connectors/connect-snap/src/api/accounts.ts +81 -0
  917. package/connectors/connect-snap/src/api/ads.ts +102 -0
  918. package/connectors/connect-snap/src/api/adsquads.ts +130 -0
  919. package/connectors/connect-snap/src/api/audiences.ts +208 -0
  920. package/connectors/connect-snap/src/api/campaigns.ts +92 -0
  921. package/connectors/connect-snap/src/api/catalogs.ts +313 -0
  922. package/connectors/connect-snap/src/api/client.ts +324 -0
  923. package/connectors/connect-snap/src/api/conversions.ts +403 -0
  924. package/connectors/connect-snap/src/api/creatives.ts +232 -0
  925. package/connectors/connect-snap/src/api/index.ts +124 -0
  926. package/connectors/connect-snap/src/api/leads.ts +299 -0
  927. package/connectors/connect-snap/src/api/media.ts +246 -0
  928. package/connectors/connect-snap/src/api/organizations.ts +30 -0
  929. package/connectors/connect-snap/src/api/pixels.ts +215 -0
  930. package/connectors/connect-snap/src/api/stats.ts +305 -0
  931. package/connectors/connect-snap/src/api/targeting.ts +255 -0
  932. package/connectors/connect-snap/src/cli/index.ts +1810 -0
  933. package/connectors/connect-snap/src/index.ts +52 -0
  934. package/connectors/connect-snap/src/types/index.ts +1226 -0
  935. package/connectors/connect-snap/src/utils/config.ts +509 -0
  936. package/connectors/connect-snap/src/utils/output.ts +139 -0
  937. package/connectors/connect-snap/tsconfig.json +16 -0
  938. package/connectors/connect-stabilityai/.npmrc.example +2 -0
  939. package/connectors/connect-stabilityai/AGENTS.md +76 -0
  940. package/connectors/connect-stabilityai/CLAUDE.md +76 -0
  941. package/connectors/connect-stabilityai/GEMINI.md +76 -0
  942. package/connectors/connect-stabilityai/README.md +94 -0
  943. package/connectors/connect-stabilityai/package.json +63 -0
  944. package/connectors/connect-stabilityai/src/api/3d.ts +99 -0
  945. package/connectors/connect-stabilityai/src/api/client.ts +238 -0
  946. package/connectors/connect-stabilityai/src/api/edit.ts +130 -0
  947. package/connectors/connect-stabilityai/src/api/engines.ts +41 -0
  948. package/connectors/connect-stabilityai/src/api/image-to-image.ts +150 -0
  949. package/connectors/connect-stabilityai/src/api/index.ts +81 -0
  950. package/connectors/connect-stabilityai/src/api/inpaint.ts +153 -0
  951. package/connectors/connect-stabilityai/src/api/outpaint.ts +117 -0
  952. package/connectors/connect-stabilityai/src/api/text-to-image.ts +181 -0
  953. package/connectors/connect-stabilityai/src/api/upscale.ts +113 -0
  954. package/connectors/connect-stabilityai/src/api/user.ts +24 -0
  955. package/connectors/connect-stabilityai/src/cli/index.ts +859 -0
  956. package/connectors/connect-stabilityai/src/index.ts +37 -0
  957. package/connectors/connect-stabilityai/src/types/index.ts +315 -0
  958. package/connectors/connect-stabilityai/src/utils/config.ts +340 -0
  959. package/connectors/connect-stabilityai/src/utils/output.ts +119 -0
  960. package/connectors/connect-stabilityai/tsconfig.json +21 -0
  961. package/connectors/connect-stripe/.env.example +10 -0
  962. package/connectors/connect-stripe/.npmrc.example +2 -0
  963. package/connectors/connect-stripe/AGENTS.md +204 -0
  964. package/connectors/connect-stripe/CLAUDE.md +204 -0
  965. package/connectors/connect-stripe/GEMINI.md +204 -0
  966. package/connectors/connect-stripe/README.md +181 -0
  967. package/connectors/connect-stripe/package.json +55 -0
  968. package/connectors/connect-stripe/src/api/balance.ts +28 -0
  969. package/connectors/connect-stripe/src/api/billing-portal.ts +64 -0
  970. package/connectors/connect-stripe/src/api/charges.ts +65 -0
  971. package/connectors/connect-stripe/src/api/checkout-sessions.ts +55 -0
  972. package/connectors/connect-stripe/src/api/client.ts +190 -0
  973. package/connectors/connect-stripe/src/api/coupons.ts +52 -0
  974. package/connectors/connect-stripe/src/api/customers.ts +65 -0
  975. package/connectors/connect-stripe/src/api/events.ts +28 -0
  976. package/connectors/connect-stripe/src/api/index.ts +118 -0
  977. package/connectors/connect-stripe/src/api/invoice-items.ts +52 -0
  978. package/connectors/connect-stripe/src/api/invoices.ts +102 -0
  979. package/connectors/connect-stripe/src/api/payment-intents.ts +81 -0
  980. package/connectors/connect-stripe/src/api/payment-links.ts +57 -0
  981. package/connectors/connect-stripe/src/api/payment-methods.ts +59 -0
  982. package/connectors/connect-stripe/src/api/prices.ts +57 -0
  983. package/connectors/connect-stripe/src/api/products.ts +65 -0
  984. package/connectors/connect-stripe/src/api/promotion-codes.ts +44 -0
  985. package/connectors/connect-stripe/src/api/subscription-items.ts +53 -0
  986. package/connectors/connect-stripe/src/api/subscriptions.ts +73 -0
  987. package/connectors/connect-stripe/src/api/webhooks.ts +52 -0
  988. package/connectors/connect-stripe/src/cli/index.ts +1995 -0
  989. package/connectors/connect-stripe/src/index.ts +44 -0
  990. package/connectors/connect-stripe/src/types/index.ts +2147 -0
  991. package/connectors/connect-stripe/src/utils/config.ts +220 -0
  992. package/connectors/connect-stripe/src/utils/output.ts +119 -0
  993. package/connectors/connect-stripe/tsconfig.json +16 -0
  994. package/connectors/connect-stripeatlas/.env.example +11 -0
  995. package/connectors/connect-stripeatlas/.npmrc.example +2 -0
  996. package/connectors/connect-stripeatlas/AGENTS.md +102 -0
  997. package/connectors/connect-stripeatlas/CLAUDE.md +102 -0
  998. package/connectors/connect-stripeatlas/GEMINI.md +102 -0
  999. package/connectors/connect-stripeatlas/README.md +95 -0
  1000. package/connectors/connect-stripeatlas/package.json +57 -0
  1001. package/connectors/connect-stripeatlas/src/api/client.ts +77 -0
  1002. package/connectors/connect-stripeatlas/src/api/example.ts +60 -0
  1003. package/connectors/connect-stripeatlas/src/api/index.ts +65 -0
  1004. package/connectors/connect-stripeatlas/src/cli/index.ts +270 -0
  1005. package/connectors/connect-stripeatlas/src/index.ts +29 -0
  1006. package/connectors/connect-stripeatlas/src/types/index.ts +93 -0
  1007. package/connectors/connect-stripeatlas/src/utils/config.ts +228 -0
  1008. package/connectors/connect-stripeatlas/src/utils/output.ts +119 -0
  1009. package/connectors/connect-stripeatlas/tsconfig.json +16 -0
  1010. package/connectors/connect-substack/.env.example +4 -0
  1011. package/connectors/connect-substack/.npmrc.example +2 -0
  1012. package/connectors/connect-substack/AGENTS.md +168 -0
  1013. package/connectors/connect-substack/CLAUDE.md +168 -0
  1014. package/connectors/connect-substack/GEMINI.md +168 -0
  1015. package/connectors/connect-substack/README.md +146 -0
  1016. package/connectors/connect-substack/package.json +51 -0
  1017. package/connectors/connect-substack/src/api/client.ts +147 -0
  1018. package/connectors/connect-substack/src/api/comments.ts +68 -0
  1019. package/connectors/connect-substack/src/api/index.ts +77 -0
  1020. package/connectors/connect-substack/src/api/posts.ts +135 -0
  1021. package/connectors/connect-substack/src/api/publication.ts +126 -0
  1022. package/connectors/connect-substack/src/api/stats.ts +113 -0
  1023. package/connectors/connect-substack/src/api/subscribers.ts +97 -0
  1024. package/connectors/connect-substack/src/cli/index.ts +531 -0
  1025. package/connectors/connect-substack/src/index.ts +31 -0
  1026. package/connectors/connect-substack/src/types/index.ts +257 -0
  1027. package/connectors/connect-substack/src/utils/config.ts +208 -0
  1028. package/connectors/connect-substack/src/utils/output.ts +143 -0
  1029. package/connectors/connect-substack/tsconfig.json +16 -0
  1030. package/connectors/connect-tiktok/.npmrc.example +2 -0
  1031. package/connectors/connect-tiktok/AGENTS.md +76 -0
  1032. package/connectors/connect-tiktok/CLAUDE.md +76 -0
  1033. package/connectors/connect-tiktok/GEMINI.md +76 -0
  1034. package/connectors/connect-tiktok/README.md +94 -0
  1035. package/connectors/connect-tiktok/package.json +60 -0
  1036. package/connectors/connect-tiktok/src/api/adgroups.ts +144 -0
  1037. package/connectors/connect-tiktok/src/api/ads.ts +160 -0
  1038. package/connectors/connect-tiktok/src/api/advertisers.ts +104 -0
  1039. package/connectors/connect-tiktok/src/api/audiences.ts +246 -0
  1040. package/connectors/connect-tiktok/src/api/business.ts +273 -0
  1041. package/connectors/connect-tiktok/src/api/campaigns.ts +116 -0
  1042. package/connectors/connect-tiktok/src/api/catalogs.ts +326 -0
  1043. package/connectors/connect-tiktok/src/api/client.ts +137 -0
  1044. package/connectors/connect-tiktok/src/api/creatives.ts +293 -0
  1045. package/connectors/connect-tiktok/src/api/events.ts +314 -0
  1046. package/connectors/connect-tiktok/src/api/identity.ts +255 -0
  1047. package/connectors/connect-tiktok/src/api/index.ts +105 -0
  1048. package/connectors/connect-tiktok/src/api/pixels.ts +188 -0
  1049. package/connectors/connect-tiktok/src/api/reports.ts +290 -0
  1050. package/connectors/connect-tiktok/src/api/targeting.ts +326 -0
  1051. package/connectors/connect-tiktok/src/cli/index.ts +1329 -0
  1052. package/connectors/connect-tiktok/src/index.ts +39 -0
  1053. package/connectors/connect-tiktok/src/types/index.ts +1052 -0
  1054. package/connectors/connect-tiktok/src/utils/config.ts +419 -0
  1055. package/connectors/connect-tiktok/src/utils/output.ts +136 -0
  1056. package/connectors/connect-tiktok/tsconfig.json +16 -0
  1057. package/connectors/connect-tinker/.env.example +8 -0
  1058. package/connectors/connect-tinker/.npmrc.example +2 -0
  1059. package/connectors/connect-tinker/AGENTS.md +189 -0
  1060. package/connectors/connect-tinker/CLAUDE.md +189 -0
  1061. package/connectors/connect-tinker/GEMINI.md +189 -0
  1062. package/connectors/connect-tinker/README.md +157 -0
  1063. package/connectors/connect-tinker/package.json +55 -0
  1064. package/connectors/connect-tinker/src/api/client.ts +146 -0
  1065. package/connectors/connect-tinker/src/api/index.ts +100 -0
  1066. package/connectors/connect-tinker/src/api/sampling.ts +163 -0
  1067. package/connectors/connect-tinker/src/api/state.ts +147 -0
  1068. package/connectors/connect-tinker/src/api/training.ts +152 -0
  1069. package/connectors/connect-tinker/src/cli/index.ts +775 -0
  1070. package/connectors/connect-tinker/src/index.ts +28 -0
  1071. package/connectors/connect-tinker/src/types/index.ts +287 -0
  1072. package/connectors/connect-tinker/src/utils/config.ts +230 -0
  1073. package/connectors/connect-tinker/src/utils/output.ts +139 -0
  1074. package/connectors/connect-tinker/tsconfig.json +16 -0
  1075. package/connectors/connect-twilio/.npmrc.example +2 -0
  1076. package/connectors/connect-twilio/AGENTS.md +76 -0
  1077. package/connectors/connect-twilio/CLAUDE.md +76 -0
  1078. package/connectors/connect-twilio/GEMINI.md +76 -0
  1079. package/connectors/connect-twilio/README.md +94 -0
  1080. package/connectors/connect-twilio/package.json +72 -0
  1081. package/connectors/connect-twilio/src/api/accounts.ts +352 -0
  1082. package/connectors/connect-twilio/src/api/calls.ts +120 -0
  1083. package/connectors/connect-twilio/src/api/client.ts +181 -0
  1084. package/connectors/connect-twilio/src/api/conversations.ts +313 -0
  1085. package/connectors/connect-twilio/src/api/index.ts +91 -0
  1086. package/connectors/connect-twilio/src/api/lookup.ts +271 -0
  1087. package/connectors/connect-twilio/src/api/messages.ts +107 -0
  1088. package/connectors/connect-twilio/src/api/numbers.ts +152 -0
  1089. package/connectors/connect-twilio/src/api/verify.ts +213 -0
  1090. package/connectors/connect-twilio/src/api/video.ts +305 -0
  1091. package/connectors/connect-twilio/src/cli/index.ts +1093 -0
  1092. package/connectors/connect-twilio/src/index.ts +34 -0
  1093. package/connectors/connect-twilio/src/types/index.ts +983 -0
  1094. package/connectors/connect-twilio/src/utils/config.ts +424 -0
  1095. package/connectors/connect-twilio/src/utils/output.ts +119 -0
  1096. package/connectors/connect-twilio/tsconfig.json +16 -0
  1097. package/connectors/connect-uspto/.env.example +13 -0
  1098. package/connectors/connect-uspto/.npmrc.example +2 -0
  1099. package/connectors/connect-uspto/AGENTS.md +80 -0
  1100. package/connectors/connect-uspto/CLAUDE.md +80 -0
  1101. package/connectors/connect-uspto/GEMINI.md +80 -0
  1102. package/connectors/connect-uspto/README.md +98 -0
  1103. package/connectors/connect-uspto/package.json +54 -0
  1104. package/connectors/connect-uspto/src/api/browser.ts +335 -0
  1105. package/connectors/connect-uspto/src/api/client.ts +186 -0
  1106. package/connectors/connect-uspto/src/api/index.ts +104 -0
  1107. package/connectors/connect-uspto/src/api/patents.ts +290 -0
  1108. package/connectors/connect-uspto/src/api/ptab.ts +150 -0
  1109. package/connectors/connect-uspto/src/api/trademarks.ts +302 -0
  1110. package/connectors/connect-uspto/src/cli/index.ts +713 -0
  1111. package/connectors/connect-uspto/src/index.ts +26 -0
  1112. package/connectors/connect-uspto/src/types/index.ts +302 -0
  1113. package/connectors/connect-uspto/src/utils/config.ts +235 -0
  1114. package/connectors/connect-uspto/src/utils/output.ts +119 -0
  1115. package/connectors/connect-uspto/tsconfig.json +16 -0
  1116. package/connectors/connect-webflow/.npmrc.example +2 -0
  1117. package/connectors/connect-webflow/AGENTS.md +193 -0
  1118. package/connectors/connect-webflow/CLAUDE.md +193 -0
  1119. package/connectors/connect-webflow/GEMINI.md +193 -0
  1120. package/connectors/connect-webflow/README.md +173 -0
  1121. package/connectors/connect-webflow/package.json +29 -0
  1122. package/connectors/connect-webflow/src/api/assets.ts +89 -0
  1123. package/connectors/connect-webflow/src/api/client.ts +121 -0
  1124. package/connectors/connect-webflow/src/api/collections.ts +46 -0
  1125. package/connectors/connect-webflow/src/api/forms.ts +75 -0
  1126. package/connectors/connect-webflow/src/api/index.ts +93 -0
  1127. package/connectors/connect-webflow/src/api/items.ts +141 -0
  1128. package/connectors/connect-webflow/src/api/orders.ts +89 -0
  1129. package/connectors/connect-webflow/src/api/pages.ts +76 -0
  1130. package/connectors/connect-webflow/src/api/products.ts +160 -0
  1131. package/connectors/connect-webflow/src/api/sites.ts +41 -0
  1132. package/connectors/connect-webflow/src/api/users.ts +81 -0
  1133. package/connectors/connect-webflow/src/cli/index.ts +1048 -0
  1134. package/connectors/connect-webflow/src/index.ts +35 -0
  1135. package/connectors/connect-webflow/src/types/index.ts +488 -0
  1136. package/connectors/connect-webflow/src/utils/config.ts +208 -0
  1137. package/connectors/connect-webflow/src/utils/output.ts +119 -0
  1138. package/connectors/connect-webflow/tsconfig.json +17 -0
  1139. package/connectors/connect-wix/.npmrc.example +2 -0
  1140. package/connectors/connect-wix/AGENTS.md +181 -0
  1141. package/connectors/connect-wix/CLAUDE.md +181 -0
  1142. package/connectors/connect-wix/GEMINI.md +181 -0
  1143. package/connectors/connect-wix/README.md +163 -0
  1144. package/connectors/connect-wix/package.json +29 -0
  1145. package/connectors/connect-wix/src/api/bookings.ts +575 -0
  1146. package/connectors/connect-wix/src/api/client.ts +147 -0
  1147. package/connectors/connect-wix/src/api/contacts.ts +308 -0
  1148. package/connectors/connect-wix/src/api/index.ts +90 -0
  1149. package/connectors/connect-wix/src/api/inventory.ts +195 -0
  1150. package/connectors/connect-wix/src/api/members.ts +172 -0
  1151. package/connectors/connect-wix/src/api/orders.ts +415 -0
  1152. package/connectors/connect-wix/src/api/products.ts +453 -0
  1153. package/connectors/connect-wix/src/api/sites.ts +77 -0
  1154. package/connectors/connect-wix/src/cli/index.ts +1009 -0
  1155. package/connectors/connect-wix/src/index.ts +35 -0
  1156. package/connectors/connect-wix/src/types/index.ts +786 -0
  1157. package/connectors/connect-wix/src/utils/config.ts +219 -0
  1158. package/connectors/connect-wix/src/utils/output.ts +119 -0
  1159. package/connectors/connect-wix/tsconfig.json +17 -0
  1160. package/connectors/connect-x/.env.example +11 -0
  1161. package/connectors/connect-x/.npmrc.example +2 -0
  1162. package/connectors/connect-x/AGENTS.md +84 -0
  1163. package/connectors/connect-x/CLAUDE.md +84 -0
  1164. package/connectors/connect-x/GEMINI.md +84 -0
  1165. package/connectors/connect-x/README.md +102 -0
  1166. package/connectors/connect-x/package.json +59 -0
  1167. package/connectors/connect-x/src/api/client.ts +392 -0
  1168. package/connectors/connect-x/src/api/index.ts +171 -0
  1169. package/connectors/connect-x/src/api/media.ts +323 -0
  1170. package/connectors/connect-x/src/api/oauth.ts +408 -0
  1171. package/connectors/connect-x/src/api/oauth1.ts +351 -0
  1172. package/connectors/connect-x/src/api/tweets.ts +339 -0
  1173. package/connectors/connect-x/src/api/users.ts +259 -0
  1174. package/connectors/connect-x/src/cli/index.ts +1205 -0
  1175. package/connectors/connect-x/src/index.ts +92 -0
  1176. package/connectors/connect-x/src/types/index.ts +230 -0
  1177. package/connectors/connect-x/src/utils/config.ts +496 -0
  1178. package/connectors/connect-x/src/utils/output.ts +119 -0
  1179. package/connectors/connect-x/tsconfig.json +16 -0
  1180. package/connectors/connect-xads/.env.example +11 -0
  1181. package/connectors/connect-xads/.npmrc.example +2 -0
  1182. package/connectors/connect-xads/AGENTS.md +183 -0
  1183. package/connectors/connect-xads/CLAUDE.md +183 -0
  1184. package/connectors/connect-xads/GEMINI.md +183 -0
  1185. package/connectors/connect-xads/README.md +161 -0
  1186. package/connectors/connect-xads/package.json +52 -0
  1187. package/connectors/connect-xads/src/api/accounts.ts +70 -0
  1188. package/connectors/connect-xads/src/api/analytics.ts +165 -0
  1189. package/connectors/connect-xads/src/api/audiences.ts +143 -0
  1190. package/connectors/connect-xads/src/api/campaigns.ts +113 -0
  1191. package/connectors/connect-xads/src/api/client.ts +315 -0
  1192. package/connectors/connect-xads/src/api/index.ts +91 -0
  1193. package/connectors/connect-xads/src/api/line-items.ts +126 -0
  1194. package/connectors/connect-xads/src/api/media.ts +96 -0
  1195. package/connectors/connect-xads/src/api/promoted-tweets.ts +97 -0
  1196. package/connectors/connect-xads/src/api/targeting.ts +165 -0
  1197. package/connectors/connect-xads/src/cli/index.ts +1036 -0
  1198. package/connectors/connect-xads/src/index.ts +41 -0
  1199. package/connectors/connect-xads/src/types/index.ts +474 -0
  1200. package/connectors/connect-xads/src/utils/config.ts +176 -0
  1201. package/connectors/connect-xads/src/utils/output.ts +177 -0
  1202. package/connectors/connect-xads/tsconfig.json +15 -0
  1203. package/connectors/connect-xai/.env.example +4 -0
  1204. package/connectors/connect-xai/.npmrc.example +2 -0
  1205. package/connectors/connect-xai/AGENTS.md +97 -0
  1206. package/connectors/connect-xai/CLAUDE.md +97 -0
  1207. package/connectors/connect-xai/GEMINI.md +97 -0
  1208. package/connectors/connect-xai/README.md +106 -0
  1209. package/connectors/connect-xai/package.json +60 -0
  1210. package/connectors/connect-xai/src/api/chat.ts +114 -0
  1211. package/connectors/connect-xai/src/api/client.ts +122 -0
  1212. package/connectors/connect-xai/src/api/index.ts +58 -0
  1213. package/connectors/connect-xai/src/cli/index.ts +330 -0
  1214. package/connectors/connect-xai/src/index.ts +24 -0
  1215. package/connectors/connect-xai/src/types/index.ts +172 -0
  1216. package/connectors/connect-xai/src/utils/config.ts +208 -0
  1217. package/connectors/connect-xai/src/utils/output.ts +119 -0
  1218. package/connectors/connect-xai/tsconfig.json +16 -0
  1219. package/connectors/connect-youtube/.npmrc.example +2 -0
  1220. package/connectors/connect-youtube/AGENTS.md +76 -0
  1221. package/connectors/connect-youtube/CLAUDE.md +76 -0
  1222. package/connectors/connect-youtube/GEMINI.md +76 -0
  1223. package/connectors/connect-youtube/README.md +94 -0
  1224. package/connectors/connect-youtube/package.json +61 -0
  1225. package/connectors/connect-youtube/src/api/analytics.ts +364 -0
  1226. package/connectors/connect-youtube/src/api/captions.ts +196 -0
  1227. package/connectors/connect-youtube/src/api/categories.ts +107 -0
  1228. package/connectors/connect-youtube/src/api/channels.ts +149 -0
  1229. package/connectors/connect-youtube/src/api/client.ts +278 -0
  1230. package/connectors/connect-youtube/src/api/commentThreads.ts +215 -0
  1231. package/connectors/connect-youtube/src/api/comments.ts +179 -0
  1232. package/connectors/connect-youtube/src/api/index.ts +113 -0
  1233. package/connectors/connect-youtube/src/api/live.ts +480 -0
  1234. package/connectors/connect-youtube/src/api/members.ts +119 -0
  1235. package/connectors/connect-youtube/src/api/playlistItems.ts +184 -0
  1236. package/connectors/connect-youtube/src/api/playlists.ts +174 -0
  1237. package/connectors/connect-youtube/src/api/search.ts +222 -0
  1238. package/connectors/connect-youtube/src/api/subscriptions.ts +164 -0
  1239. package/connectors/connect-youtube/src/api/thumbnails.ts +73 -0
  1240. package/connectors/connect-youtube/src/api/videos.ts +217 -0
  1241. package/connectors/connect-youtube/src/api/watermarks.ts +110 -0
  1242. package/connectors/connect-youtube/src/cli/index.ts +1768 -0
  1243. package/connectors/connect-youtube/src/index.ts +41 -0
  1244. package/connectors/connect-youtube/src/types/index.ts +1207 -0
  1245. package/connectors/connect-youtube/src/utils/auth.ts +236 -0
  1246. package/connectors/connect-youtube/src/utils/config.ts +529 -0
  1247. package/connectors/connect-youtube/src/utils/output.ts +157 -0
  1248. package/connectors/connect-youtube/tsconfig.json +16 -0
  1249. package/connectors/connect-zoom/.npmrc.example +2 -0
  1250. package/connectors/connect-zoom/AGENTS.md +164 -0
  1251. package/connectors/connect-zoom/CLAUDE.md +164 -0
  1252. package/connectors/connect-zoom/GEMINI.md +164 -0
  1253. package/connectors/connect-zoom/README.md +145 -0
  1254. package/connectors/connect-zoom/package.json +51 -0
  1255. package/connectors/connect-zoom/src/api/client.ts +177 -0
  1256. package/connectors/connect-zoom/src/api/index.ts +81 -0
  1257. package/connectors/connect-zoom/src/api/meetings.ts +126 -0
  1258. package/connectors/connect-zoom/src/api/recordings.ts +129 -0
  1259. package/connectors/connect-zoom/src/api/reports.ts +178 -0
  1260. package/connectors/connect-zoom/src/api/users.ts +52 -0
  1261. package/connectors/connect-zoom/src/api/webinars.ts +115 -0
  1262. package/connectors/connect-zoom/src/cli/index.ts +735 -0
  1263. package/connectors/connect-zoom/src/index.ts +26 -0
  1264. package/connectors/connect-zoom/src/types/index.ts +311 -0
  1265. package/connectors/connect-zoom/src/utils/config.ts +241 -0
  1266. package/connectors/connect-zoom/src/utils/output.ts +119 -0
  1267. package/connectors/connect-zoom/tsconfig.json +16 -0
  1268. package/dist/index.js +580 -0
  1269. package/package.json +68 -0
@@ -0,0 +1,1768 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { YouTube } from '../api';
5
+ import {
6
+ getAccessToken,
7
+ setAccessToken,
8
+ getApiKey,
9
+ setApiKey,
10
+ clearConfig,
11
+ getConfigDir,
12
+ getBaseConfigDir,
13
+ setProfileOverride,
14
+ getCurrentProfile,
15
+ setCurrentProfile,
16
+ listProfiles,
17
+ createProfile,
18
+ deleteProfile,
19
+ profileExists,
20
+ loadProfile,
21
+ getChannelId,
22
+ getDefaultChannelId,
23
+ setDefaultChannelId,
24
+ setNamedChannel,
25
+ removeNamedChannel,
26
+ listNamedChannels,
27
+ getExportsDir,
28
+ getImportsDir,
29
+ getDownloadsDir,
30
+ ensureDownloadsDir,
31
+ getClientId,
32
+ getClientSecret,
33
+ setCredentials,
34
+ saveTokens,
35
+ clearTokens,
36
+ isAuthenticated,
37
+ loadTokens,
38
+ } from '../utils/config';
39
+ import { getAuthUrl, startCallbackServer, getValidAccessToken } from '../utils/auth';
40
+ import type { OutputFormat } from '../utils/output';
41
+ import { success, error, info, print, formatDuration, formatCount, formatDate } from '../utils/output';
42
+
43
+ const CONNECTOR_NAME = 'connect-youtube';
44
+ const VERSION = '0.1.0';
45
+
46
+ const program = new Command();
47
+
48
+ program
49
+ .name(CONNECTOR_NAME)
50
+ .description('YouTube Data API v3 and Analytics API CLI - Videos, channels, playlists, comments, live streams, and analytics')
51
+ .version(VERSION)
52
+ .option('-t, --token <token>', 'OAuth access token (overrides config)')
53
+ .option('-k, --api-key <key>', 'API key for read-only operations (overrides config)')
54
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
55
+ .option('-p, --profile <profile>', 'Use a specific profile')
56
+ .hook('preAction', (thisCommand) => {
57
+ const opts = thisCommand.opts();
58
+ if (opts.profile) {
59
+ if (!profileExists(opts.profile)) {
60
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
61
+ process.exit(1);
62
+ }
63
+ setProfileOverride(opts.profile);
64
+ }
65
+ if (opts.token) {
66
+ process.env.YOUTUBE_ACCESS_TOKEN = opts.token;
67
+ }
68
+ if (opts.apiKey) {
69
+ process.env.YOUTUBE_API_KEY = opts.apiKey;
70
+ }
71
+ });
72
+
73
+ function getFormat(cmd: Command): OutputFormat {
74
+ const parent = cmd.parent;
75
+ return (parent?.opts().format || 'pretty') as OutputFormat;
76
+ }
77
+
78
+ async function getClient(): Promise<YouTube> {
79
+ let accessToken = getAccessToken();
80
+ const apiKey = getApiKey();
81
+
82
+ // Try to refresh token if using OAuth and token is expired
83
+ if (!accessToken && isAuthenticated()) {
84
+ try {
85
+ accessToken = await getValidAccessToken();
86
+ } catch {
87
+ // Fall through to error below
88
+ }
89
+ }
90
+
91
+ if (!accessToken && !apiKey) {
92
+ error(`No credentials configured. Run "${CONNECTOR_NAME} auth login" or "${CONNECTOR_NAME} config set-api-key <key>"`);
93
+ process.exit(1);
94
+ }
95
+ return new YouTube({ accessToken, apiKey });
96
+ }
97
+
98
+ async function requireOAuth(): Promise<YouTube> {
99
+ let accessToken = getAccessToken();
100
+
101
+ // Try to refresh token if using OAuth and token is expired
102
+ if (!accessToken && isAuthenticated()) {
103
+ try {
104
+ accessToken = await getValidAccessToken();
105
+ } catch {
106
+ // Fall through to error below
107
+ }
108
+ }
109
+
110
+ if (!accessToken) {
111
+ error('This operation requires OAuth authentication. Run "' + CONNECTOR_NAME + ' auth login"');
112
+ process.exit(1);
113
+ }
114
+ return new YouTube({ accessToken });
115
+ }
116
+
117
+ function resolveChannelId(nameOrId?: string): string {
118
+ const resolved = getChannelId(nameOrId);
119
+ if (!resolved) {
120
+ error(`No channel specified. Use --channel or set default with "${CONNECTOR_NAME} config set-channel <id>"`);
121
+ process.exit(1);
122
+ }
123
+ return resolved;
124
+ }
125
+
126
+ // ============================================
127
+ // Profile Commands
128
+ // ============================================
129
+ const profileCmd = program
130
+ .command('profile')
131
+ .description('Manage configuration profiles');
132
+
133
+ profileCmd
134
+ .command('list')
135
+ .description('List all profiles')
136
+ .action(() => {
137
+ const profiles = listProfiles();
138
+ const current = getCurrentProfile();
139
+
140
+ if (profiles.length === 0) {
141
+ info('No profiles found. Use "profile create <name>" to create one.');
142
+ return;
143
+ }
144
+
145
+ success(`Profiles:`);
146
+ profiles.forEach(p => {
147
+ const isActive = p === current ? chalk.green(' (active)') : '';
148
+ console.log(` ${p}${isActive}`);
149
+ });
150
+ });
151
+
152
+ profileCmd
153
+ .command('use <name>')
154
+ .description('Switch to a profile')
155
+ .action((name: string) => {
156
+ if (!profileExists(name)) {
157
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
158
+ process.exit(1);
159
+ }
160
+ setCurrentProfile(name);
161
+ success(`Switched to profile: ${name}`);
162
+ });
163
+
164
+ profileCmd
165
+ .command('create <name>')
166
+ .description('Create a new profile')
167
+ .option('--token <token>', 'OAuth access token')
168
+ .option('--api-key <key>', 'API key')
169
+ .option('--use', 'Switch to this profile after creation')
170
+ .action((name: string, opts) => {
171
+ if (profileExists(name)) {
172
+ error(`Profile "${name}" already exists`);
173
+ process.exit(1);
174
+ }
175
+
176
+ createProfile(name, {
177
+ accessToken: opts.token,
178
+ apiKey: opts.apiKey,
179
+ });
180
+ success(`Profile "${name}" created`);
181
+
182
+ if (opts.use) {
183
+ setCurrentProfile(name);
184
+ info(`Switched to profile: ${name}`);
185
+ }
186
+ });
187
+
188
+ profileCmd
189
+ .command('delete <name>')
190
+ .description('Delete a profile')
191
+ .action((name: string) => {
192
+ if (name === 'default') {
193
+ error('Cannot delete the default profile');
194
+ process.exit(1);
195
+ }
196
+ if (deleteProfile(name)) {
197
+ success(`Profile "${name}" deleted`);
198
+ } else {
199
+ error(`Profile "${name}" not found`);
200
+ process.exit(1);
201
+ }
202
+ });
203
+
204
+ profileCmd
205
+ .command('show [name]')
206
+ .description('Show profile configuration')
207
+ .action((name?: string) => {
208
+ const profileName = name || getCurrentProfile();
209
+ const config = loadProfile(profileName);
210
+ const active = getCurrentProfile();
211
+ const tokens = loadTokens();
212
+
213
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
214
+ info(`Authenticated: ${isAuthenticated() ? chalk.green('yes') : chalk.gray('no')}`);
215
+ if (tokens) {
216
+ info(`Token expires: ${new Date(tokens.expiresAt).toLocaleString()}`);
217
+ }
218
+ info(`Manual Token: ${config.accessToken ? `${config.accessToken.substring(0, 8)}...` : chalk.gray('not set')}`);
219
+ info(`API Key: ${config.apiKey ? `${config.apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
220
+ });
221
+
222
+ // ============================================
223
+ // Auth Commands
224
+ // ============================================
225
+ const authCmd = program
226
+ .command('auth')
227
+ .description('Manage OAuth authentication');
228
+
229
+ authCmd
230
+ .command('setup')
231
+ .description('Set up OAuth credentials from a JSON file')
232
+ .argument('<path>', 'Path to Google OAuth client secret JSON file')
233
+ .action(async (path: string) => {
234
+ try {
235
+ const { readFileSync } = await import('fs');
236
+ const content = readFileSync(path, 'utf-8');
237
+ const data = JSON.parse(content);
238
+
239
+ // Support both "installed" and "web" client types
240
+ const client = data.installed || data.web;
241
+ if (!client || !client.client_id || !client.client_secret) {
242
+ error('Invalid OAuth client secret file');
243
+ process.exit(1);
244
+ }
245
+
246
+ setCredentials(client.client_id, client.client_secret);
247
+ success('OAuth credentials configured!');
248
+ info(`Client ID: ${client.client_id.substring(0, 20)}...`);
249
+ info('Now run "connect-youtube auth login" to authenticate.');
250
+ } catch (err) {
251
+ error(`Failed to read credentials file: ${String(err)}`);
252
+ process.exit(1);
253
+ }
254
+ });
255
+
256
+ authCmd
257
+ .command('login')
258
+ .description('Authenticate with YouTube via OAuth (auto-creates profile from channel name)')
259
+ .action(async () => {
260
+ const clientId = getClientId();
261
+ const clientSecret = getClientSecret();
262
+
263
+ if (!clientId || !clientSecret) {
264
+ error('OAuth credentials not configured. Run "connect-youtube auth setup <path-to-credentials.json>" first.');
265
+ process.exit(1);
266
+ }
267
+
268
+ try {
269
+ const authUrl = getAuthUrl();
270
+ info('Opening browser for authentication...');
271
+ info(`If browser doesn't open, visit: ${authUrl}`);
272
+
273
+ // Try to open browser
274
+ const { exec } = await import('child_process');
275
+ const openCmd = process.platform === 'darwin' ? 'open' :
276
+ process.platform === 'win32' ? 'start' : 'xdg-open';
277
+ exec(`${openCmd} "${authUrl}"`);
278
+
279
+ info('Waiting for authentication callback...');
280
+ const result = await startCallbackServer();
281
+
282
+ if (result.success && result.tokens) {
283
+ success('Authentication successful!');
284
+
285
+ // Get channel info to create profile name
286
+ try {
287
+ const client = new YouTube({ accessToken: result.tokens.accessToken });
288
+ const channel = await client.channels.getMine(['snippet']);
289
+
290
+ if (channel && channel.snippet?.title) {
291
+ const channelTitle = channel.snippet.title;
292
+
293
+ // Convert channel name to profile slug: "My Channel" → "mychannel"
294
+ const profileSlug = channelTitle.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
295
+
296
+ // Create profile if it doesn't exist
297
+ if (!profileExists(profileSlug)) {
298
+ createProfile(profileSlug);
299
+ info(`Created profile: ${profileSlug}`);
300
+ }
301
+
302
+ // Switch to the profile
303
+ setCurrentProfile(profileSlug);
304
+ setProfileOverride(profileSlug);
305
+
306
+ // Save tokens to the new profile
307
+ saveTokens(result.tokens);
308
+
309
+ success(`Profile: ${profileSlug}`);
310
+ info(`Channel: ${channelTitle}`);
311
+ info(`Channel ID: ${channel.id}`);
312
+ info(`Access token expires: ${new Date(result.tokens.expiresAt).toLocaleString()}`);
313
+ } else {
314
+ // Fallback: save to current profile if channel info unavailable
315
+ saveTokens(result.tokens);
316
+ info(`Access token expires: ${new Date(result.tokens.expiresAt).toLocaleString()}`);
317
+ }
318
+ } catch (err) {
319
+ // Channel fetch failed but auth succeeded - save to current profile
320
+ saveTokens(result.tokens);
321
+ error(`Could not fetch channel info: ${String(err)}`);
322
+ info('Tokens saved to current profile. You may need to enable YouTube Data API.');
323
+ }
324
+ } else {
325
+ error(`Authentication failed: ${result.error}`);
326
+ process.exit(1);
327
+ }
328
+ } catch (err) {
329
+ error(`Authentication failed: ${String(err)}`);
330
+ process.exit(1);
331
+ }
332
+ });
333
+
334
+ authCmd
335
+ .command('logout')
336
+ .description('Clear OAuth tokens for current profile')
337
+ .action(() => {
338
+ clearTokens();
339
+ success('Logged out successfully');
340
+ });
341
+
342
+ authCmd
343
+ .command('status')
344
+ .description('Check authentication status')
345
+ .action(async () => {
346
+ const clientId = getClientId();
347
+ const tokens = loadTokens();
348
+
349
+ console.log(chalk.bold('Authentication Status:'));
350
+ info(`Profile: ${getCurrentProfile()}`);
351
+ info(`OAuth configured: ${clientId ? chalk.green('yes') : chalk.red('no')}`);
352
+ info(`Logged in: ${tokens ? chalk.green('yes') : chalk.red('no')}`);
353
+
354
+ if (tokens) {
355
+ const expired = Date.now() >= tokens.expiresAt;
356
+ info(`Token status: ${expired ? chalk.yellow('expired (will refresh)') : chalk.green('valid')}`);
357
+ info(`Expires: ${new Date(tokens.expiresAt).toLocaleString()}`);
358
+
359
+ // Try to get channel info
360
+ try {
361
+ const accessToken = await getValidAccessToken();
362
+ const client = new YouTube({ accessToken });
363
+ const channel = await client.channels.getMine(['snippet']);
364
+ if (channel) {
365
+ info(`Channel: ${channel.snippet?.title}`);
366
+ info(`Channel ID: ${channel.id}`);
367
+ }
368
+ } catch (err) {
369
+ info(`Channel: ${chalk.red('Unable to fetch - ' + String(err))}`);
370
+ }
371
+ }
372
+ });
373
+
374
+ authCmd
375
+ .command('refresh')
376
+ .description('Manually refresh OAuth access token')
377
+ .action(async () => {
378
+ if (!isAuthenticated()) {
379
+ error('Not authenticated. Run "connect-youtube auth login" first.');
380
+ process.exit(1);
381
+ }
382
+
383
+ try {
384
+ const accessToken = await getValidAccessToken();
385
+ success('Token refreshed successfully!');
386
+ const tokens = loadTokens();
387
+ if (tokens) {
388
+ info(`New token expires: ${new Date(tokens.expiresAt).toLocaleString()}`);
389
+ }
390
+ } catch (err) {
391
+ error(`Failed to refresh token: ${String(err)}`);
392
+ process.exit(1);
393
+ }
394
+ });
395
+
396
+ // ============================================
397
+ // Config Commands
398
+ // ============================================
399
+ const configCmd = program
400
+ .command('config')
401
+ .description('Manage CLI configuration (for active profile)');
402
+
403
+ configCmd
404
+ .command('set-token <token>')
405
+ .description('Set OAuth access token')
406
+ .action((token: string) => {
407
+ setAccessToken(token);
408
+ success(`Access token saved to profile: ${getCurrentProfile()}`);
409
+ });
410
+
411
+ configCmd
412
+ .command('set-api-key <apiKey>')
413
+ .description('Set API key (for read-only operations)')
414
+ .action((apiKey: string) => {
415
+ setApiKey(apiKey);
416
+ success(`API key saved to profile: ${getCurrentProfile()}`);
417
+ });
418
+
419
+ configCmd
420
+ .command('show')
421
+ .description('Show current configuration')
422
+ .action(() => {
423
+ const profileName = getCurrentProfile();
424
+ const accessToken = getAccessToken();
425
+ const apiKey = getApiKey();
426
+ const defaultChannel = getDefaultChannelId();
427
+ const namedChannels = listNamedChannels();
428
+
429
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
430
+ console.log();
431
+ info(`Base directory: ${getBaseConfigDir()}`);
432
+ info(`Profile directory: ${getConfigDir()}`);
433
+ info(`Downloads directory: ${getDownloadsDir()}`);
434
+ info(`Exports directory: ${getExportsDir()}`);
435
+ info(`Imports directory: ${getImportsDir()}`);
436
+ console.log();
437
+ info(`Access Token: ${accessToken ? `${accessToken.substring(0, 8)}...` : chalk.gray('not set')}`);
438
+ info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
439
+ info(`Default Channel: ${defaultChannel || chalk.gray('not set')}`);
440
+
441
+ const channelNames = Object.keys(namedChannels);
442
+ if (channelNames.length > 0) {
443
+ console.log();
444
+ info(`Named Channels:`);
445
+ channelNames.forEach(name => {
446
+ console.log(` ${chalk.cyan(name)}: ${namedChannels[name]}`);
447
+ });
448
+ }
449
+ });
450
+
451
+ configCmd
452
+ .command('set-channel <channelId>')
453
+ .description('Set default channel ID')
454
+ .action((channelId: string) => {
455
+ setDefaultChannelId(channelId);
456
+ success(`Default channel set: ${channelId}`);
457
+ });
458
+
459
+ configCmd
460
+ .command('set-named-channel <name> <channelId>')
461
+ .description('Set a named channel (e.g., main, vlog)')
462
+ .action((name: string, channelId: string) => {
463
+ setNamedChannel(name, channelId);
464
+ success(`Channel "${name}" set to: ${channelId}`);
465
+ });
466
+
467
+ configCmd
468
+ .command('remove-named-channel <name>')
469
+ .description('Remove a named channel')
470
+ .action((name: string) => {
471
+ if (removeNamedChannel(name)) {
472
+ success(`Named channel "${name}" removed`);
473
+ } else {
474
+ error(`Named channel "${name}" not found`);
475
+ process.exit(1);
476
+ }
477
+ });
478
+
479
+ configCmd
480
+ .command('clear')
481
+ .description('Clear configuration for active profile')
482
+ .action(() => {
483
+ clearConfig();
484
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
485
+ });
486
+
487
+ // ============================================
488
+ // Channels Commands
489
+ // ============================================
490
+ const channelsCmd = program
491
+ .command('channels')
492
+ .description('Manage YouTube channels');
493
+
494
+ channelsCmd
495
+ .command('get [channelId]')
496
+ .description('Get channel details (defaults to authenticated user\'s channel)')
497
+ .option('--parts <parts>', 'Parts to include (comma-separated)', 'snippet,statistics,contentDetails')
498
+ .action(async (channelId: string | undefined, opts) => {
499
+ try {
500
+ const client = await getClient();
501
+ const parts = opts.parts.split(',');
502
+
503
+ let result;
504
+ if (channelId) {
505
+ result = await client.channels.get(channelId, parts);
506
+ } else {
507
+ result = await client.channels.getMine(parts);
508
+ }
509
+
510
+ if (!result) {
511
+ error('Channel not found');
512
+ process.exit(1);
513
+ }
514
+
515
+ if (getFormat(channelsCmd) === 'json') {
516
+ print(result, 'json');
517
+ } else {
518
+ console.log(chalk.bold(result.snippet?.title || 'Unknown'));
519
+ if (result.snippet?.customUrl) {
520
+ console.log(` URL: youtube.com/${result.snippet.customUrl}`);
521
+ }
522
+ console.log(` ID: ${result.id}`);
523
+ if (result.statistics) {
524
+ console.log(` Subscribers: ${formatCount(result.statistics.subscriberCount)}`);
525
+ console.log(` Videos: ${formatCount(result.statistics.videoCount)}`);
526
+ console.log(` Views: ${formatCount(result.statistics.viewCount)}`);
527
+ }
528
+ if (result.snippet?.description) {
529
+ console.log(` Description: ${result.snippet.description.substring(0, 100)}...`);
530
+ }
531
+ }
532
+ } catch (err) {
533
+ error(String(err));
534
+ process.exit(1);
535
+ }
536
+ });
537
+
538
+ channelsCmd
539
+ .command('sections <channelId>')
540
+ .description('List channel sections')
541
+ .action(async (channelId: string) => {
542
+ try {
543
+ const client = await getClient();
544
+ const result = await client.channels.listSections({
545
+ part: ['snippet', 'contentDetails'],
546
+ channelId,
547
+ });
548
+ print(result.items, getFormat(channelsCmd));
549
+ } catch (err) {
550
+ error(String(err));
551
+ process.exit(1);
552
+ }
553
+ });
554
+
555
+ // ============================================
556
+ // Videos Commands
557
+ // ============================================
558
+ const videosCmd = program
559
+ .command('videos')
560
+ .description('Manage YouTube videos');
561
+
562
+ videosCmd
563
+ .command('list')
564
+ .description('List videos')
565
+ .option('--id <ids>', 'Video IDs (comma-separated)')
566
+ .option('--chart <chart>', 'Chart to retrieve (mostPopular)')
567
+ .option('--region <code>', 'Region code (e.g., US)')
568
+ .option('--category <id>', 'Video category ID')
569
+ .option('-l, --limit <number>', 'Maximum results', '10')
570
+ .option('--parts <parts>', 'Parts to include (comma-separated)', 'snippet,statistics,contentDetails')
571
+ .action(async (opts) => {
572
+ try {
573
+ const client = await getClient();
574
+ const parts = opts.parts.split(',');
575
+
576
+ const result = await client.videos.list({
577
+ part: parts,
578
+ id: opts.id?.split(','),
579
+ chart: opts.chart,
580
+ regionCode: opts.region,
581
+ videoCategoryId: opts.category,
582
+ maxResults: parseInt(opts.limit),
583
+ });
584
+
585
+ if (getFormat(videosCmd) === 'json') {
586
+ print(result, 'json');
587
+ } else {
588
+ success(`Videos (${result.pageInfo.totalResults} total):`);
589
+ result.items.forEach(video => {
590
+ console.log(` ${chalk.bold(video.snippet?.title || 'Unknown')}`);
591
+ console.log(` ID: ${video.id}`);
592
+ if (video.contentDetails?.duration) {
593
+ console.log(` Duration: ${formatDuration(video.contentDetails.duration)}`);
594
+ }
595
+ if (video.statistics) {
596
+ console.log(` Views: ${formatCount(video.statistics.viewCount)} | Likes: ${formatCount(video.statistics.likeCount || '0')}`);
597
+ }
598
+ console.log();
599
+ });
600
+ }
601
+ } catch (err) {
602
+ error(String(err));
603
+ process.exit(1);
604
+ }
605
+ });
606
+
607
+ videosCmd
608
+ .command('get <videoId>')
609
+ .description('Get video details')
610
+ .option('--parts <parts>', 'Parts to include (comma-separated)', 'snippet,statistics,contentDetails,status')
611
+ .action(async (videoId: string, opts) => {
612
+ try {
613
+ const client = await getClient();
614
+ const parts = opts.parts.split(',');
615
+ const result = await client.videos.get(videoId, parts);
616
+
617
+ if (!result) {
618
+ error('Video not found');
619
+ process.exit(1);
620
+ }
621
+
622
+ print(result, getFormat(videosCmd));
623
+ } catch (err) {
624
+ error(String(err));
625
+ process.exit(1);
626
+ }
627
+ });
628
+
629
+ videosCmd
630
+ .command('mine')
631
+ .description('List my uploaded videos')
632
+ .option('-l, --limit <number>', 'Maximum results', '25')
633
+ .option('--parts <parts>', 'Parts to include (comma-separated)', 'snippet,statistics,contentDetails')
634
+ .action(async (opts) => {
635
+ try {
636
+ const client = await requireOAuth();
637
+
638
+ // Get user's channel to find uploads playlist
639
+ const channel = await client.channels.getMine(['contentDetails']);
640
+ if (!channel?.contentDetails?.relatedPlaylists?.uploads) {
641
+ error('Could not find uploads playlist');
642
+ process.exit(1);
643
+ }
644
+
645
+ const uploadsPlaylistId = channel.contentDetails.relatedPlaylists.uploads;
646
+
647
+ // Get videos from uploads playlist
648
+ const playlistItems = await client.playlistItems.getAll(uploadsPlaylistId, parseInt(opts.limit));
649
+
650
+ if (playlistItems.items.length === 0) {
651
+ info('No videos found on your channel.');
652
+ return;
653
+ }
654
+
655
+ // Get full video details
656
+ const videoIds = playlistItems.items
657
+ .map(item => item.contentDetails?.videoId)
658
+ .filter(Boolean) as string[];
659
+
660
+ const videos = await client.videos.list({
661
+ part: opts.parts.split(','),
662
+ id: videoIds,
663
+ });
664
+
665
+ if (getFormat(videosCmd) === 'json') {
666
+ print(videos, 'json');
667
+ } else {
668
+ success(`Your videos (${playlistItems.pageInfo.totalResults} total):`);
669
+ videos.items.forEach((video, i) => {
670
+ console.log(` ${i + 1}. ${chalk.bold(video.snippet?.title || 'Unknown')}`);
671
+ console.log(` ID: ${video.id}`);
672
+ if (video.contentDetails?.duration) {
673
+ console.log(` Duration: ${formatDuration(video.contentDetails.duration)}`);
674
+ }
675
+ if (video.statistics) {
676
+ console.log(` Views: ${formatCount(video.statistics.viewCount)} | Likes: ${formatCount(video.statistics.likeCount || '0')}`);
677
+ }
678
+ console.log(` Privacy: ${video.status?.privacyStatus || 'unknown'}`);
679
+ console.log();
680
+ });
681
+ }
682
+ } catch (err) {
683
+ error(String(err));
684
+ process.exit(1);
685
+ }
686
+ });
687
+
688
+ videosCmd
689
+ .command('download <videoId>')
690
+ .description('Download a video using yt-dlp')
691
+ .option('-o, --output <path>', 'Output file path or directory (default: profile downloads dir)')
692
+ .option('--format <format>', 'Video format (e.g., best, mp4, 720p, 1080p)', 'best')
693
+ .option('--audio-only', 'Download audio only (mp3)')
694
+ .option('--list-formats', 'List available formats without downloading')
695
+ .action(async (videoId: string, opts) => {
696
+ try {
697
+ const { execSync, spawn } = await import('child_process');
698
+
699
+ // Check if yt-dlp is installed
700
+ try {
701
+ execSync('which yt-dlp', { stdio: 'ignore' });
702
+ } catch {
703
+ error('yt-dlp is not installed. Install it with: brew install yt-dlp');
704
+ process.exit(1);
705
+ }
706
+
707
+ const videoUrl = `https://www.youtube.com/watch?v=${videoId}`;
708
+
709
+ // List formats mode
710
+ if (opts.listFormats) {
711
+ info(`Available formats for ${videoId}:`);
712
+ const result = execSync(`yt-dlp -F "${videoUrl}"`, { encoding: 'utf-8' });
713
+ console.log(result);
714
+ return;
715
+ }
716
+
717
+ // Use profile downloads directory as default
718
+ const outputDir = opts.output || ensureDownloadsDir();
719
+
720
+ // Build yt-dlp command
721
+ const args: string[] = [];
722
+
723
+ if (opts.audioOnly) {
724
+ args.push('-x', '--audio-format', 'mp3');
725
+ } else if (opts.format === 'mp4') {
726
+ args.push('-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best');
727
+ } else if (opts.format === '720p') {
728
+ args.push('-f', 'bestvideo[height<=720]+bestaudio/best[height<=720]');
729
+ } else if (opts.format === '1080p') {
730
+ args.push('-f', 'bestvideo[height<=1080]+bestaudio/best[height<=1080]');
731
+ } else if (opts.format !== 'best') {
732
+ args.push('-f', opts.format);
733
+ }
734
+
735
+ // Set output template
736
+ args.push('-o', `${outputDir}/%(title)s.%(ext)s`);
737
+
738
+ args.push('--progress', videoUrl);
739
+
740
+ info(`Downloading video ${videoId} to ${outputDir}...`);
741
+
742
+ const proc = spawn('yt-dlp', args, { stdio: 'inherit' });
743
+
744
+ proc.on('close', (code) => {
745
+ if (code === 0) {
746
+ success('Download complete!');
747
+ } else {
748
+ error(`Download failed with code ${code}`);
749
+ process.exit(1);
750
+ }
751
+ });
752
+
753
+ proc.on('error', (err) => {
754
+ error(`Download failed: ${err.message}`);
755
+ process.exit(1);
756
+ });
757
+ } catch (err) {
758
+ error(String(err));
759
+ process.exit(1);
760
+ }
761
+ });
762
+
763
+ videosCmd
764
+ .command('download-mine')
765
+ .description('Download all videos from your channel')
766
+ .option('-o, --output <dir>', 'Output directory (default: profile downloads dir)')
767
+ .option('--format <format>', 'Video format (best, mp4, 720p, 1080p)', 'best')
768
+ .option('--limit <number>', 'Maximum videos to download')
769
+ .option('--dry-run', 'Show what would be downloaded without downloading')
770
+ .action(async (opts) => {
771
+ try {
772
+ const { execSync } = await import('child_process');
773
+
774
+ // Check if yt-dlp is installed
775
+ try {
776
+ execSync('which yt-dlp', { stdio: 'ignore' });
777
+ } catch {
778
+ error('yt-dlp is not installed. Install it with: brew install yt-dlp');
779
+ process.exit(1);
780
+ }
781
+
782
+ const client = await requireOAuth();
783
+
784
+ // Get user's channel to find uploads playlist
785
+ const channel = await client.channels.getMine(['contentDetails', 'snippet']);
786
+ if (!channel?.contentDetails?.relatedPlaylists?.uploads) {
787
+ error('Could not find uploads playlist');
788
+ process.exit(1);
789
+ }
790
+
791
+ info(`Channel: ${channel.snippet?.title}`);
792
+
793
+ const uploadsPlaylistId = channel.contentDetails.relatedPlaylists.uploads;
794
+ const limit = opts.limit ? parseInt(opts.limit) : 500;
795
+
796
+ // Get videos from uploads playlist
797
+ const playlistItems = await client.playlistItems.getAll(uploadsPlaylistId, limit);
798
+
799
+ if (playlistItems.items.length === 0) {
800
+ info('No videos found on your channel.');
801
+ return;
802
+ }
803
+
804
+ info(`Found ${playlistItems.items.length} videos`);
805
+
806
+ // Use profile downloads directory as default
807
+ const outputDir = opts.output || ensureDownloadsDir();
808
+ info(`Download directory: ${outputDir}`);
809
+
810
+ if (opts.dryRun) {
811
+ success('Videos that would be downloaded:');
812
+ playlistItems.items.forEach((item, i) => {
813
+ console.log(` ${i + 1}. ${item.snippet?.title} (${item.contentDetails?.videoId})`);
814
+ });
815
+ return;
816
+ }
817
+
818
+ // Build format string
819
+ let formatStr = '';
820
+ if (opts.format === 'mp4') {
821
+ formatStr = '-f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best';
822
+ } else if (opts.format === '720p') {
823
+ formatStr = '-f bestvideo[height<=720]+bestaudio/best[height<=720]';
824
+ } else if (opts.format === '1080p') {
825
+ formatStr = '-f bestvideo[height<=1080]+bestaudio/best[height<=1080]';
826
+ }
827
+
828
+ // Download each video
829
+ for (let i = 0; i < playlistItems.items.length; i++) {
830
+ const item = playlistItems.items[i];
831
+ const videoId = item.contentDetails?.videoId;
832
+ const title = item.snippet?.title || 'Unknown';
833
+
834
+ if (!videoId) continue;
835
+
836
+ info(`[${i + 1}/${playlistItems.items.length}] Downloading: ${title}`);
837
+
838
+ const videoUrl = `https://www.youtube.com/watch?v=${videoId}`;
839
+ const outputTemplate = `${outputDir}/%(title)s.%(ext)s`;
840
+
841
+ try {
842
+ execSync(
843
+ `yt-dlp ${formatStr} -o "${outputTemplate}" --no-overwrites "${videoUrl}"`,
844
+ { stdio: 'inherit' }
845
+ );
846
+ success(`Downloaded: ${title}`);
847
+ } catch (err) {
848
+ error(`Failed to download: ${title}`);
849
+ }
850
+ }
851
+
852
+ success(`\nDownload complete! ${playlistItems.items.length} videos processed.`);
853
+ } catch (err) {
854
+ error(String(err));
855
+ process.exit(1);
856
+ }
857
+ });
858
+
859
+ videosCmd
860
+ .command('upload <filePath>')
861
+ .description('Upload a video')
862
+ .requiredOption('--title <title>', 'Video title')
863
+ .option('--description <description>', 'Video description')
864
+ .option('--tags <tags>', 'Tags (comma-separated)')
865
+ .option('--category <id>', 'Category ID', '22')
866
+ .option('--privacy <status>', 'Privacy status (public, private, unlisted)', 'private')
867
+ .action(async (filePath: string, opts) => {
868
+ try {
869
+ const client = await requireOAuth();
870
+ const { readFileSync } = await import('fs');
871
+
872
+ info(`Reading file: ${filePath}`);
873
+ const videoData = readFileSync(filePath);
874
+
875
+ info(`Uploading video (${(videoData.length / 1024 / 1024).toFixed(1)} MB)...`);
876
+
877
+ const metadata = {
878
+ snippet: {
879
+ title: opts.title,
880
+ description: opts.description || '',
881
+ tags: opts.tags?.split(','),
882
+ categoryId: opts.category,
883
+ },
884
+ status: {
885
+ privacyStatus: opts.privacy,
886
+ },
887
+ };
888
+ const result = await client.videos.uploadResumable(
889
+ videoData,
890
+ metadata as any,
891
+ { part: ['snippet', 'status'] },
892
+ (progress) => {
893
+ process.stdout.write(`\rProgress: ${progress.percentage}%`);
894
+ }
895
+ );
896
+
897
+ console.log();
898
+ success('Video uploaded!');
899
+ console.log(` ID: ${result.id}`);
900
+ console.log(` URL: https://youtube.com/watch?v=${result.id}`);
901
+ } catch (err) {
902
+ error(String(err));
903
+ process.exit(1);
904
+ }
905
+ });
906
+
907
+ videosCmd
908
+ .command('update <videoId>')
909
+ .description('Update video metadata')
910
+ .option('--title <title>', 'New title')
911
+ .option('--description <description>', 'New description')
912
+ .option('--tags <tags>', 'New tags (comma-separated)')
913
+ .option('--privacy <status>', 'Privacy status (public, private, unlisted)')
914
+ .action(async (videoId: string, opts) => {
915
+ try {
916
+ const client = await requireOAuth();
917
+ const parts: string[] = [];
918
+ const video: Record<string, unknown> = { id: videoId };
919
+
920
+ if (opts.title || opts.description || opts.tags) {
921
+ parts.push('snippet');
922
+ video.snippet = {};
923
+ if (opts.title) (video.snippet as Record<string, unknown>).title = opts.title;
924
+ if (opts.description) (video.snippet as Record<string, unknown>).description = opts.description;
925
+ if (opts.tags) (video.snippet as Record<string, unknown>).tags = opts.tags.split(',');
926
+ }
927
+
928
+ if (opts.privacy) {
929
+ parts.push('status');
930
+ video.status = { privacyStatus: opts.privacy };
931
+ }
932
+
933
+ if (parts.length === 0) {
934
+ error('No updates specified');
935
+ process.exit(1);
936
+ }
937
+
938
+ const result = await client.videos.update(video as any, { part: parts });
939
+ success('Video updated!');
940
+ print(result, getFormat(videosCmd));
941
+ } catch (err) {
942
+ error(String(err));
943
+ process.exit(1);
944
+ }
945
+ });
946
+
947
+ videosCmd
948
+ .command('delete <videoId>')
949
+ .description('Delete a video')
950
+ .action(async (videoId: string) => {
951
+ try {
952
+ const client = await requireOAuth();
953
+ await client.videos.delete(videoId);
954
+ success('Video deleted');
955
+ } catch (err) {
956
+ error(String(err));
957
+ process.exit(1);
958
+ }
959
+ });
960
+
961
+ videosCmd
962
+ .command('rate <videoId>')
963
+ .description('Rate a video')
964
+ .requiredOption('-r, --rating <rating>', 'Rating (like, dislike, none)')
965
+ .action(async (videoId: string, opts) => {
966
+ try {
967
+ const client = await requireOAuth();
968
+ await client.videos.rate(videoId, opts.rating);
969
+ success(`Video rated: ${opts.rating}`);
970
+ } catch (err) {
971
+ error(String(err));
972
+ process.exit(1);
973
+ }
974
+ });
975
+
976
+ // ============================================
977
+ // Playlists Commands
978
+ // ============================================
979
+ const playlistsCmd = program
980
+ .command('playlists')
981
+ .description('Manage YouTube playlists');
982
+
983
+ playlistsCmd
984
+ .command('list')
985
+ .description('List playlists')
986
+ .option('--mine', 'List my playlists')
987
+ .option('--channel <channelId>', 'List playlists for a channel')
988
+ .option('-l, --limit <number>', 'Maximum results', '25')
989
+ .action(async (opts) => {
990
+ try {
991
+ const client = await getClient();
992
+
993
+ let result;
994
+ if (opts.mine) {
995
+ result = await client.playlists.getMine(parseInt(opts.limit));
996
+ } else if (opts.channel) {
997
+ result = await client.playlists.getByChannel(opts.channel, parseInt(opts.limit));
998
+ } else {
999
+ error('Specify --mine or --channel <channelId>');
1000
+ process.exit(1);
1001
+ }
1002
+
1003
+ if (getFormat(playlistsCmd) === 'json') {
1004
+ print(result, 'json');
1005
+ } else {
1006
+ success(`Playlists (${result.pageInfo.totalResults} total):`);
1007
+ result.items.forEach(playlist => {
1008
+ console.log(` ${chalk.bold(playlist.snippet?.title || 'Unknown')}`);
1009
+ console.log(` ID: ${playlist.id}`);
1010
+ console.log(` Items: ${playlist.contentDetails?.itemCount || 0}`);
1011
+ console.log(` Privacy: ${playlist.status?.privacyStatus || 'unknown'}`);
1012
+ console.log();
1013
+ });
1014
+ }
1015
+ } catch (err) {
1016
+ error(String(err));
1017
+ process.exit(1);
1018
+ }
1019
+ });
1020
+
1021
+ playlistsCmd
1022
+ .command('create')
1023
+ .description('Create a new playlist')
1024
+ .requiredOption('--title <title>', 'Playlist title')
1025
+ .option('--description <description>', 'Playlist description')
1026
+ .option('--privacy <status>', 'Privacy status (public, private, unlisted)', 'private')
1027
+ .action(async (opts) => {
1028
+ try {
1029
+ const client = await requireOAuth();
1030
+ const result = await client.playlists.create(
1031
+ opts.title,
1032
+ opts.description,
1033
+ opts.privacy
1034
+ );
1035
+ success('Playlist created!');
1036
+ console.log(` ID: ${result.id}`);
1037
+ console.log(` URL: https://youtube.com/playlist?list=${result.id}`);
1038
+ } catch (err) {
1039
+ error(String(err));
1040
+ process.exit(1);
1041
+ }
1042
+ });
1043
+
1044
+ playlistsCmd
1045
+ .command('update <playlistId>')
1046
+ .description('Update a playlist')
1047
+ .option('--title <title>', 'New title')
1048
+ .option('--description <description>', 'New description')
1049
+ .option('--privacy <status>', 'Privacy status (public, private, unlisted)')
1050
+ .action(async (playlistId: string, opts) => {
1051
+ try {
1052
+ const client = await requireOAuth();
1053
+ const result = await client.playlists.updateMetadata(
1054
+ playlistId,
1055
+ opts.title,
1056
+ opts.description,
1057
+ opts.privacy
1058
+ );
1059
+ success('Playlist updated!');
1060
+ print(result, getFormat(playlistsCmd));
1061
+ } catch (err) {
1062
+ error(String(err));
1063
+ process.exit(1);
1064
+ }
1065
+ });
1066
+
1067
+ playlistsCmd
1068
+ .command('delete <playlistId>')
1069
+ .description('Delete a playlist')
1070
+ .action(async (playlistId: string) => {
1071
+ try {
1072
+ const client = await requireOAuth();
1073
+ await client.playlists.delete(playlistId);
1074
+ success('Playlist deleted');
1075
+ } catch (err) {
1076
+ error(String(err));
1077
+ process.exit(1);
1078
+ }
1079
+ });
1080
+
1081
+ // ============================================
1082
+ // Playlist Items Commands
1083
+ // ============================================
1084
+ const playlistItemsCmd = program
1085
+ .command('playlist-items')
1086
+ .description('Manage playlist items');
1087
+
1088
+ playlistItemsCmd
1089
+ .command('list <playlistId>')
1090
+ .description('List items in a playlist')
1091
+ .option('-l, --limit <number>', 'Maximum results', '50')
1092
+ .action(async (playlistId: string, opts) => {
1093
+ try {
1094
+ const client = await getClient();
1095
+ const result = await client.playlistItems.getAll(playlistId, parseInt(opts.limit));
1096
+
1097
+ if (getFormat(playlistItemsCmd) === 'json') {
1098
+ print(result, 'json');
1099
+ } else {
1100
+ success(`Playlist items (${result.pageInfo.totalResults} total):`);
1101
+ result.items.forEach((item, i) => {
1102
+ console.log(` ${i + 1}. ${chalk.bold(item.snippet?.title || 'Unknown')}`);
1103
+ console.log(` Video ID: ${item.contentDetails?.videoId}`);
1104
+ console.log(` Item ID: ${item.id}`);
1105
+ console.log();
1106
+ });
1107
+ }
1108
+ } catch (err) {
1109
+ error(String(err));
1110
+ process.exit(1);
1111
+ }
1112
+ });
1113
+
1114
+ playlistItemsCmd
1115
+ .command('add <playlistId> <videoId>')
1116
+ .description('Add a video to a playlist')
1117
+ .option('--position <number>', 'Position in playlist')
1118
+ .action(async (playlistId: string, videoId: string, opts) => {
1119
+ try {
1120
+ const client = await requireOAuth();
1121
+ const result = await client.playlistItems.add(
1122
+ playlistId,
1123
+ videoId,
1124
+ opts.position ? parseInt(opts.position) : undefined
1125
+ );
1126
+ success('Video added to playlist!');
1127
+ console.log(` Item ID: ${result.id}`);
1128
+ } catch (err) {
1129
+ error(String(err));
1130
+ process.exit(1);
1131
+ }
1132
+ });
1133
+
1134
+ playlistItemsCmd
1135
+ .command('remove <playlistItemId>')
1136
+ .description('Remove an item from a playlist')
1137
+ .action(async (playlistItemId: string) => {
1138
+ try {
1139
+ const client = await requireOAuth();
1140
+ await client.playlistItems.delete(playlistItemId);
1141
+ success('Item removed from playlist');
1142
+ } catch (err) {
1143
+ error(String(err));
1144
+ process.exit(1);
1145
+ }
1146
+ });
1147
+
1148
+ // ============================================
1149
+ // Search Commands
1150
+ // ============================================
1151
+ const searchCmd = program
1152
+ .command('search')
1153
+ .description('Search YouTube');
1154
+
1155
+ searchCmd
1156
+ .command('videos <query>')
1157
+ .description('Search for videos')
1158
+ .option('-l, --limit <number>', 'Maximum results', '10')
1159
+ .option('--order <order>', 'Sort order (date, rating, relevance, title, viewCount)', 'relevance')
1160
+ .option('--region <code>', 'Region code (e.g., US)')
1161
+ .option('--duration <duration>', 'Duration filter (short, medium, long)')
1162
+ .option('--definition <def>', 'Definition filter (high, standard)')
1163
+ .action(async (query: string, opts) => {
1164
+ try {
1165
+ const client = await getClient();
1166
+ const result = await client.search.videos(query, {
1167
+ maxResults: parseInt(opts.limit),
1168
+ order: opts.order,
1169
+ regionCode: opts.region,
1170
+ videoDuration: opts.duration,
1171
+ videoDefinition: opts.definition,
1172
+ });
1173
+
1174
+ if (getFormat(searchCmd) === 'json') {
1175
+ print(result, 'json');
1176
+ } else {
1177
+ success(`Search results for "${query}":`);
1178
+ result.items.forEach(item => {
1179
+ console.log(` ${chalk.bold(item.snippet?.title || 'Unknown')}`);
1180
+ console.log(` ID: ${item.id.videoId}`);
1181
+ console.log(` Channel: ${item.snippet?.channelTitle}`);
1182
+ console.log(` Published: ${formatDate(item.snippet?.publishedAt || '')}`);
1183
+ console.log();
1184
+ });
1185
+ }
1186
+ } catch (err) {
1187
+ error(String(err));
1188
+ process.exit(1);
1189
+ }
1190
+ });
1191
+
1192
+ searchCmd
1193
+ .command('channels <query>')
1194
+ .description('Search for channels')
1195
+ .option('-l, --limit <number>', 'Maximum results', '10')
1196
+ .action(async (query: string, opts) => {
1197
+ try {
1198
+ const client = await getClient();
1199
+ const result = await client.search.channels(query, {
1200
+ maxResults: parseInt(opts.limit),
1201
+ });
1202
+
1203
+ if (getFormat(searchCmd) === 'json') {
1204
+ print(result, 'json');
1205
+ } else {
1206
+ success(`Channels matching "${query}":`);
1207
+ result.items.forEach(item => {
1208
+ console.log(` ${chalk.bold(item.snippet?.title || 'Unknown')}`);
1209
+ console.log(` ID: ${item.id.channelId}`);
1210
+ console.log(` Description: ${(item.snippet?.description || '').substring(0, 80)}...`);
1211
+ console.log();
1212
+ });
1213
+ }
1214
+ } catch (err) {
1215
+ error(String(err));
1216
+ process.exit(1);
1217
+ }
1218
+ });
1219
+
1220
+ searchCmd
1221
+ .command('playlists <query>')
1222
+ .description('Search for playlists')
1223
+ .option('-l, --limit <number>', 'Maximum results', '10')
1224
+ .action(async (query: string, opts) => {
1225
+ try {
1226
+ const client = await getClient();
1227
+ const result = await client.search.playlists(query, {
1228
+ maxResults: parseInt(opts.limit),
1229
+ });
1230
+
1231
+ if (getFormat(searchCmd) === 'json') {
1232
+ print(result, 'json');
1233
+ } else {
1234
+ success(`Playlists matching "${query}":`);
1235
+ result.items.forEach(item => {
1236
+ console.log(` ${chalk.bold(item.snippet?.title || 'Unknown')}`);
1237
+ console.log(` ID: ${item.id.playlistId}`);
1238
+ console.log(` Channel: ${item.snippet?.channelTitle}`);
1239
+ console.log();
1240
+ });
1241
+ }
1242
+ } catch (err) {
1243
+ error(String(err));
1244
+ process.exit(1);
1245
+ }
1246
+ });
1247
+
1248
+ // ============================================
1249
+ // Comments Commands
1250
+ // ============================================
1251
+ const commentsCmd = program
1252
+ .command('comments')
1253
+ .description('Manage comments');
1254
+
1255
+ commentsCmd
1256
+ .command('list <videoId>')
1257
+ .description('List comments on a video')
1258
+ .option('-l, --limit <number>', 'Maximum results', '20')
1259
+ .option('--order <order>', 'Sort order (relevance, time)', 'relevance')
1260
+ .action(async (videoId: string, opts) => {
1261
+ try {
1262
+ const client = await getClient();
1263
+ const result = await client.commentThreads.getForVideo(videoId, {
1264
+ maxResults: parseInt(opts.limit),
1265
+ order: opts.order,
1266
+ });
1267
+
1268
+ if (getFormat(commentsCmd) === 'json') {
1269
+ print(result, 'json');
1270
+ } else {
1271
+ success(`Comments (${result.pageInfo.totalResults} total):`);
1272
+ result.items.forEach(thread => {
1273
+ const comment = thread.snippet.topLevelComment;
1274
+ console.log(` ${chalk.bold(comment.snippet.authorDisplayName)}`);
1275
+ console.log(` ${comment.snippet.textDisplay.substring(0, 100)}...`);
1276
+ console.log(` Likes: ${comment.snippet.likeCount} | Replies: ${thread.snippet.totalReplyCount}`);
1277
+ console.log(` ID: ${thread.id}`);
1278
+ console.log();
1279
+ });
1280
+ }
1281
+ } catch (err) {
1282
+ error(String(err));
1283
+ process.exit(1);
1284
+ }
1285
+ });
1286
+
1287
+ commentsCmd
1288
+ .command('reply <commentId> <text>')
1289
+ .description('Reply to a comment')
1290
+ .action(async (commentId: string, text: string) => {
1291
+ try {
1292
+ const client = await requireOAuth();
1293
+ const result = await client.comments.reply(commentId, text);
1294
+ success('Reply posted!');
1295
+ console.log(` ID: ${result.id}`);
1296
+ } catch (err) {
1297
+ error(String(err));
1298
+ process.exit(1);
1299
+ }
1300
+ });
1301
+
1302
+ commentsCmd
1303
+ .command('delete <commentId>')
1304
+ .description('Delete a comment')
1305
+ .action(async (commentId: string) => {
1306
+ try {
1307
+ const client = await requireOAuth();
1308
+ await client.comments.delete(commentId);
1309
+ success('Comment deleted');
1310
+ } catch (err) {
1311
+ error(String(err));
1312
+ process.exit(1);
1313
+ }
1314
+ });
1315
+
1316
+ commentsCmd
1317
+ .command('moderate <commentIds>')
1318
+ .description('Moderate comments')
1319
+ .requiredOption('--status <status>', 'Moderation status (heldForReview, published, rejected, likelySpam)')
1320
+ .option('--ban', 'Ban the author (for rejected)')
1321
+ .action(async (commentIds: string, opts) => {
1322
+ try {
1323
+ const client = await requireOAuth();
1324
+ const ids = commentIds.split(',');
1325
+ await client.comments.setModerationStatus(ids, opts.status, opts.ban);
1326
+ success(`Comments moderation status set to: ${opts.status}`);
1327
+ } catch (err) {
1328
+ error(String(err));
1329
+ process.exit(1);
1330
+ }
1331
+ });
1332
+
1333
+ // ============================================
1334
+ // Subscriptions Commands
1335
+ // ============================================
1336
+ const subscriptionsCmd = program
1337
+ .command('subscriptions')
1338
+ .description('Manage subscriptions');
1339
+
1340
+ subscriptionsCmd
1341
+ .command('list')
1342
+ .description('List my subscriptions')
1343
+ .option('-l, --limit <number>', 'Maximum results', '25')
1344
+ .option('--order <order>', 'Sort order (alphabetical, relevance, unread)', 'relevance')
1345
+ .action(async (opts) => {
1346
+ try {
1347
+ const client = await requireOAuth();
1348
+ const result = await client.subscriptions.getMine(parseInt(opts.limit), opts.order);
1349
+
1350
+ if (getFormat(subscriptionsCmd) === 'json') {
1351
+ print(result, 'json');
1352
+ } else {
1353
+ success(`Subscriptions (${result.pageInfo.totalResults} total):`);
1354
+ result.items.forEach(sub => {
1355
+ console.log(` ${chalk.bold(sub.snippet?.title || 'Unknown')}`);
1356
+ console.log(` Channel: ${sub.snippet?.resourceId.channelId}`);
1357
+ console.log(` Videos: ${sub.contentDetails?.totalItemCount || 0}`);
1358
+ console.log();
1359
+ });
1360
+ }
1361
+ } catch (err) {
1362
+ error(String(err));
1363
+ process.exit(1);
1364
+ }
1365
+ });
1366
+
1367
+ subscriptionsCmd
1368
+ .command('subscribe <channelId>')
1369
+ .description('Subscribe to a channel')
1370
+ .action(async (channelId: string) => {
1371
+ try {
1372
+ const client = await requireOAuth();
1373
+ const result = await client.subscriptions.subscribe(channelId);
1374
+ success('Subscribed!');
1375
+ console.log(` Subscription ID: ${result.id}`);
1376
+ } catch (err) {
1377
+ error(String(err));
1378
+ process.exit(1);
1379
+ }
1380
+ });
1381
+
1382
+ subscriptionsCmd
1383
+ .command('unsubscribe <channelId>')
1384
+ .description('Unsubscribe from a channel')
1385
+ .action(async (channelId: string) => {
1386
+ try {
1387
+ const client = await requireOAuth();
1388
+ const unsubscribed = await client.subscriptions.unsubscribe(channelId);
1389
+ if (unsubscribed) {
1390
+ success('Unsubscribed');
1391
+ } else {
1392
+ info('Not subscribed to this channel');
1393
+ }
1394
+ } catch (err) {
1395
+ error(String(err));
1396
+ process.exit(1);
1397
+ }
1398
+ });
1399
+
1400
+ // ============================================
1401
+ // Captions Commands
1402
+ // ============================================
1403
+ const captionsCmd = program
1404
+ .command('captions')
1405
+ .description('Manage video captions');
1406
+
1407
+ captionsCmd
1408
+ .command('list <videoId>')
1409
+ .description('List captions for a video')
1410
+ .action(async (videoId: string) => {
1411
+ try {
1412
+ const client = await requireOAuth();
1413
+ const result = await client.captions.getForVideo(videoId);
1414
+
1415
+ if (getFormat(captionsCmd) === 'json') {
1416
+ print(result, 'json');
1417
+ } else {
1418
+ success(`Captions:`);
1419
+ result.items.forEach(caption => {
1420
+ console.log(` ${chalk.bold(caption.snippet.name || caption.snippet.language)}`);
1421
+ console.log(` ID: ${caption.id}`);
1422
+ console.log(` Language: ${caption.snippet.language}`);
1423
+ console.log(` Kind: ${caption.snippet.trackKind}`);
1424
+ console.log(` Status: ${caption.snippet.status}`);
1425
+ console.log();
1426
+ });
1427
+ }
1428
+ } catch (err) {
1429
+ error(String(err));
1430
+ process.exit(1);
1431
+ }
1432
+ });
1433
+
1434
+ captionsCmd
1435
+ .command('download <captionId>')
1436
+ .description('Download a caption track')
1437
+ .option('--format <format>', 'Format (srt, vtt, ttml, sbv, scc)', 'srt')
1438
+ .option('-o, --output <file>', 'Output file')
1439
+ .action(async (captionId: string, opts) => {
1440
+ try {
1441
+ const client = await requireOAuth();
1442
+ const content = await client.captions.download(captionId, { tfmt: opts.format });
1443
+
1444
+ if (opts.output) {
1445
+ const { writeFileSync } = await import('fs');
1446
+ writeFileSync(opts.output, content);
1447
+ success(`Caption saved to: ${opts.output}`);
1448
+ } else {
1449
+ console.log(content);
1450
+ }
1451
+ } catch (err) {
1452
+ error(String(err));
1453
+ process.exit(1);
1454
+ }
1455
+ });
1456
+
1457
+ captionsCmd
1458
+ .command('delete <captionId>')
1459
+ .description('Delete a caption track')
1460
+ .action(async (captionId: string) => {
1461
+ try {
1462
+ const client = await requireOAuth();
1463
+ await client.captions.delete(captionId);
1464
+ success('Caption deleted');
1465
+ } catch (err) {
1466
+ error(String(err));
1467
+ process.exit(1);
1468
+ }
1469
+ });
1470
+
1471
+ // ============================================
1472
+ // Thumbnails Commands
1473
+ // ============================================
1474
+ const thumbnailsCmd = program
1475
+ .command('thumbnails')
1476
+ .description('Manage video thumbnails');
1477
+
1478
+ thumbnailsCmd
1479
+ .command('set <videoId> <imagePath>')
1480
+ .description('Set a custom thumbnail for a video')
1481
+ .action(async (videoId: string, imagePath: string) => {
1482
+ try {
1483
+ const client = await requireOAuth();
1484
+ const result = await client.thumbnails.setFromFile(videoId, imagePath);
1485
+ success('Thumbnail set!');
1486
+ print(result.items[0], getFormat(thumbnailsCmd));
1487
+ } catch (err) {
1488
+ error(String(err));
1489
+ process.exit(1);
1490
+ }
1491
+ });
1492
+
1493
+ // ============================================
1494
+ // Live Commands
1495
+ // ============================================
1496
+ const liveCmd = program
1497
+ .command('live')
1498
+ .description('Manage live broadcasts and streams');
1499
+
1500
+ liveCmd
1501
+ .command('broadcasts')
1502
+ .description('List my live broadcasts')
1503
+ .option('--status <status>', 'Filter by status (active, all, completed, upcoming)')
1504
+ .option('-l, --limit <number>', 'Maximum results', '25')
1505
+ .action(async (opts) => {
1506
+ try {
1507
+ const client = await requireOAuth();
1508
+ const result = await client.live.getMyBroadcasts(opts.status, parseInt(opts.limit));
1509
+
1510
+ if (getFormat(liveCmd) === 'json') {
1511
+ print(result, 'json');
1512
+ } else {
1513
+ success(`Broadcasts (${result.pageInfo.totalResults} total):`);
1514
+ result.items.forEach(broadcast => {
1515
+ console.log(` ${chalk.bold(broadcast.snippet?.title || 'Unknown')}`);
1516
+ console.log(` ID: ${broadcast.id}`);
1517
+ console.log(` Status: ${broadcast.status?.lifeCycleStatus}`);
1518
+ console.log(` Scheduled: ${broadcast.snippet?.scheduledStartTime}`);
1519
+ console.log();
1520
+ });
1521
+ }
1522
+ } catch (err) {
1523
+ error(String(err));
1524
+ process.exit(1);
1525
+ }
1526
+ });
1527
+
1528
+ liveCmd
1529
+ .command('streams')
1530
+ .description('List my live streams')
1531
+ .option('-l, --limit <number>', 'Maximum results', '25')
1532
+ .action(async (opts) => {
1533
+ try {
1534
+ const client = await requireOAuth();
1535
+ const result = await client.live.getMyStreams(parseInt(opts.limit));
1536
+
1537
+ if (getFormat(liveCmd) === 'json') {
1538
+ print(result, 'json');
1539
+ } else {
1540
+ success(`Streams (${result.pageInfo.totalResults} total):`);
1541
+ result.items.forEach(stream => {
1542
+ console.log(` ${chalk.bold(stream.snippet?.title || 'Unknown')}`);
1543
+ console.log(` ID: ${stream.id}`);
1544
+ console.log(` Status: ${stream.status?.streamStatus}`);
1545
+ if (stream.cdn?.ingestionInfo) {
1546
+ console.log(` Stream Key: ${stream.cdn.ingestionInfo.streamName.substring(0, 10)}...`);
1547
+ }
1548
+ console.log();
1549
+ });
1550
+ }
1551
+ } catch (err) {
1552
+ error(String(err));
1553
+ process.exit(1);
1554
+ }
1555
+ });
1556
+
1557
+ liveCmd
1558
+ .command('chat <liveChatId>')
1559
+ .description('View live chat messages')
1560
+ .option('-l, --limit <number>', 'Maximum results', '50')
1561
+ .action(async (liveChatId: string, opts) => {
1562
+ try {
1563
+ const client = await requireOAuth();
1564
+ const result = await client.live.getChatMessages(liveChatId, parseInt(opts.limit));
1565
+
1566
+ if (getFormat(liveCmd) === 'json') {
1567
+ print(result, 'json');
1568
+ } else {
1569
+ success(`Chat messages (polling interval: ${result.pollingIntervalMillis}ms):`);
1570
+ result.items.forEach(msg => {
1571
+ const author = msg.authorDetails?.displayName || 'Unknown';
1572
+ const text = msg.snippet?.displayMessage || msg.snippet?.textMessageDetails?.messageText || '';
1573
+ console.log(` ${chalk.bold(author)}: ${text}`);
1574
+ });
1575
+ }
1576
+ } catch (err) {
1577
+ error(String(err));
1578
+ process.exit(1);
1579
+ }
1580
+ });
1581
+
1582
+ // ============================================
1583
+ // Analytics Commands
1584
+ // ============================================
1585
+ const analyticsCmd = program
1586
+ .command('analytics')
1587
+ .description('YouTube Analytics');
1588
+
1589
+ analyticsCmd
1590
+ .command('report')
1591
+ .description('Get analytics report')
1592
+ .requiredOption('--start <date>', 'Start date (YYYY-MM-DD)')
1593
+ .requiredOption('--end <date>', 'End date (YYYY-MM-DD)')
1594
+ .option('--channel <channelId>', 'Channel ID (defaults to authenticated user)')
1595
+ .option('--metrics <metrics>', 'Metrics (comma-separated)', 'views,estimatedMinutesWatched,subscribersGained')
1596
+ .option('--dimensions <dimensions>', 'Dimensions (comma-separated)')
1597
+ .option('--filters <filters>', 'Filters')
1598
+ .option('-l, --limit <number>', 'Maximum results')
1599
+ .action(async (opts) => {
1600
+ try {
1601
+ const client = await requireOAuth();
1602
+ const result = await client.analytics.query({
1603
+ ids: opts.channel ? `channel==${opts.channel}` : 'channel==MINE',
1604
+ startDate: opts.start,
1605
+ endDate: opts.end,
1606
+ metrics: opts.metrics,
1607
+ dimensions: opts.dimensions,
1608
+ filters: opts.filters,
1609
+ maxResults: opts.limit ? parseInt(opts.limit) : undefined,
1610
+ });
1611
+
1612
+ print(result, getFormat(analyticsCmd));
1613
+ } catch (err) {
1614
+ error(String(err));
1615
+ process.exit(1);
1616
+ }
1617
+ });
1618
+
1619
+ analyticsCmd
1620
+ .command('groups')
1621
+ .description('List analytics groups')
1622
+ .action(async () => {
1623
+ try {
1624
+ const client = await requireOAuth();
1625
+ const result = await client.analytics.getMyGroups();
1626
+ print(result.items, getFormat(analyticsCmd));
1627
+ } catch (err) {
1628
+ error(String(err));
1629
+ process.exit(1);
1630
+ }
1631
+ });
1632
+
1633
+ // ============================================
1634
+ // Members Commands
1635
+ // ============================================
1636
+ const membersCmd = program
1637
+ .command('members')
1638
+ .description('Manage channel memberships');
1639
+
1640
+ membersCmd
1641
+ .command('list')
1642
+ .description('List channel members')
1643
+ .option('-l, --limit <number>', 'Maximum results', '100')
1644
+ .action(async (opts) => {
1645
+ try {
1646
+ const client = await requireOAuth();
1647
+ const result = await client.members.getAllCurrent(parseInt(opts.limit));
1648
+
1649
+ if (getFormat(membersCmd) === 'json') {
1650
+ print(result, 'json');
1651
+ } else {
1652
+ success(`Members (${result.pageInfo.totalResults} total):`);
1653
+ result.items.forEach(member => {
1654
+ const details = member.snippet.memberDetails;
1655
+ console.log(` ${chalk.bold(details.displayName)}`);
1656
+ console.log(` Channel: ${details.channelId}`);
1657
+ console.log(` Level: ${member.snippet.membershipsDetails.highestAccessibleLevelDisplayName}`);
1658
+ console.log();
1659
+ });
1660
+ }
1661
+ } catch (err) {
1662
+ error(String(err));
1663
+ process.exit(1);
1664
+ }
1665
+ });
1666
+
1667
+ membersCmd
1668
+ .command('levels')
1669
+ .description('List membership levels')
1670
+ .action(async () => {
1671
+ try {
1672
+ const client = await requireOAuth();
1673
+ const result = await client.members.getLevels();
1674
+
1675
+ if (getFormat(membersCmd) === 'json') {
1676
+ print(result, 'json');
1677
+ } else {
1678
+ success(`Membership levels:`);
1679
+ result.items.forEach(level => {
1680
+ console.log(` ${chalk.bold(level.snippet.levelDetails.displayName)}`);
1681
+ console.log(` ID: ${level.id}`);
1682
+ console.log();
1683
+ });
1684
+ }
1685
+ } catch (err) {
1686
+ error(String(err));
1687
+ process.exit(1);
1688
+ }
1689
+ });
1690
+
1691
+ // ============================================
1692
+ // Categories Commands
1693
+ // ============================================
1694
+ const categoriesCmd = program
1695
+ .command('categories')
1696
+ .description('Video categories and i18n');
1697
+
1698
+ categoriesCmd
1699
+ .command('list')
1700
+ .description('List video categories')
1701
+ .option('--region <code>', 'Region code (e.g., US)', 'US')
1702
+ .action(async (opts) => {
1703
+ try {
1704
+ const client = await getClient();
1705
+ const result = await client.categories.getForRegion(opts.region);
1706
+
1707
+ if (getFormat(categoriesCmd) === 'json') {
1708
+ print(result, 'json');
1709
+ } else {
1710
+ success(`Video categories for ${opts.region}:`);
1711
+ result.items.forEach(cat => {
1712
+ if (cat.snippet.assignable) {
1713
+ console.log(` ${cat.id}: ${cat.snippet.title}`);
1714
+ }
1715
+ });
1716
+ }
1717
+ } catch (err) {
1718
+ error(String(err));
1719
+ process.exit(1);
1720
+ }
1721
+ });
1722
+
1723
+ categoriesCmd
1724
+ .command('languages')
1725
+ .description('List supported languages')
1726
+ .action(async () => {
1727
+ try {
1728
+ const client = await getClient();
1729
+ const result = await client.categories.getLanguages();
1730
+
1731
+ if (getFormat(categoriesCmd) === 'json') {
1732
+ print(result, 'json');
1733
+ } else {
1734
+ success(`Supported languages:`);
1735
+ result.items.forEach(lang => {
1736
+ console.log(` ${lang.snippet.hl}: ${lang.snippet.name}`);
1737
+ });
1738
+ }
1739
+ } catch (err) {
1740
+ error(String(err));
1741
+ process.exit(1);
1742
+ }
1743
+ });
1744
+
1745
+ categoriesCmd
1746
+ .command('regions')
1747
+ .description('List supported regions')
1748
+ .action(async () => {
1749
+ try {
1750
+ const client = await getClient();
1751
+ const result = await client.categories.getRegions();
1752
+
1753
+ if (getFormat(categoriesCmd) === 'json') {
1754
+ print(result, 'json');
1755
+ } else {
1756
+ success(`Supported regions:`);
1757
+ result.items.forEach(region => {
1758
+ console.log(` ${region.snippet.gl}: ${region.snippet.name}`);
1759
+ });
1760
+ }
1761
+ } catch (err) {
1762
+ error(String(err));
1763
+ process.exit(1);
1764
+ }
1765
+ });
1766
+
1767
+ // Parse and execute
1768
+ program.parse();