@hasna/connectors 0.6.0 → 0.7.0

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 (411) hide show
  1. package/bin/index.js +181 -6
  2. package/bin/mcp.js +162 -1
  3. package/bin/serve.js +180 -5
  4. package/connectors/connect-activecampaign/.env.example +11 -0
  5. package/connectors/connect-activecampaign/CLAUDE.md +68 -0
  6. package/connectors/connect-activecampaign/README.md +193 -0
  7. package/connectors/connect-activecampaign/package.json +53 -0
  8. package/connectors/connect-activecampaign/scripts/release.ts +179 -0
  9. package/connectors/connect-activecampaign/src/api/accounts.ts +44 -0
  10. package/connectors/connect-activecampaign/src/api/automations.ts +32 -0
  11. package/connectors/connect-activecampaign/src/api/campaigns.ts +30 -0
  12. package/connectors/connect-activecampaign/src/api/client.ts +183 -0
  13. package/connectors/connect-activecampaign/src/api/contacts.ts +64 -0
  14. package/connectors/connect-activecampaign/src/api/deals.ts +58 -0
  15. package/connectors/connect-activecampaign/src/api/index.ts +70 -0
  16. package/connectors/connect-activecampaign/src/api/lists.ts +30 -0
  17. package/connectors/connect-activecampaign/src/api/notes.ts +22 -0
  18. package/connectors/connect-activecampaign/src/api/tags.ts +34 -0
  19. package/connectors/connect-activecampaign/src/api/webhooks.ts +29 -0
  20. package/connectors/connect-activecampaign/src/cli/index.ts +1027 -0
  21. package/connectors/connect-activecampaign/src/index.ts +114 -0
  22. package/connectors/connect-activecampaign/src/types/index.ts +589 -0
  23. package/connectors/connect-activecampaign/src/utils/auth.ts +274 -0
  24. package/connectors/connect-activecampaign/src/utils/bulk.ts +212 -0
  25. package/connectors/connect-activecampaign/src/utils/config.ts +325 -0
  26. package/connectors/connect-activecampaign/src/utils/output.ts +175 -0
  27. package/connectors/connect-activecampaign/src/utils/settings.ts +114 -0
  28. package/connectors/connect-activecampaign/src/utils/storage.ts +198 -0
  29. package/connectors/connect-activecampaign/tsconfig.json +16 -0
  30. package/connectors/connect-adobe/.env.example +11 -0
  31. package/connectors/connect-adobe/CLAUDE.md +68 -0
  32. package/connectors/connect-adobe/README.md +193 -0
  33. package/connectors/connect-adobe/package.json +53 -0
  34. package/connectors/connect-adobe/scripts/release.ts +179 -0
  35. package/connectors/connect-adobe/src/api/assets.ts +31 -0
  36. package/connectors/connect-adobe/src/api/client.ts +276 -0
  37. package/connectors/connect-adobe/src/api/index.ts +48 -0
  38. package/connectors/connect-adobe/src/api/jobs.ts +44 -0
  39. package/connectors/connect-adobe/src/api/operations.ts +202 -0
  40. package/connectors/connect-adobe/src/cli/index.ts +544 -0
  41. package/connectors/connect-adobe/src/index.ts +103 -0
  42. package/connectors/connect-adobe/src/types/index.ts +320 -0
  43. package/connectors/connect-adobe/src/utils/auth.ts +274 -0
  44. package/connectors/connect-adobe/src/utils/bulk.ts +212 -0
  45. package/connectors/connect-adobe/src/utils/config.ts +326 -0
  46. package/connectors/connect-adobe/src/utils/output.ts +175 -0
  47. package/connectors/connect-adobe/src/utils/settings.ts +114 -0
  48. package/connectors/connect-adobe/src/utils/storage.ts +198 -0
  49. package/connectors/connect-adobe/tsconfig.json +16 -0
  50. package/connectors/connect-auth0/.env.example +11 -0
  51. package/connectors/connect-auth0/CLAUDE.md +272 -0
  52. package/connectors/connect-auth0/README.md +193 -0
  53. package/connectors/connect-auth0/package.json +53 -0
  54. package/connectors/connect-auth0/scripts/release.ts +179 -0
  55. package/connectors/connect-auth0/src/api/client.ts +213 -0
  56. package/connectors/connect-auth0/src/api/example.ts +48 -0
  57. package/connectors/connect-auth0/src/api/index.ts +51 -0
  58. package/connectors/connect-auth0/src/cli/index.ts +254 -0
  59. package/connectors/connect-auth0/src/index.ts +103 -0
  60. package/connectors/connect-auth0/src/types/index.ts +237 -0
  61. package/connectors/connect-auth0/src/utils/auth.ts +274 -0
  62. package/connectors/connect-auth0/src/utils/bulk.ts +212 -0
  63. package/connectors/connect-auth0/src/utils/config.ts +326 -0
  64. package/connectors/connect-auth0/src/utils/output.ts +175 -0
  65. package/connectors/connect-auth0/src/utils/settings.ts +114 -0
  66. package/connectors/connect-auth0/src/utils/storage.ts +198 -0
  67. package/connectors/connect-auth0/tsconfig.json +16 -0
  68. package/connectors/connect-bamboohr/.env.example +11 -0
  69. package/connectors/connect-bamboohr/CLAUDE.md +272 -0
  70. package/connectors/connect-bamboohr/README.md +193 -0
  71. package/connectors/connect-bamboohr/package.json +51 -0
  72. package/connectors/connect-bamboohr/scripts/release.ts +179 -0
  73. package/connectors/connect-bamboohr/src/api/client.ts +213 -0
  74. package/connectors/connect-bamboohr/src/api/example.ts +48 -0
  75. package/connectors/connect-bamboohr/src/api/index.ts +51 -0
  76. package/connectors/connect-bamboohr/src/cli/index.ts +254 -0
  77. package/connectors/connect-bamboohr/src/index.ts +103 -0
  78. package/connectors/connect-bamboohr/src/types/index.ts +237 -0
  79. package/connectors/connect-bamboohr/src/utils/auth.ts +274 -0
  80. package/connectors/connect-bamboohr/src/utils/bulk.ts +212 -0
  81. package/connectors/connect-bamboohr/src/utils/config.ts +326 -0
  82. package/connectors/connect-bamboohr/src/utils/output.ts +175 -0
  83. package/connectors/connect-bamboohr/src/utils/settings.ts +114 -0
  84. package/connectors/connect-bamboohr/src/utils/storage.ts +198 -0
  85. package/connectors/connect-bamboohr/tsconfig.json +16 -0
  86. package/connectors/connect-bannerbear/.env.example +11 -0
  87. package/connectors/connect-bannerbear/CLAUDE.md +272 -0
  88. package/connectors/connect-bannerbear/README.md +193 -0
  89. package/connectors/connect-bannerbear/package.json +51 -0
  90. package/connectors/connect-bannerbear/scripts/release.ts +179 -0
  91. package/connectors/connect-bannerbear/src/api/client.ts +213 -0
  92. package/connectors/connect-bannerbear/src/api/example.ts +48 -0
  93. package/connectors/connect-bannerbear/src/api/index.ts +51 -0
  94. package/connectors/connect-bannerbear/src/cli/index.ts +254 -0
  95. package/connectors/connect-bannerbear/src/index.ts +103 -0
  96. package/connectors/connect-bannerbear/src/types/index.ts +237 -0
  97. package/connectors/connect-bannerbear/src/utils/auth.ts +274 -0
  98. package/connectors/connect-bannerbear/src/utils/bulk.ts +212 -0
  99. package/connectors/connect-bannerbear/src/utils/config.ts +326 -0
  100. package/connectors/connect-bannerbear/src/utils/output.ts +175 -0
  101. package/connectors/connect-bannerbear/src/utils/settings.ts +114 -0
  102. package/connectors/connect-bannerbear/src/utils/storage.ts +198 -0
  103. package/connectors/connect-bannerbear/tsconfig.json +16 -0
  104. package/connectors/connect-brevo/.env.example +11 -0
  105. package/connectors/connect-brevo/CLAUDE.md +272 -0
  106. package/connectors/connect-brevo/README.md +193 -0
  107. package/connectors/connect-brevo/package.json +51 -0
  108. package/connectors/connect-brevo/scripts/release.ts +179 -0
  109. package/connectors/connect-brevo/src/api/client.ts +213 -0
  110. package/connectors/connect-brevo/src/api/example.ts +48 -0
  111. package/connectors/connect-brevo/src/api/index.ts +51 -0
  112. package/connectors/connect-brevo/src/cli/index.ts +254 -0
  113. package/connectors/connect-brevo/src/index.ts +103 -0
  114. package/connectors/connect-brevo/src/types/index.ts +237 -0
  115. package/connectors/connect-brevo/src/utils/auth.ts +274 -0
  116. package/connectors/connect-brevo/src/utils/bulk.ts +212 -0
  117. package/connectors/connect-brevo/src/utils/config.ts +326 -0
  118. package/connectors/connect-brevo/src/utils/output.ts +175 -0
  119. package/connectors/connect-brevo/src/utils/settings.ts +114 -0
  120. package/connectors/connect-brevo/src/utils/storage.ts +198 -0
  121. package/connectors/connect-brevo/tsconfig.json +16 -0
  122. package/connectors/connect-coingecko/.env.example +11 -0
  123. package/connectors/connect-coingecko/CLAUDE.md +272 -0
  124. package/connectors/connect-coingecko/README.md +193 -0
  125. package/connectors/connect-coingecko/package.json +51 -0
  126. package/connectors/connect-coingecko/scripts/release.ts +179 -0
  127. package/connectors/connect-coingecko/src/api/client.ts +213 -0
  128. package/connectors/connect-coingecko/src/api/example.ts +48 -0
  129. package/connectors/connect-coingecko/src/api/index.ts +51 -0
  130. package/connectors/connect-coingecko/src/cli/index.ts +254 -0
  131. package/connectors/connect-coingecko/src/index.ts +103 -0
  132. package/connectors/connect-coingecko/src/types/index.ts +237 -0
  133. package/connectors/connect-coingecko/src/utils/auth.ts +274 -0
  134. package/connectors/connect-coingecko/src/utils/bulk.ts +212 -0
  135. package/connectors/connect-coingecko/src/utils/config.ts +326 -0
  136. package/connectors/connect-coingecko/src/utils/output.ts +175 -0
  137. package/connectors/connect-coingecko/src/utils/settings.ts +114 -0
  138. package/connectors/connect-coingecko/src/utils/storage.ts +198 -0
  139. package/connectors/connect-coingecko/tsconfig.json +16 -0
  140. package/connectors/connect-customerio/.env.example +11 -0
  141. package/connectors/connect-customerio/CLAUDE.md +272 -0
  142. package/connectors/connect-customerio/README.md +193 -0
  143. package/connectors/connect-customerio/package.json +51 -0
  144. package/connectors/connect-customerio/scripts/release.ts +179 -0
  145. package/connectors/connect-customerio/src/api/client.ts +213 -0
  146. package/connectors/connect-customerio/src/api/example.ts +48 -0
  147. package/connectors/connect-customerio/src/api/index.ts +51 -0
  148. package/connectors/connect-customerio/src/cli/index.ts +254 -0
  149. package/connectors/connect-customerio/src/index.ts +103 -0
  150. package/connectors/connect-customerio/src/types/index.ts +237 -0
  151. package/connectors/connect-customerio/src/utils/auth.ts +274 -0
  152. package/connectors/connect-customerio/src/utils/bulk.ts +212 -0
  153. package/connectors/connect-customerio/src/utils/config.ts +326 -0
  154. package/connectors/connect-customerio/src/utils/output.ts +175 -0
  155. package/connectors/connect-customerio/src/utils/settings.ts +114 -0
  156. package/connectors/connect-customerio/src/utils/storage.ts +198 -0
  157. package/connectors/connect-customerio/tsconfig.json +16 -0
  158. package/connectors/connect-giphy/.env.example +11 -0
  159. package/connectors/connect-giphy/CLAUDE.md +272 -0
  160. package/connectors/connect-giphy/README.md +193 -0
  161. package/connectors/connect-giphy/package.json +51 -0
  162. package/connectors/connect-giphy/scripts/release.ts +179 -0
  163. package/connectors/connect-giphy/src/api/client.ts +213 -0
  164. package/connectors/connect-giphy/src/api/example.ts +48 -0
  165. package/connectors/connect-giphy/src/api/index.ts +51 -0
  166. package/connectors/connect-giphy/src/cli/index.ts +254 -0
  167. package/connectors/connect-giphy/src/index.ts +103 -0
  168. package/connectors/connect-giphy/src/types/index.ts +237 -0
  169. package/connectors/connect-giphy/src/utils/auth.ts +274 -0
  170. package/connectors/connect-giphy/src/utils/bulk.ts +212 -0
  171. package/connectors/connect-giphy/src/utils/config.ts +326 -0
  172. package/connectors/connect-giphy/src/utils/output.ts +175 -0
  173. package/connectors/connect-giphy/src/utils/settings.ts +114 -0
  174. package/connectors/connect-giphy/src/utils/storage.ts +198 -0
  175. package/connectors/connect-giphy/tsconfig.json +16 -0
  176. package/connectors/connect-gitlab/.env.example +11 -0
  177. package/connectors/connect-gitlab/CLAUDE.md +165 -0
  178. package/connectors/connect-gitlab/README.md +193 -0
  179. package/connectors/connect-gitlab/package.json +53 -0
  180. package/connectors/connect-gitlab/src/api/client.ts +234 -0
  181. package/connectors/connect-gitlab/src/api/index.ts +858 -0
  182. package/connectors/connect-gitlab/src/cli/index.ts +909 -0
  183. package/connectors/connect-gitlab/src/index.ts +24 -0
  184. package/connectors/connect-gitlab/src/types/index.ts +674 -0
  185. package/connectors/connect-gitlab/src/utils/config.ts +208 -0
  186. package/connectors/connect-gitlab/src/utils/output.ts +119 -0
  187. package/connectors/connect-gitlab/tsconfig.json +16 -0
  188. package/connectors/connect-homeassistant/.env.example +11 -0
  189. package/connectors/connect-homeassistant/CLAUDE.md +272 -0
  190. package/connectors/connect-homeassistant/README.md +193 -0
  191. package/connectors/connect-homeassistant/package.json +51 -0
  192. package/connectors/connect-homeassistant/scripts/release.ts +179 -0
  193. package/connectors/connect-homeassistant/src/api/client.ts +213 -0
  194. package/connectors/connect-homeassistant/src/api/example.ts +48 -0
  195. package/connectors/connect-homeassistant/src/api/index.ts +51 -0
  196. package/connectors/connect-homeassistant/src/cli/index.ts +254 -0
  197. package/connectors/connect-homeassistant/src/index.ts +103 -0
  198. package/connectors/connect-homeassistant/src/types/index.ts +237 -0
  199. package/connectors/connect-homeassistant/src/utils/auth.ts +274 -0
  200. package/connectors/connect-homeassistant/src/utils/bulk.ts +212 -0
  201. package/connectors/connect-homeassistant/src/utils/config.ts +326 -0
  202. package/connectors/connect-homeassistant/src/utils/output.ts +175 -0
  203. package/connectors/connect-homeassistant/src/utils/settings.ts +114 -0
  204. package/connectors/connect-homeassistant/src/utils/storage.ts +198 -0
  205. package/connectors/connect-homeassistant/tsconfig.json +16 -0
  206. package/connectors/connect-imgur/.env.example +11 -0
  207. package/connectors/connect-imgur/CLAUDE.md +272 -0
  208. package/connectors/connect-imgur/README.md +193 -0
  209. package/connectors/connect-imgur/package.json +51 -0
  210. package/connectors/connect-imgur/scripts/release.ts +179 -0
  211. package/connectors/connect-imgur/src/api/client.ts +213 -0
  212. package/connectors/connect-imgur/src/api/example.ts +48 -0
  213. package/connectors/connect-imgur/src/api/index.ts +51 -0
  214. package/connectors/connect-imgur/src/cli/index.ts +254 -0
  215. package/connectors/connect-imgur/src/index.ts +103 -0
  216. package/connectors/connect-imgur/src/types/index.ts +237 -0
  217. package/connectors/connect-imgur/src/utils/auth.ts +274 -0
  218. package/connectors/connect-imgur/src/utils/bulk.ts +212 -0
  219. package/connectors/connect-imgur/src/utils/config.ts +326 -0
  220. package/connectors/connect-imgur/src/utils/output.ts +175 -0
  221. package/connectors/connect-imgur/src/utils/settings.ts +114 -0
  222. package/connectors/connect-imgur/src/utils/storage.ts +198 -0
  223. package/connectors/connect-imgur/tsconfig.json +16 -0
  224. package/connectors/connect-klaviyo/.env.example +11 -0
  225. package/connectors/connect-klaviyo/CLAUDE.md +272 -0
  226. package/connectors/connect-klaviyo/README.md +193 -0
  227. package/connectors/connect-klaviyo/package.json +51 -0
  228. package/connectors/connect-klaviyo/scripts/release.ts +179 -0
  229. package/connectors/connect-klaviyo/src/api/client.ts +213 -0
  230. package/connectors/connect-klaviyo/src/api/example.ts +48 -0
  231. package/connectors/connect-klaviyo/src/api/index.ts +51 -0
  232. package/connectors/connect-klaviyo/src/cli/index.ts +254 -0
  233. package/connectors/connect-klaviyo/src/index.ts +103 -0
  234. package/connectors/connect-klaviyo/src/types/index.ts +237 -0
  235. package/connectors/connect-klaviyo/src/utils/auth.ts +274 -0
  236. package/connectors/connect-klaviyo/src/utils/bulk.ts +212 -0
  237. package/connectors/connect-klaviyo/src/utils/config.ts +326 -0
  238. package/connectors/connect-klaviyo/src/utils/output.ts +175 -0
  239. package/connectors/connect-klaviyo/src/utils/settings.ts +114 -0
  240. package/connectors/connect-klaviyo/src/utils/storage.ts +198 -0
  241. package/connectors/connect-klaviyo/tsconfig.json +16 -0
  242. package/connectors/connect-launchdarkly/.env.example +11 -0
  243. package/connectors/connect-launchdarkly/CLAUDE.md +272 -0
  244. package/connectors/connect-launchdarkly/README.md +193 -0
  245. package/connectors/connect-launchdarkly/package.json +52 -0
  246. package/connectors/connect-launchdarkly/scripts/release.ts +179 -0
  247. package/connectors/connect-launchdarkly/src/api/client.ts +213 -0
  248. package/connectors/connect-launchdarkly/src/api/example.ts +48 -0
  249. package/connectors/connect-launchdarkly/src/api/index.ts +51 -0
  250. package/connectors/connect-launchdarkly/src/cli/index.ts +254 -0
  251. package/connectors/connect-launchdarkly/src/index.ts +103 -0
  252. package/connectors/connect-launchdarkly/src/types/index.ts +237 -0
  253. package/connectors/connect-launchdarkly/src/utils/auth.ts +274 -0
  254. package/connectors/connect-launchdarkly/src/utils/bulk.ts +212 -0
  255. package/connectors/connect-launchdarkly/src/utils/config.ts +326 -0
  256. package/connectors/connect-launchdarkly/src/utils/output.ts +175 -0
  257. package/connectors/connect-launchdarkly/src/utils/settings.ts +114 -0
  258. package/connectors/connect-launchdarkly/src/utils/storage.ts +198 -0
  259. package/connectors/connect-launchdarkly/tsconfig.json +16 -0
  260. package/connectors/connect-mastodon/.env.example +11 -0
  261. package/connectors/connect-mastodon/CLAUDE.md +272 -0
  262. package/connectors/connect-mastodon/README.md +193 -0
  263. package/connectors/connect-mastodon/package.json +51 -0
  264. package/connectors/connect-mastodon/scripts/release.ts +179 -0
  265. package/connectors/connect-mastodon/src/api/client.ts +213 -0
  266. package/connectors/connect-mastodon/src/api/example.ts +48 -0
  267. package/connectors/connect-mastodon/src/api/index.ts +51 -0
  268. package/connectors/connect-mastodon/src/cli/index.ts +254 -0
  269. package/connectors/connect-mastodon/src/index.ts +103 -0
  270. package/connectors/connect-mastodon/src/types/index.ts +237 -0
  271. package/connectors/connect-mastodon/src/utils/auth.ts +274 -0
  272. package/connectors/connect-mastodon/src/utils/bulk.ts +212 -0
  273. package/connectors/connect-mastodon/src/utils/config.ts +326 -0
  274. package/connectors/connect-mastodon/src/utils/output.ts +175 -0
  275. package/connectors/connect-mastodon/src/utils/settings.ts +114 -0
  276. package/connectors/connect-mastodon/src/utils/storage.ts +198 -0
  277. package/connectors/connect-mastodon/tsconfig.json +16 -0
  278. package/connectors/connect-medium/.env.example +11 -0
  279. package/connectors/connect-medium/CLAUDE.md +272 -0
  280. package/connectors/connect-medium/README.md +193 -0
  281. package/connectors/connect-medium/package.json +51 -0
  282. package/connectors/connect-medium/scripts/release.ts +179 -0
  283. package/connectors/connect-medium/src/api/client.ts +213 -0
  284. package/connectors/connect-medium/src/api/example.ts +48 -0
  285. package/connectors/connect-medium/src/api/index.ts +51 -0
  286. package/connectors/connect-medium/src/cli/index.ts +254 -0
  287. package/connectors/connect-medium/src/index.ts +103 -0
  288. package/connectors/connect-medium/src/types/index.ts +237 -0
  289. package/connectors/connect-medium/src/utils/auth.ts +274 -0
  290. package/connectors/connect-medium/src/utils/bulk.ts +212 -0
  291. package/connectors/connect-medium/src/utils/config.ts +326 -0
  292. package/connectors/connect-medium/src/utils/output.ts +175 -0
  293. package/connectors/connect-medium/src/utils/settings.ts +114 -0
  294. package/connectors/connect-medium/src/utils/storage.ts +198 -0
  295. package/connectors/connect-medium/tsconfig.json +16 -0
  296. package/connectors/connect-okta/.env.example +11 -0
  297. package/connectors/connect-okta/CLAUDE.md +272 -0
  298. package/connectors/connect-okta/README.md +193 -0
  299. package/connectors/connect-okta/package.json +51 -0
  300. package/connectors/connect-okta/scripts/release.ts +179 -0
  301. package/connectors/connect-okta/src/api/client.ts +213 -0
  302. package/connectors/connect-okta/src/api/example.ts +48 -0
  303. package/connectors/connect-okta/src/api/index.ts +51 -0
  304. package/connectors/connect-okta/src/cli/index.ts +254 -0
  305. package/connectors/connect-okta/src/index.ts +103 -0
  306. package/connectors/connect-okta/src/types/index.ts +237 -0
  307. package/connectors/connect-okta/src/utils/auth.ts +274 -0
  308. package/connectors/connect-okta/src/utils/bulk.ts +212 -0
  309. package/connectors/connect-okta/src/utils/config.ts +326 -0
  310. package/connectors/connect-okta/src/utils/output.ts +175 -0
  311. package/connectors/connect-okta/src/utils/settings.ts +114 -0
  312. package/connectors/connect-okta/src/utils/storage.ts +198 -0
  313. package/connectors/connect-okta/tsconfig.json +16 -0
  314. package/connectors/connect-pagerduty/.env.example +11 -0
  315. package/connectors/connect-pagerduty/CLAUDE.md +272 -0
  316. package/connectors/connect-pagerduty/README.md +193 -0
  317. package/connectors/connect-pagerduty/package.json +53 -0
  318. package/connectors/connect-pagerduty/scripts/release.ts +179 -0
  319. package/connectors/connect-pagerduty/src/api/client.ts +213 -0
  320. package/connectors/connect-pagerduty/src/api/example.ts +48 -0
  321. package/connectors/connect-pagerduty/src/api/index.ts +51 -0
  322. package/connectors/connect-pagerduty/src/cli/index.ts +254 -0
  323. package/connectors/connect-pagerduty/src/index.ts +103 -0
  324. package/connectors/connect-pagerduty/src/types/index.ts +237 -0
  325. package/connectors/connect-pagerduty/src/utils/auth.ts +274 -0
  326. package/connectors/connect-pagerduty/src/utils/bulk.ts +212 -0
  327. package/connectors/connect-pagerduty/src/utils/config.ts +326 -0
  328. package/connectors/connect-pagerduty/src/utils/output.ts +175 -0
  329. package/connectors/connect-pagerduty/src/utils/settings.ts +114 -0
  330. package/connectors/connect-pagerduty/src/utils/storage.ts +198 -0
  331. package/connectors/connect-pagerduty/tsconfig.json +16 -0
  332. package/connectors/connect-plaid/.env.example +11 -0
  333. package/connectors/connect-plaid/CLAUDE.md +128 -0
  334. package/connectors/connect-plaid/README.md +193 -0
  335. package/connectors/connect-plaid/package.json +51 -0
  336. package/connectors/connect-plaid/src/api/client.ts +142 -0
  337. package/connectors/connect-plaid/src/api/index.ts +303 -0
  338. package/connectors/connect-plaid/src/cli/index.ts +564 -0
  339. package/connectors/connect-plaid/src/index.ts +23 -0
  340. package/connectors/connect-plaid/src/types/index.ts +348 -0
  341. package/connectors/connect-plaid/src/utils/config.ts +125 -0
  342. package/connectors/connect-plaid/src/utils/output.ts +119 -0
  343. package/connectors/connect-plaid/tsconfig.json +16 -0
  344. package/connectors/connect-producthunt/.env.example +11 -0
  345. package/connectors/connect-producthunt/CLAUDE.md +272 -0
  346. package/connectors/connect-producthunt/README.md +193 -0
  347. package/connectors/connect-producthunt/package.json +51 -0
  348. package/connectors/connect-producthunt/scripts/release.ts +179 -0
  349. package/connectors/connect-producthunt/src/api/client.ts +213 -0
  350. package/connectors/connect-producthunt/src/api/example.ts +48 -0
  351. package/connectors/connect-producthunt/src/api/index.ts +51 -0
  352. package/connectors/connect-producthunt/src/cli/index.ts +254 -0
  353. package/connectors/connect-producthunt/src/index.ts +103 -0
  354. package/connectors/connect-producthunt/src/types/index.ts +237 -0
  355. package/connectors/connect-producthunt/src/utils/auth.ts +274 -0
  356. package/connectors/connect-producthunt/src/utils/bulk.ts +212 -0
  357. package/connectors/connect-producthunt/src/utils/config.ts +326 -0
  358. package/connectors/connect-producthunt/src/utils/output.ts +175 -0
  359. package/connectors/connect-producthunt/src/utils/settings.ts +114 -0
  360. package/connectors/connect-producthunt/src/utils/storage.ts +198 -0
  361. package/connectors/connect-producthunt/tsconfig.json +16 -0
  362. package/connectors/connect-spotify/.env.example +11 -0
  363. package/connectors/connect-spotify/CLAUDE.md +272 -0
  364. package/connectors/connect-spotify/README.md +193 -0
  365. package/connectors/connect-spotify/package.json +51 -0
  366. package/connectors/connect-spotify/scripts/release.ts +179 -0
  367. package/connectors/connect-spotify/src/api/client.ts +213 -0
  368. package/connectors/connect-spotify/src/api/example.ts +48 -0
  369. package/connectors/connect-spotify/src/api/index.ts +51 -0
  370. package/connectors/connect-spotify/src/cli/index.ts +254 -0
  371. package/connectors/connect-spotify/src/index.ts +103 -0
  372. package/connectors/connect-spotify/src/types/index.ts +237 -0
  373. package/connectors/connect-spotify/src/utils/auth.ts +274 -0
  374. package/connectors/connect-spotify/src/utils/bulk.ts +212 -0
  375. package/connectors/connect-spotify/src/utils/config.ts +326 -0
  376. package/connectors/connect-spotify/src/utils/output.ts +175 -0
  377. package/connectors/connect-spotify/src/utils/settings.ts +114 -0
  378. package/connectors/connect-spotify/src/utils/storage.ts +198 -0
  379. package/connectors/connect-spotify/tsconfig.json +16 -0
  380. package/connectors/connect-uptimerobot/.env.example +11 -0
  381. package/connectors/connect-uptimerobot/CLAUDE.md +272 -0
  382. package/connectors/connect-uptimerobot/README.md +193 -0
  383. package/connectors/connect-uptimerobot/package.json +52 -0
  384. package/connectors/connect-uptimerobot/scripts/release.ts +179 -0
  385. package/connectors/connect-uptimerobot/src/api/client.ts +213 -0
  386. package/connectors/connect-uptimerobot/src/api/example.ts +48 -0
  387. package/connectors/connect-uptimerobot/src/api/index.ts +51 -0
  388. package/connectors/connect-uptimerobot/src/cli/index.ts +254 -0
  389. package/connectors/connect-uptimerobot/src/index.ts +103 -0
  390. package/connectors/connect-uptimerobot/src/types/index.ts +237 -0
  391. package/connectors/connect-uptimerobot/src/utils/auth.ts +274 -0
  392. package/connectors/connect-uptimerobot/src/utils/bulk.ts +212 -0
  393. package/connectors/connect-uptimerobot/src/utils/config.ts +326 -0
  394. package/connectors/connect-uptimerobot/src/utils/output.ts +175 -0
  395. package/connectors/connect-uptimerobot/src/utils/settings.ts +114 -0
  396. package/connectors/connect-uptimerobot/src/utils/storage.ts +198 -0
  397. package/connectors/connect-uptimerobot/tsconfig.json +16 -0
  398. package/connectors/connect-wise/.env.example +11 -0
  399. package/connectors/connect-wise/CLAUDE.md +128 -0
  400. package/connectors/connect-wise/README.md +193 -0
  401. package/connectors/connect-wise/package.json +52 -0
  402. package/connectors/connect-wise/src/api/client.ts +151 -0
  403. package/connectors/connect-wise/src/api/index.ts +279 -0
  404. package/connectors/connect-wise/src/cli/index.ts +577 -0
  405. package/connectors/connect-wise/src/index.ts +21 -0
  406. package/connectors/connect-wise/src/types/index.ts +353 -0
  407. package/connectors/connect-wise/src/utils/config.ts +209 -0
  408. package/connectors/connect-wise/src/utils/output.ts +119 -0
  409. package/connectors/connect-wise/tsconfig.json +16 -0
  410. package/dist/index.js +161 -0
  411. package/package.json +1 -1
@@ -0,0 +1,1027 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { Connector } from '../api';
5
+ import {
6
+ getApiKey,
7
+ setApiKey,
8
+ clearConfig,
9
+ getConfigDir,
10
+ setProfileOverride,
11
+ getCurrentProfile,
12
+ setCurrentProfile,
13
+ listProfiles,
14
+ createProfile,
15
+ deleteProfile,
16
+ profileExists,
17
+ loadProfile,
18
+ } from '../utils/config';
19
+ import type { OutputFormat } from '../utils/output';
20
+ import { success, error, info, print, warn, setVerboseMode, debug } from '../utils/output';
21
+
22
+ const CONNECTOR_NAME = 'connect-activecampaign';
23
+ const VERSION = '0.0.1';
24
+
25
+ const program = new Command();
26
+
27
+ program
28
+ .name(CONNECTOR_NAME)
29
+ .description('ActiveCampaign API connector - CRM, marketing automation, contacts, deals, campaigns')
30
+ .version(VERSION)
31
+ .option('-k, --api-key <key>', 'API key (overrides config)')
32
+ .option('-u, --base-url <url>', 'Account URL (e.g. https://youraccountname.api-us1.com)')
33
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
34
+ .option('-p, --profile <profile>', 'Use a specific profile')
35
+ .option('-v, --verbose', 'Enable verbose output for debugging')
36
+ .hook('preAction', (thisCommand) => {
37
+ const opts = thisCommand.opts();
38
+
39
+ if (opts.verbose) {
40
+ setVerboseMode(true);
41
+ debug('Verbose mode enabled');
42
+ }
43
+
44
+ if (opts.profile) {
45
+ if (!profileExists(opts.profile)) {
46
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
47
+ process.exit(1);
48
+ }
49
+ setProfileOverride(opts.profile);
50
+ debug(`Using profile: ${opts.profile}`);
51
+ }
52
+
53
+ if (opts.apiKey) {
54
+ process.env.ACTIVECAMPAIGN_API_KEY = opts.apiKey;
55
+ debug('API key set from command line flag');
56
+ }
57
+
58
+ if (opts.baseUrl) {
59
+ process.env.ACTIVECAMPAIGN_BASE_URL = opts.baseUrl;
60
+ debug('Base URL set from command line flag');
61
+ }
62
+ });
63
+
64
+ function getFormat(cmd: Command): OutputFormat {
65
+ const parent = cmd.parent;
66
+ return (parent?.opts().format || 'pretty') as OutputFormat;
67
+ }
68
+
69
+ function getClient(): Connector {
70
+ const apiKey = getApiKey();
71
+ if (!apiKey) {
72
+ error(`No API key configured. Run "${CONNECTOR_NAME} config set-key <key>" or set ACTIVECAMPAIGN_API_KEY environment variable.`);
73
+ process.exit(1);
74
+ }
75
+ const baseUrl = process.env.ACTIVECAMPAIGN_BASE_URL || loadProfile().apiSecret;
76
+ if (!baseUrl) {
77
+ error(`No base URL configured. Use --base-url flag or set ACTIVECAMPAIGN_BASE_URL environment variable.`);
78
+ process.exit(1);
79
+ }
80
+ return new Connector({ apiKey, baseUrl });
81
+ }
82
+
83
+ // ============================================
84
+ // Profile Commands
85
+ // ============================================
86
+ const profileCmd = program
87
+ .command('profile')
88
+ .description('Manage configuration profiles');
89
+
90
+ profileCmd
91
+ .command('list')
92
+ .description('List all profiles')
93
+ .action(() => {
94
+ const profiles = listProfiles();
95
+ const current = getCurrentProfile();
96
+
97
+ if (profiles.length === 0) {
98
+ info('No profiles found. Use "profile create <name>" to create one.');
99
+ return;
100
+ }
101
+
102
+ success(`Profiles:`);
103
+ profiles.forEach(p => {
104
+ const isActive = p === current ? chalk.green(' (active)') : '';
105
+ console.log(` ${p}${isActive}`);
106
+ });
107
+ });
108
+
109
+ profileCmd
110
+ .command('use <name>')
111
+ .description('Switch to a profile')
112
+ .action((name: string) => {
113
+ if (!profileExists(name)) {
114
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
115
+ process.exit(1);
116
+ }
117
+ setCurrentProfile(name);
118
+ success(`Switched to profile: ${name}`);
119
+ });
120
+
121
+ profileCmd
122
+ .command('create <name>')
123
+ .description('Create a new profile')
124
+ .option('--api-key <key>', 'API key')
125
+ .option('--use', 'Switch to this profile after creation')
126
+ .action((name: string, opts) => {
127
+ if (profileExists(name)) {
128
+ error(`Profile "${name}" already exists`);
129
+ process.exit(1);
130
+ }
131
+
132
+ createProfile(name, {
133
+ apiKey: opts.apiKey,
134
+ });
135
+ success(`Profile "${name}" created`);
136
+
137
+ if (opts.use) {
138
+ setCurrentProfile(name);
139
+ info(`Switched to profile: ${name}`);
140
+ }
141
+ });
142
+
143
+ profileCmd
144
+ .command('delete <name>')
145
+ .description('Delete a profile')
146
+ .action((name: string) => {
147
+ if (name === 'default') {
148
+ error('Cannot delete the default profile');
149
+ process.exit(1);
150
+ }
151
+ if (deleteProfile(name)) {
152
+ success(`Profile "${name}" deleted`);
153
+ } else {
154
+ error(`Profile "${name}" not found`);
155
+ process.exit(1);
156
+ }
157
+ });
158
+
159
+ profileCmd
160
+ .command('show [name]')
161
+ .description('Show profile configuration')
162
+ .action((name?: string) => {
163
+ const profileName = name || getCurrentProfile();
164
+ const config = loadProfile(profileName);
165
+ const active = getCurrentProfile();
166
+
167
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
168
+ info(`API Key: ${config.apiKey ? `${config.apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
169
+ });
170
+
171
+ // ============================================
172
+ // Config Commands
173
+ // ============================================
174
+ const configCmd = program
175
+ .command('config')
176
+ .description('Manage CLI configuration (for active profile)');
177
+
178
+ configCmd
179
+ .command('set-key <apiKey>')
180
+ .description('Set API key')
181
+ .action((apiKey: string) => {
182
+ setApiKey(apiKey);
183
+ success(`API key saved to profile: ${getCurrentProfile()}`);
184
+ });
185
+
186
+ configCmd
187
+ .command('show')
188
+ .description('Show current configuration')
189
+ .action(() => {
190
+ const profileName = getCurrentProfile();
191
+ const apiKey = getApiKey();
192
+
193
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
194
+ info(`Config directory: ${getConfigDir()}`);
195
+ info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
196
+ });
197
+
198
+ configCmd
199
+ .command('clear')
200
+ .description('Clear configuration for active profile')
201
+ .action(() => {
202
+ clearConfig();
203
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
204
+ });
205
+
206
+ // ============================================
207
+ // Contacts Commands
208
+ // ============================================
209
+ const contactsCmd = program
210
+ .command('contacts')
211
+ .description('Manage contacts');
212
+
213
+ contactsCmd
214
+ .command('list')
215
+ .description('List contacts')
216
+ .option('-l, --limit <number>', 'Maximum results', '20')
217
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
218
+ .option('--email <email>', 'Filter by email')
219
+ .action(async (opts) => {
220
+ try {
221
+ const client = getClient();
222
+ const filters: Record<string, string | number> = {};
223
+ if (opts.email) filters['filters[email]'] = opts.email;
224
+ const result = await client.contacts.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset), filters });
225
+ print(result, getFormat(contactsCmd));
226
+ } catch (err) {
227
+ error(String(err));
228
+ process.exit(1);
229
+ }
230
+ });
231
+
232
+ contactsCmd
233
+ .command('get <id>')
234
+ .description('Get a contact by ID')
235
+ .action(async (id: string) => {
236
+ try {
237
+ const client = getClient();
238
+ const result = await client.contacts.get(id);
239
+ print(result, getFormat(contactsCmd));
240
+ } catch (err) {
241
+ error(String(err));
242
+ process.exit(1);
243
+ }
244
+ });
245
+
246
+ contactsCmd
247
+ .command('create')
248
+ .description('Create a new contact')
249
+ .requiredOption('-e, --email <email>', 'Email address')
250
+ .option('--first-name <name>', 'First name')
251
+ .option('--last-name <name>', 'Last name')
252
+ .option('--phone <phone>', 'Phone number')
253
+ .action(async (opts) => {
254
+ try {
255
+ const client = getClient();
256
+ const result = await client.contacts.create({
257
+ email: opts.email,
258
+ firstName: opts.firstName,
259
+ lastName: opts.lastName,
260
+ phone: opts.phone,
261
+ });
262
+ success('Contact created!');
263
+ print(result, getFormat(contactsCmd));
264
+ } catch (err) {
265
+ error(String(err));
266
+ process.exit(1);
267
+ }
268
+ });
269
+
270
+ contactsCmd
271
+ .command('update <id>')
272
+ .description('Update a contact')
273
+ .option('-e, --email <email>', 'Email address')
274
+ .option('--first-name <name>', 'First name')
275
+ .option('--last-name <name>', 'Last name')
276
+ .option('--phone <phone>', 'Phone number')
277
+ .action(async (id: string, opts) => {
278
+ try {
279
+ const client = getClient();
280
+ const params: Record<string, string> = {};
281
+ if (opts.email) params.email = opts.email;
282
+ if (opts.firstName) params.firstName = opts.firstName;
283
+ if (opts.lastName) params.lastName = opts.lastName;
284
+ if (opts.phone) params.phone = opts.phone;
285
+ const result = await client.contacts.update(id, params as never);
286
+ success('Contact updated!');
287
+ print(result, getFormat(contactsCmd));
288
+ } catch (err) {
289
+ error(String(err));
290
+ process.exit(1);
291
+ }
292
+ });
293
+
294
+ contactsCmd
295
+ .command('delete <id>')
296
+ .description('Delete a contact')
297
+ .action(async (id: string) => {
298
+ try {
299
+ const client = getClient();
300
+ await client.contacts.delete(id);
301
+ success('Contact deleted!');
302
+ } catch (err) {
303
+ error(String(err));
304
+ process.exit(1);
305
+ }
306
+ });
307
+
308
+ contactsCmd
309
+ .command('sync')
310
+ .description('Sync (upsert) a contact by email')
311
+ .requiredOption('-e, --email <email>', 'Email address')
312
+ .option('--first-name <name>', 'First name')
313
+ .option('--last-name <name>', 'Last name')
314
+ .option('--phone <phone>', 'Phone number')
315
+ .action(async (opts) => {
316
+ try {
317
+ const client = getClient();
318
+ const result = await client.contacts.sync({
319
+ email: opts.email,
320
+ firstName: opts.firstName,
321
+ lastName: opts.lastName,
322
+ phone: opts.phone,
323
+ });
324
+ success('Contact synced!');
325
+ print(result, getFormat(contactsCmd));
326
+ } catch (err) {
327
+ error(String(err));
328
+ process.exit(1);
329
+ }
330
+ });
331
+
332
+ contactsCmd
333
+ .command('tags <contactId>')
334
+ .description('List tags for a contact')
335
+ .action(async (contactId: string) => {
336
+ try {
337
+ const client = getClient();
338
+ const result = await client.contacts.listTags(contactId);
339
+ print(result, getFormat(contactsCmd));
340
+ } catch (err) {
341
+ error(String(err));
342
+ process.exit(1);
343
+ }
344
+ });
345
+
346
+ contactsCmd
347
+ .command('add-tag')
348
+ .description('Add a tag to a contact')
349
+ .requiredOption('-c, --contact <id>', 'Contact ID')
350
+ .requiredOption('-t, --tag <id>', 'Tag ID')
351
+ .action(async (opts) => {
352
+ try {
353
+ const client = getClient();
354
+ const result = await client.contacts.addTag(opts.contact, opts.tag);
355
+ success('Tag added to contact!');
356
+ print(result, getFormat(contactsCmd));
357
+ } catch (err) {
358
+ error(String(err));
359
+ process.exit(1);
360
+ }
361
+ });
362
+
363
+ contactsCmd
364
+ .command('remove-tag <contactTagId>')
365
+ .description('Remove a tag from a contact')
366
+ .action(async (contactTagId: string) => {
367
+ try {
368
+ const client = getClient();
369
+ await client.contacts.removeTag(contactTagId);
370
+ success('Tag removed from contact!');
371
+ } catch (err) {
372
+ error(String(err));
373
+ process.exit(1);
374
+ }
375
+ });
376
+
377
+ // ============================================
378
+ // Deals Commands
379
+ // ============================================
380
+ const dealsCmd = program
381
+ .command('deals')
382
+ .description('Manage deals (CRM)');
383
+
384
+ dealsCmd
385
+ .command('list')
386
+ .description('List deals')
387
+ .option('-l, --limit <number>', 'Maximum results', '20')
388
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
389
+ .action(async (opts) => {
390
+ try {
391
+ const client = getClient();
392
+ const result = await client.deals.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
393
+ print(result, getFormat(dealsCmd));
394
+ } catch (err) {
395
+ error(String(err));
396
+ process.exit(1);
397
+ }
398
+ });
399
+
400
+ dealsCmd
401
+ .command('get <id>')
402
+ .description('Get a deal by ID')
403
+ .action(async (id: string) => {
404
+ try {
405
+ const client = getClient();
406
+ const result = await client.deals.get(id);
407
+ print(result, getFormat(dealsCmd));
408
+ } catch (err) {
409
+ error(String(err));
410
+ process.exit(1);
411
+ }
412
+ });
413
+
414
+ dealsCmd
415
+ .command('create')
416
+ .description('Create a new deal')
417
+ .requiredOption('-t, --title <title>', 'Deal title')
418
+ .requiredOption('--value <value>', 'Deal value')
419
+ .requiredOption('--currency <currency>', 'Currency code (e.g. usd)')
420
+ .option('--stage <id>', 'Stage ID')
421
+ .option('--owner <id>', 'Owner ID')
422
+ .option('--contact <id>', 'Contact ID')
423
+ .option('--description <desc>', 'Deal description')
424
+ .action(async (opts) => {
425
+ try {
426
+ const client = getClient();
427
+ const result = await client.deals.create({
428
+ title: opts.title,
429
+ value: parseInt(opts.value),
430
+ currency: opts.currency,
431
+ stage: opts.stage,
432
+ owner: opts.owner,
433
+ contact: opts.contact,
434
+ description: opts.description,
435
+ } as never);
436
+ success('Deal created!');
437
+ print(result, getFormat(dealsCmd));
438
+ } catch (err) {
439
+ error(String(err));
440
+ process.exit(1);
441
+ }
442
+ });
443
+
444
+ dealsCmd
445
+ .command('update <id>')
446
+ .description('Update a deal')
447
+ .option('-t, --title <title>', 'Deal title')
448
+ .option('--value <value>', 'Deal value')
449
+ .option('--currency <currency>', 'Currency code')
450
+ .option('--stage <id>', 'Stage ID')
451
+ .option('--owner <id>', 'Owner ID')
452
+ .action(async (id: string, opts) => {
453
+ try {
454
+ const client = getClient();
455
+ const params: Record<string, string | number> = {};
456
+ if (opts.title) params.title = opts.title;
457
+ if (opts.value) params.value = parseInt(opts.value);
458
+ if (opts.currency) params.currency = opts.currency;
459
+ if (opts.stage) params.stage = opts.stage;
460
+ if (opts.owner) params.owner = opts.owner;
461
+ const result = await client.deals.update(id, params as never);
462
+ success('Deal updated!');
463
+ print(result, getFormat(dealsCmd));
464
+ } catch (err) {
465
+ error(String(err));
466
+ process.exit(1);
467
+ }
468
+ });
469
+
470
+ dealsCmd
471
+ .command('delete <id>')
472
+ .description('Delete a deal')
473
+ .action(async (id: string) => {
474
+ try {
475
+ const client = getClient();
476
+ await client.deals.delete(id);
477
+ success('Deal deleted!');
478
+ } catch (err) {
479
+ error(String(err));
480
+ process.exit(1);
481
+ }
482
+ });
483
+
484
+ dealsCmd
485
+ .command('stages')
486
+ .description('List deal stages')
487
+ .action(async () => {
488
+ try {
489
+ const client = getClient();
490
+ const result = await client.deals.listStages();
491
+ print(result, getFormat(dealsCmd));
492
+ } catch (err) {
493
+ error(String(err));
494
+ process.exit(1);
495
+ }
496
+ });
497
+
498
+ dealsCmd
499
+ .command('pipelines')
500
+ .description('List deal pipelines')
501
+ .action(async () => {
502
+ try {
503
+ const client = getClient();
504
+ const result = await client.deals.listPipelines();
505
+ print(result, getFormat(dealsCmd));
506
+ } catch (err) {
507
+ error(String(err));
508
+ process.exit(1);
509
+ }
510
+ });
511
+
512
+ // ============================================
513
+ // Accounts Commands
514
+ // ============================================
515
+ const accountsCmd = program
516
+ .command('accounts')
517
+ .description('Manage accounts (organizations)');
518
+
519
+ accountsCmd
520
+ .command('list')
521
+ .description('List accounts')
522
+ .option('-l, --limit <number>', 'Maximum results', '20')
523
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
524
+ .action(async (opts) => {
525
+ try {
526
+ const client = getClient();
527
+ const result = await client.accounts.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
528
+ print(result, getFormat(accountsCmd));
529
+ } catch (err) {
530
+ error(String(err));
531
+ process.exit(1);
532
+ }
533
+ });
534
+
535
+ accountsCmd
536
+ .command('get <id>')
537
+ .description('Get an account by ID')
538
+ .action(async (id: string) => {
539
+ try {
540
+ const client = getClient();
541
+ const result = await client.accounts.get(id);
542
+ print(result, getFormat(accountsCmd));
543
+ } catch (err) {
544
+ error(String(err));
545
+ process.exit(1);
546
+ }
547
+ });
548
+
549
+ accountsCmd
550
+ .command('create')
551
+ .description('Create a new account')
552
+ .requiredOption('-n, --name <name>', 'Account name')
553
+ .option('--url <url>', 'Account URL')
554
+ .action(async (opts) => {
555
+ try {
556
+ const client = getClient();
557
+ const result = await client.accounts.create({
558
+ name: opts.name,
559
+ accountUrl: opts.url,
560
+ } as never);
561
+ success('Account created!');
562
+ print(result, getFormat(accountsCmd));
563
+ } catch (err) {
564
+ error(String(err));
565
+ process.exit(1);
566
+ }
567
+ });
568
+
569
+ accountsCmd
570
+ .command('update <id>')
571
+ .description('Update an account')
572
+ .option('-n, --name <name>', 'Account name')
573
+ .option('--url <url>', 'Account URL')
574
+ .action(async (id: string, opts) => {
575
+ try {
576
+ const client = getClient();
577
+ const params: Record<string, string> = {};
578
+ if (opts.name) params.name = opts.name;
579
+ if (opts.url) params.accountUrl = opts.url;
580
+ const result = await client.accounts.update(id, params as never);
581
+ success('Account updated!');
582
+ print(result, getFormat(accountsCmd));
583
+ } catch (err) {
584
+ error(String(err));
585
+ process.exit(1);
586
+ }
587
+ });
588
+
589
+ accountsCmd
590
+ .command('delete <id>')
591
+ .description('Delete an account')
592
+ .action(async (id: string) => {
593
+ try {
594
+ const client = getClient();
595
+ await client.accounts.delete(id);
596
+ success('Account deleted!');
597
+ } catch (err) {
598
+ error(String(err));
599
+ process.exit(1);
600
+ }
601
+ });
602
+
603
+ // ============================================
604
+ // Campaigns Commands
605
+ // ============================================
606
+ const campaignsCmd = program
607
+ .command('campaigns')
608
+ .description('View campaigns (read-only)');
609
+
610
+ campaignsCmd
611
+ .command('list')
612
+ .description('List campaigns')
613
+ .option('-l, --limit <number>', 'Maximum results', '20')
614
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
615
+ .action(async (opts) => {
616
+ try {
617
+ const client = getClient();
618
+ const result = await client.campaigns.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
619
+ print(result, getFormat(campaignsCmd));
620
+ } catch (err) {
621
+ error(String(err));
622
+ process.exit(1);
623
+ }
624
+ });
625
+
626
+ campaignsCmd
627
+ .command('get <id>')
628
+ .description('Get a campaign by ID')
629
+ .action(async (id: string) => {
630
+ try {
631
+ const client = getClient();
632
+ const result = await client.campaigns.get(id);
633
+ print(result, getFormat(campaignsCmd));
634
+ } catch (err) {
635
+ error(String(err));
636
+ process.exit(1);
637
+ }
638
+ });
639
+
640
+ // ============================================
641
+ // Tags Commands
642
+ // ============================================
643
+ const tagsCmd = program
644
+ .command('tags')
645
+ .description('Manage tags');
646
+
647
+ tagsCmd
648
+ .command('list')
649
+ .description('List tags')
650
+ .option('-l, --limit <number>', 'Maximum results', '20')
651
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
652
+ .action(async (opts) => {
653
+ try {
654
+ const client = getClient();
655
+ const result = await client.tags.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
656
+ print(result, getFormat(tagsCmd));
657
+ } catch (err) {
658
+ error(String(err));
659
+ process.exit(1);
660
+ }
661
+ });
662
+
663
+ tagsCmd
664
+ .command('get <id>')
665
+ .description('Get a tag by ID')
666
+ .action(async (id: string) => {
667
+ try {
668
+ const client = getClient();
669
+ const result = await client.tags.get(id);
670
+ print(result, getFormat(tagsCmd));
671
+ } catch (err) {
672
+ error(String(err));
673
+ process.exit(1);
674
+ }
675
+ });
676
+
677
+ tagsCmd
678
+ .command('create')
679
+ .description('Create a new tag')
680
+ .requiredOption('-n, --name <name>', 'Tag name')
681
+ .requiredOption('--type <type>', 'Tag type (contact, deal)')
682
+ .option('-d, --description <desc>', 'Tag description')
683
+ .action(async (opts) => {
684
+ try {
685
+ const client = getClient();
686
+ const result = await client.tags.create({
687
+ tag: opts.name,
688
+ tagType: opts.type,
689
+ description: opts.description,
690
+ });
691
+ success('Tag created!');
692
+ print(result, getFormat(tagsCmd));
693
+ } catch (err) {
694
+ error(String(err));
695
+ process.exit(1);
696
+ }
697
+ });
698
+
699
+ tagsCmd
700
+ .command('update <id>')
701
+ .description('Update a tag')
702
+ .option('-n, --name <name>', 'Tag name')
703
+ .option('--type <type>', 'Tag type')
704
+ .option('-d, --description <desc>', 'Tag description')
705
+ .action(async (id: string, opts) => {
706
+ try {
707
+ const client = getClient();
708
+ const params: Record<string, string> = {};
709
+ if (opts.name) params.tag = opts.name;
710
+ if (opts.type) params.tagType = opts.type;
711
+ if (opts.description) params.description = opts.description;
712
+ const result = await client.tags.update(id, params as never);
713
+ success('Tag updated!');
714
+ print(result, getFormat(tagsCmd));
715
+ } catch (err) {
716
+ error(String(err));
717
+ process.exit(1);
718
+ }
719
+ });
720
+
721
+ tagsCmd
722
+ .command('delete <id>')
723
+ .description('Delete a tag')
724
+ .action(async (id: string) => {
725
+ try {
726
+ const client = getClient();
727
+ await client.tags.delete(id);
728
+ success('Tag deleted!');
729
+ } catch (err) {
730
+ error(String(err));
731
+ process.exit(1);
732
+ }
733
+ });
734
+
735
+ // ============================================
736
+ // Lists Commands
737
+ // ============================================
738
+ const listsCmd = program
739
+ .command('lists')
740
+ .description('Manage mailing lists');
741
+
742
+ listsCmd
743
+ .command('list')
744
+ .description('List mailing lists')
745
+ .option('-l, --limit <number>', 'Maximum results', '20')
746
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
747
+ .action(async (opts) => {
748
+ try {
749
+ const client = getClient();
750
+ const result = await client.lists.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
751
+ print(result, getFormat(listsCmd));
752
+ } catch (err) {
753
+ error(String(err));
754
+ process.exit(1);
755
+ }
756
+ });
757
+
758
+ listsCmd
759
+ .command('get <id>')
760
+ .description('Get a mailing list by ID')
761
+ .action(async (id: string) => {
762
+ try {
763
+ const client = getClient();
764
+ const result = await client.lists.get(id);
765
+ print(result, getFormat(listsCmd));
766
+ } catch (err) {
767
+ error(String(err));
768
+ process.exit(1);
769
+ }
770
+ });
771
+
772
+ listsCmd
773
+ .command('create')
774
+ .description('Create a new mailing list')
775
+ .requiredOption('-n, --name <name>', 'List name')
776
+ .requiredOption('--string-id <id>', 'URL-safe list ID')
777
+ .requiredOption('--sender-url <url>', 'Sender URL')
778
+ .requiredOption('--sender-reminder <text>', 'Sender reminder text')
779
+ .action(async (opts) => {
780
+ try {
781
+ const client = getClient();
782
+ const result = await client.lists.create({
783
+ name: opts.name,
784
+ stringid: opts.stringId,
785
+ sender_url: opts.senderUrl,
786
+ sender_reminder: opts.senderReminder,
787
+ });
788
+ success('List created!');
789
+ print(result, getFormat(listsCmd));
790
+ } catch (err) {
791
+ error(String(err));
792
+ process.exit(1);
793
+ }
794
+ });
795
+
796
+ listsCmd
797
+ .command('delete <id>')
798
+ .description('Delete a mailing list')
799
+ .action(async (id: string) => {
800
+ try {
801
+ const client = getClient();
802
+ await client.lists.delete(id);
803
+ success('List deleted!');
804
+ } catch (err) {
805
+ error(String(err));
806
+ process.exit(1);
807
+ }
808
+ });
809
+
810
+ // ============================================
811
+ // Automations Commands
812
+ // ============================================
813
+ const automationsCmd = program
814
+ .command('automations')
815
+ .description('Manage automations');
816
+
817
+ automationsCmd
818
+ .command('list')
819
+ .description('List automations')
820
+ .option('-l, --limit <number>', 'Maximum results', '20')
821
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
822
+ .action(async (opts) => {
823
+ try {
824
+ const client = getClient();
825
+ const result = await client.automations.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
826
+ print(result, getFormat(automationsCmd));
827
+ } catch (err) {
828
+ error(String(err));
829
+ process.exit(1);
830
+ }
831
+ });
832
+
833
+ automationsCmd
834
+ .command('get <id>')
835
+ .description('Get an automation by ID')
836
+ .action(async (id: string) => {
837
+ try {
838
+ const client = getClient();
839
+ const result = await client.automations.get(id);
840
+ print(result, getFormat(automationsCmd));
841
+ } catch (err) {
842
+ error(String(err));
843
+ process.exit(1);
844
+ }
845
+ });
846
+
847
+ automationsCmd
848
+ .command('add-contact')
849
+ .description('Add a contact to an automation')
850
+ .requiredOption('-a, --automation <id>', 'Automation ID')
851
+ .requiredOption('-c, --contact <id>', 'Contact ID')
852
+ .action(async (opts) => {
853
+ try {
854
+ const client = getClient();
855
+ const result = await client.automations.addContact(opts.automation, opts.contact);
856
+ success('Contact added to automation!');
857
+ print(result, getFormat(automationsCmd));
858
+ } catch (err) {
859
+ error(String(err));
860
+ process.exit(1);
861
+ }
862
+ });
863
+
864
+ automationsCmd
865
+ .command('remove-contact <contactAutomationId>')
866
+ .description('Remove a contact from an automation')
867
+ .action(async (contactAutomationId: string) => {
868
+ try {
869
+ const client = getClient();
870
+ await client.automations.removeContact(contactAutomationId);
871
+ success('Contact removed from automation!');
872
+ } catch (err) {
873
+ error(String(err));
874
+ process.exit(1);
875
+ }
876
+ });
877
+
878
+ // ============================================
879
+ // Webhooks Commands
880
+ // ============================================
881
+ const webhooksCmd = program
882
+ .command('webhooks')
883
+ .description('Manage webhooks');
884
+
885
+ webhooksCmd
886
+ .command('list')
887
+ .description('List webhooks')
888
+ .option('-l, --limit <number>', 'Maximum results', '20')
889
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
890
+ .action(async (opts) => {
891
+ try {
892
+ const client = getClient();
893
+ const result = await client.webhooks.list({ limit: parseInt(opts.limit), offset: parseInt(opts.offset) });
894
+ print(result, getFormat(webhooksCmd));
895
+ } catch (err) {
896
+ error(String(err));
897
+ process.exit(1);
898
+ }
899
+ });
900
+
901
+ webhooksCmd
902
+ .command('get <id>')
903
+ .description('Get a webhook by ID')
904
+ .action(async (id: string) => {
905
+ try {
906
+ const client = getClient();
907
+ const result = await client.webhooks.get(id);
908
+ print(result, getFormat(webhooksCmd));
909
+ } catch (err) {
910
+ error(String(err));
911
+ process.exit(1);
912
+ }
913
+ });
914
+
915
+ webhooksCmd
916
+ .command('create')
917
+ .description('Create a new webhook')
918
+ .requiredOption('-n, --name <name>', 'Webhook name')
919
+ .requiredOption('--url <url>', 'Webhook URL')
920
+ .requiredOption('--events <events>', 'Comma-separated event names')
921
+ .requiredOption('--sources <sources>', 'Comma-separated source names')
922
+ .action(async (opts) => {
923
+ try {
924
+ const client = getClient();
925
+ const result = await client.webhooks.create({
926
+ name: opts.name,
927
+ url: opts.url,
928
+ events: opts.events.split(','),
929
+ sources: opts.sources.split(','),
930
+ });
931
+ success('Webhook created!');
932
+ print(result, getFormat(webhooksCmd));
933
+ } catch (err) {
934
+ error(String(err));
935
+ process.exit(1);
936
+ }
937
+ });
938
+
939
+ webhooksCmd
940
+ .command('delete <id>')
941
+ .description('Delete a webhook')
942
+ .action(async (id: string) => {
943
+ try {
944
+ const client = getClient();
945
+ await client.webhooks.delete(id);
946
+ success('Webhook deleted!');
947
+ } catch (err) {
948
+ error(String(err));
949
+ process.exit(1);
950
+ }
951
+ });
952
+
953
+ // ============================================
954
+ // Notes Commands
955
+ // ============================================
956
+ const notesCmd = program
957
+ .command('notes')
958
+ .description('Manage notes');
959
+
960
+ notesCmd
961
+ .command('get <id>')
962
+ .description('Get a note by ID')
963
+ .action(async (id: string) => {
964
+ try {
965
+ const client = getClient();
966
+ const result = await client.notes.get(id);
967
+ print(result, getFormat(notesCmd));
968
+ } catch (err) {
969
+ error(String(err));
970
+ process.exit(1);
971
+ }
972
+ });
973
+
974
+ notesCmd
975
+ .command('create')
976
+ .description('Create a new note')
977
+ .requiredOption('--note <text>', 'Note text')
978
+ .requiredOption('--relid <id>', 'Related entity ID')
979
+ .requiredOption('--reltype <type>', 'Related entity type (e.g. Subscriber, Deal)')
980
+ .action(async (opts) => {
981
+ try {
982
+ const client = getClient();
983
+ const result = await client.notes.create({
984
+ note: opts.note,
985
+ relid: parseInt(opts.relid),
986
+ reltype: opts.reltype,
987
+ });
988
+ success('Note created!');
989
+ print(result, getFormat(notesCmd));
990
+ } catch (err) {
991
+ error(String(err));
992
+ process.exit(1);
993
+ }
994
+ });
995
+
996
+ notesCmd
997
+ .command('update <id>')
998
+ .description('Update a note')
999
+ .requiredOption('--note <text>', 'Note text')
1000
+ .action(async (id: string, opts) => {
1001
+ try {
1002
+ const client = getClient();
1003
+ const result = await client.notes.update(id, opts.note);
1004
+ success('Note updated!');
1005
+ print(result, getFormat(notesCmd));
1006
+ } catch (err) {
1007
+ error(String(err));
1008
+ process.exit(1);
1009
+ }
1010
+ });
1011
+
1012
+ notesCmd
1013
+ .command('delete <id>')
1014
+ .description('Delete a note')
1015
+ .action(async (id: string) => {
1016
+ try {
1017
+ const client = getClient();
1018
+ await client.notes.delete(id);
1019
+ success('Note deleted!');
1020
+ } catch (err) {
1021
+ error(String(err));
1022
+ process.exit(1);
1023
+ }
1024
+ });
1025
+
1026
+ // Parse and execute
1027
+ program.parse();