agent-messenger 1.0.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 (394) hide show
  1. package/.claude/commands/release.md +92 -0
  2. package/.claude-plugin/README.md +144 -0
  3. package/.claude-plugin/marketplace.json +37 -0
  4. package/.claude-plugin/plugin.json +17 -0
  5. package/.github/workflows/ci.yml +30 -0
  6. package/CLAUDE.md +106 -0
  7. package/CONTRIBUTING.md +131 -0
  8. package/README.md +140 -0
  9. package/biome.json +34 -0
  10. package/bun.lock +252 -0
  11. package/dist/cli.d.ts +5 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +21 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/auth.d.ts +3 -0
  16. package/dist/commands/auth.d.ts.map +1 -0
  17. package/dist/commands/auth.js +140 -0
  18. package/dist/commands/auth.js.map +1 -0
  19. package/dist/commands/channel.d.ts +3 -0
  20. package/dist/commands/channel.d.ts.map +1 -0
  21. package/dist/commands/channel.js +118 -0
  22. package/dist/commands/channel.js.map +1 -0
  23. package/dist/commands/file.d.ts +3 -0
  24. package/dist/commands/file.d.ts.map +1 -0
  25. package/dist/commands/file.js +113 -0
  26. package/dist/commands/file.js.map +1 -0
  27. package/dist/commands/index.d.ts +9 -0
  28. package/dist/commands/index.d.ts.map +1 -0
  29. package/dist/commands/index.js +9 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/commands/message.d.ts +3 -0
  32. package/dist/commands/message.d.ts.map +1 -0
  33. package/dist/commands/message.js +214 -0
  34. package/dist/commands/message.js.map +1 -0
  35. package/dist/commands/reaction.d.ts +3 -0
  36. package/dist/commands/reaction.d.ts.map +1 -0
  37. package/dist/commands/reaction.js +100 -0
  38. package/dist/commands/reaction.js.map +1 -0
  39. package/dist/commands/snapshot.d.ts +3 -0
  40. package/dist/commands/snapshot.d.ts.map +1 -0
  41. package/dist/commands/snapshot.js +88 -0
  42. package/dist/commands/snapshot.js.map +1 -0
  43. package/dist/commands/user.d.ts +3 -0
  44. package/dist/commands/user.d.ts.map +1 -0
  45. package/dist/commands/user.js +96 -0
  46. package/dist/commands/user.js.map +1 -0
  47. package/dist/commands/workspace.d.ts +3 -0
  48. package/dist/commands/workspace.d.ts.map +1 -0
  49. package/dist/commands/workspace.js +89 -0
  50. package/dist/commands/workspace.js.map +1 -0
  51. package/dist/lib/credential-manager.d.ts +13 -0
  52. package/dist/lib/credential-manager.d.ts.map +1 -0
  53. package/dist/lib/credential-manager.js +58 -0
  54. package/dist/lib/credential-manager.js.map +1 -0
  55. package/dist/lib/index.d.ts +3 -0
  56. package/dist/lib/index.d.ts.map +1 -0
  57. package/dist/lib/index.js +3 -0
  58. package/dist/lib/index.js.map +1 -0
  59. package/dist/lib/ref-manager.d.ts +26 -0
  60. package/dist/lib/ref-manager.d.ts.map +1 -0
  61. package/dist/lib/ref-manager.js +92 -0
  62. package/dist/lib/ref-manager.js.map +1 -0
  63. package/dist/lib/slack-client.d.ts +37 -0
  64. package/dist/lib/slack-client.d.ts.map +1 -0
  65. package/dist/lib/slack-client.js +379 -0
  66. package/dist/lib/slack-client.js.map +1 -0
  67. package/dist/lib/token-extractor.d.ts +28 -0
  68. package/dist/lib/token-extractor.d.ts.map +1 -0
  69. package/dist/lib/token-extractor.js +401 -0
  70. package/dist/lib/token-extractor.js.map +1 -0
  71. package/dist/package.json +37 -0
  72. package/dist/src/cli.d.ts +5 -0
  73. package/dist/src/cli.d.ts.map +1 -0
  74. package/dist/src/cli.js +22 -0
  75. package/dist/src/cli.js.map +1 -0
  76. package/dist/src/platforms/discord/cli.d.ts +5 -0
  77. package/dist/src/platforms/discord/cli.d.ts.map +1 -0
  78. package/dist/src/platforms/discord/cli.js +22 -0
  79. package/dist/src/platforms/discord/cli.js.map +1 -0
  80. package/dist/src/platforms/discord/client.d.ts +34 -0
  81. package/dist/src/platforms/discord/client.d.ts.map +1 -0
  82. package/dist/src/platforms/discord/client.js +187 -0
  83. package/dist/src/platforms/discord/client.js.map +1 -0
  84. package/dist/src/platforms/discord/client.test.d.ts +2 -0
  85. package/dist/src/platforms/discord/client.test.d.ts.map +1 -0
  86. package/dist/src/platforms/discord/client.test.js +367 -0
  87. package/dist/src/platforms/discord/client.test.js.map +1 -0
  88. package/dist/src/platforms/discord/commands/auth.d.ts +13 -0
  89. package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -0
  90. package/dist/src/platforms/discord/commands/auth.js +155 -0
  91. package/dist/src/platforms/discord/commands/auth.js.map +1 -0
  92. package/dist/src/platforms/discord/commands/auth.test.d.ts +2 -0
  93. package/dist/src/platforms/discord/commands/auth.test.d.ts.map +1 -0
  94. package/dist/src/platforms/discord/commands/auth.test.js +65 -0
  95. package/dist/src/platforms/discord/commands/auth.test.js.map +1 -0
  96. package/dist/src/platforms/discord/commands/channel.d.ts +13 -0
  97. package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -0
  98. package/dist/src/platforms/discord/commands/channel.js +99 -0
  99. package/dist/src/platforms/discord/commands/channel.js.map +1 -0
  100. package/dist/src/platforms/discord/commands/channel.test.d.ts +2 -0
  101. package/dist/src/platforms/discord/commands/channel.test.d.ts.map +1 -0
  102. package/dist/src/platforms/discord/commands/channel.test.js +136 -0
  103. package/dist/src/platforms/discord/commands/channel.test.js.map +1 -0
  104. package/dist/src/platforms/discord/commands/file.d.ts +13 -0
  105. package/dist/src/platforms/discord/commands/file.d.ts.map +1 -0
  106. package/dist/src/platforms/discord/commands/file.js +99 -0
  107. package/dist/src/platforms/discord/commands/file.js.map +1 -0
  108. package/dist/src/platforms/discord/commands/file.test.d.ts +2 -0
  109. package/dist/src/platforms/discord/commands/file.test.d.ts.map +1 -0
  110. package/dist/src/platforms/discord/commands/file.test.js +83 -0
  111. package/dist/src/platforms/discord/commands/file.test.js.map +1 -0
  112. package/dist/src/platforms/discord/commands/guild.d.ts +15 -0
  113. package/dist/src/platforms/discord/commands/guild.d.ts.map +1 -0
  114. package/dist/src/platforms/discord/commands/guild.js +102 -0
  115. package/dist/src/platforms/discord/commands/guild.js.map +1 -0
  116. package/dist/src/platforms/discord/commands/guild.test.d.ts +2 -0
  117. package/dist/src/platforms/discord/commands/guild.test.d.ts.map +1 -0
  118. package/dist/src/platforms/discord/commands/guild.test.js +100 -0
  119. package/dist/src/platforms/discord/commands/guild.test.js.map +1 -0
  120. package/dist/src/platforms/discord/commands/index.d.ts +9 -0
  121. package/dist/src/platforms/discord/commands/index.d.ts.map +1 -0
  122. package/dist/src/platforms/discord/commands/index.js +9 -0
  123. package/dist/src/platforms/discord/commands/index.js.map +1 -0
  124. package/dist/src/platforms/discord/commands/message.d.ts +17 -0
  125. package/dist/src/platforms/discord/commands/message.d.ts.map +1 -0
  126. package/dist/src/platforms/discord/commands/message.js +131 -0
  127. package/dist/src/platforms/discord/commands/message.js.map +1 -0
  128. package/dist/src/platforms/discord/commands/message.test.d.ts +2 -0
  129. package/dist/src/platforms/discord/commands/message.test.d.ts.map +1 -0
  130. package/dist/src/platforms/discord/commands/message.test.js +91 -0
  131. package/dist/src/platforms/discord/commands/message.test.js.map +1 -0
  132. package/dist/src/platforms/discord/commands/reaction.d.ts +12 -0
  133. package/dist/src/platforms/discord/commands/reaction.d.ts.map +1 -0
  134. package/dist/src/platforms/discord/commands/reaction.js +99 -0
  135. package/dist/src/platforms/discord/commands/reaction.js.map +1 -0
  136. package/dist/src/platforms/discord/commands/reaction.test.d.ts +2 -0
  137. package/dist/src/platforms/discord/commands/reaction.test.d.ts.map +1 -0
  138. package/dist/src/platforms/discord/commands/reaction.test.js +115 -0
  139. package/dist/src/platforms/discord/commands/reaction.test.js.map +1 -0
  140. package/dist/src/platforms/discord/commands/snapshot.d.ts +9 -0
  141. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -0
  142. package/dist/src/platforms/discord/commands/snapshot.js +80 -0
  143. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -0
  144. package/dist/src/platforms/discord/commands/snapshot.test.d.ts +2 -0
  145. package/dist/src/platforms/discord/commands/snapshot.test.d.ts.map +1 -0
  146. package/dist/src/platforms/discord/commands/snapshot.test.js +25 -0
  147. package/dist/src/platforms/discord/commands/snapshot.test.js.map +1 -0
  148. package/dist/src/platforms/discord/commands/user.d.ts +3 -0
  149. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -0
  150. package/dist/src/platforms/discord/commands/user.js +94 -0
  151. package/dist/src/platforms/discord/commands/user.js.map +1 -0
  152. package/dist/src/platforms/discord/commands/user.test.d.ts +2 -0
  153. package/dist/src/platforms/discord/commands/user.test.d.ts.map +1 -0
  154. package/dist/src/platforms/discord/commands/user.test.js +103 -0
  155. package/dist/src/platforms/discord/commands/user.test.js.map +1 -0
  156. package/dist/src/platforms/discord/credential-manager.d.ts +33 -0
  157. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -0
  158. package/dist/src/platforms/discord/credential-manager.js +73 -0
  159. package/dist/src/platforms/discord/credential-manager.js.map +1 -0
  160. package/dist/src/platforms/discord/credential-manager.test.d.ts +2 -0
  161. package/dist/src/platforms/discord/credential-manager.test.d.ts.map +1 -0
  162. package/dist/src/platforms/discord/credential-manager.test.js +136 -0
  163. package/dist/src/platforms/discord/credential-manager.test.js.map +1 -0
  164. package/dist/src/platforms/discord/token-extractor.d.ts +55 -0
  165. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -0
  166. package/dist/src/platforms/discord/token-extractor.js +462 -0
  167. package/dist/src/platforms/discord/token-extractor.js.map +1 -0
  168. package/dist/src/platforms/discord/token-extractor.test.d.ts +2 -0
  169. package/dist/src/platforms/discord/token-extractor.test.d.ts.map +1 -0
  170. package/dist/src/platforms/discord/token-extractor.test.js +789 -0
  171. package/dist/src/platforms/discord/token-extractor.test.js.map +1 -0
  172. package/dist/src/platforms/discord/types.d.ts +251 -0
  173. package/dist/src/platforms/discord/types.d.ts.map +1 -0
  174. package/dist/src/platforms/discord/types.js +74 -0
  175. package/dist/src/platforms/discord/types.js.map +1 -0
  176. package/dist/src/platforms/discord/types.test.d.ts +2 -0
  177. package/dist/src/platforms/discord/types.test.d.ts.map +1 -0
  178. package/dist/src/platforms/discord/types.test.js +211 -0
  179. package/dist/src/platforms/discord/types.test.js.map +1 -0
  180. package/dist/src/platforms/slack/cli.d.ts +5 -0
  181. package/dist/src/platforms/slack/cli.d.ts.map +1 -0
  182. package/dist/src/platforms/slack/cli.js +22 -0
  183. package/dist/src/platforms/slack/cli.js.map +1 -0
  184. package/dist/src/platforms/slack/client.d.ts +47 -0
  185. package/dist/src/platforms/slack/client.d.ts.map +1 -0
  186. package/dist/src/platforms/slack/client.js +412 -0
  187. package/dist/src/platforms/slack/client.js.map +1 -0
  188. package/dist/src/platforms/slack/commands/auth.d.ts +3 -0
  189. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -0
  190. package/dist/src/platforms/slack/commands/auth.js +156 -0
  191. package/dist/src/platforms/slack/commands/auth.js.map +1 -0
  192. package/dist/src/platforms/slack/commands/channel.d.ts +3 -0
  193. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -0
  194. package/dist/src/platforms/slack/commands/channel.js +118 -0
  195. package/dist/src/platforms/slack/commands/channel.js.map +1 -0
  196. package/dist/src/platforms/slack/commands/file.d.ts +3 -0
  197. package/dist/src/platforms/slack/commands/file.d.ts.map +1 -0
  198. package/dist/src/platforms/slack/commands/file.js +113 -0
  199. package/dist/src/platforms/slack/commands/file.js.map +1 -0
  200. package/dist/src/platforms/slack/commands/index.d.ts +9 -0
  201. package/dist/src/platforms/slack/commands/index.d.ts.map +1 -0
  202. package/dist/src/platforms/slack/commands/index.js +9 -0
  203. package/dist/src/platforms/slack/commands/index.js.map +1 -0
  204. package/dist/src/platforms/slack/commands/message.d.ts +3 -0
  205. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -0
  206. package/dist/src/platforms/slack/commands/message.js +263 -0
  207. package/dist/src/platforms/slack/commands/message.js.map +1 -0
  208. package/dist/src/platforms/slack/commands/reaction.d.ts +3 -0
  209. package/dist/src/platforms/slack/commands/reaction.d.ts.map +1 -0
  210. package/dist/src/platforms/slack/commands/reaction.js +100 -0
  211. package/dist/src/platforms/slack/commands/reaction.js.map +1 -0
  212. package/dist/src/platforms/slack/commands/snapshot.d.ts +3 -0
  213. package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -0
  214. package/dist/src/platforms/slack/commands/snapshot.js +87 -0
  215. package/dist/src/platforms/slack/commands/snapshot.js.map +1 -0
  216. package/dist/src/platforms/slack/commands/user.d.ts +3 -0
  217. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -0
  218. package/dist/src/platforms/slack/commands/user.js +96 -0
  219. package/dist/src/platforms/slack/commands/user.js.map +1 -0
  220. package/dist/src/platforms/slack/commands/workspace.d.ts +3 -0
  221. package/dist/src/platforms/slack/commands/workspace.d.ts.map +1 -0
  222. package/dist/src/platforms/slack/commands/workspace.js +89 -0
  223. package/dist/src/platforms/slack/commands/workspace.js.map +1 -0
  224. package/dist/src/platforms/slack/credential-manager.d.ts +13 -0
  225. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -0
  226. package/dist/src/platforms/slack/credential-manager.js +58 -0
  227. package/dist/src/platforms/slack/credential-manager.js.map +1 -0
  228. package/dist/src/platforms/slack/index.d.ts +3 -0
  229. package/dist/src/platforms/slack/index.d.ts.map +1 -0
  230. package/dist/src/platforms/slack/index.js +3 -0
  231. package/dist/src/platforms/slack/index.js.map +1 -0
  232. package/dist/src/platforms/slack/token-extractor.d.ts +28 -0
  233. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -0
  234. package/dist/src/platforms/slack/token-extractor.js +401 -0
  235. package/dist/src/platforms/slack/token-extractor.js.map +1 -0
  236. package/dist/src/platforms/slack/types.d.ts +369 -0
  237. package/dist/src/platforms/slack/types.d.ts.map +1 -0
  238. package/dist/src/platforms/slack/types.js +92 -0
  239. package/dist/src/platforms/slack/types.js.map +1 -0
  240. package/dist/src/shared/utils/concurrency.d.ts +2 -0
  241. package/dist/src/shared/utils/concurrency.d.ts.map +1 -0
  242. package/dist/src/shared/utils/concurrency.js +14 -0
  243. package/dist/src/shared/utils/concurrency.js.map +1 -0
  244. package/dist/src/shared/utils/concurrency.test.d.ts +2 -0
  245. package/dist/src/shared/utils/concurrency.test.d.ts.map +1 -0
  246. package/dist/src/shared/utils/concurrency.test.js +39 -0
  247. package/dist/src/shared/utils/concurrency.test.js.map +1 -0
  248. package/dist/src/shared/utils/error-handler.d.ts +2 -0
  249. package/dist/src/shared/utils/error-handler.d.ts.map +1 -0
  250. package/dist/src/shared/utils/error-handler.js +5 -0
  251. package/dist/src/shared/utils/error-handler.js.map +1 -0
  252. package/dist/src/shared/utils/output.d.ts +2 -0
  253. package/dist/src/shared/utils/output.d.ts.map +1 -0
  254. package/dist/src/shared/utils/output.js +4 -0
  255. package/dist/src/shared/utils/output.js.map +1 -0
  256. package/dist/tests/cli.test.d.ts +2 -0
  257. package/dist/tests/cli.test.d.ts.map +1 -0
  258. package/dist/tests/cli.test.js +83 -0
  259. package/dist/tests/cli.test.js.map +1 -0
  260. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/CURRENT +1 -0
  261. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOCK +0 -0
  262. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG +3 -0
  263. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG.old +1 -0
  264. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/MANIFEST-000004 +0 -0
  265. package/dist/tests/commands/auth.test.d.ts +2 -0
  266. package/dist/tests/commands/auth.test.d.ts.map +1 -0
  267. package/dist/tests/commands/auth.test.js +304 -0
  268. package/dist/tests/commands/auth.test.js.map +1 -0
  269. package/dist/tests/commands/channel.test.d.ts +2 -0
  270. package/dist/tests/commands/channel.test.d.ts.map +1 -0
  271. package/dist/tests/commands/channel.test.js +166 -0
  272. package/dist/tests/commands/channel.test.js.map +1 -0
  273. package/dist/tests/commands/file.test.d.ts +2 -0
  274. package/dist/tests/commands/file.test.d.ts.map +1 -0
  275. package/dist/tests/commands/file.test.js +175 -0
  276. package/dist/tests/commands/file.test.js.map +1 -0
  277. package/dist/tests/commands/message.test.d.ts +2 -0
  278. package/dist/tests/commands/message.test.d.ts.map +1 -0
  279. package/dist/tests/commands/message.test.js +293 -0
  280. package/dist/tests/commands/message.test.js.map +1 -0
  281. package/dist/tests/commands/reaction.test.d.ts +2 -0
  282. package/dist/tests/commands/reaction.test.d.ts.map +1 -0
  283. package/dist/tests/commands/reaction.test.js +84 -0
  284. package/dist/tests/commands/reaction.test.js.map +1 -0
  285. package/dist/tests/commands/snapshot.test.d.ts +2 -0
  286. package/dist/tests/commands/snapshot.test.d.ts.map +1 -0
  287. package/dist/tests/commands/snapshot.test.js +280 -0
  288. package/dist/tests/commands/snapshot.test.js.map +1 -0
  289. package/dist/tests/commands/user.test.d.ts +2 -0
  290. package/dist/tests/commands/user.test.d.ts.map +1 -0
  291. package/dist/tests/commands/user.test.js +117 -0
  292. package/dist/tests/commands/user.test.js.map +1 -0
  293. package/dist/tests/commands/workspace.test.d.ts +2 -0
  294. package/dist/tests/commands/workspace.test.d.ts.map +1 -0
  295. package/dist/tests/commands/workspace.test.js +453 -0
  296. package/dist/tests/commands/workspace.test.js.map +1 -0
  297. package/dist/tests/credential-manager.test.d.ts +2 -0
  298. package/dist/tests/credential-manager.test.d.ts.map +1 -0
  299. package/dist/tests/credential-manager.test.js +199 -0
  300. package/dist/tests/credential-manager.test.js.map +1 -0
  301. package/dist/tests/slack-client.test.d.ts +2 -0
  302. package/dist/tests/slack-client.test.d.ts.map +1 -0
  303. package/dist/tests/slack-client.test.js +741 -0
  304. package/dist/tests/slack-client.test.js.map +1 -0
  305. package/dist/tests/types.test.d.ts +2 -0
  306. package/dist/tests/types.test.d.ts.map +1 -0
  307. package/dist/tests/types.test.js +215 -0
  308. package/dist/tests/types.test.js.map +1 -0
  309. package/dist/types/index.d.ts +369 -0
  310. package/dist/types/index.d.ts.map +1 -0
  311. package/dist/types/index.js +92 -0
  312. package/dist/types/index.js.map +1 -0
  313. package/dist/utils/error-handler.d.ts +2 -0
  314. package/dist/utils/error-handler.d.ts.map +1 -0
  315. package/dist/utils/error-handler.js +5 -0
  316. package/dist/utils/error-handler.js.map +1 -0
  317. package/dist/utils/output.d.ts +2 -0
  318. package/dist/utils/output.d.ts.map +1 -0
  319. package/dist/utils/output.js +4 -0
  320. package/dist/utils/output.js.map +1 -0
  321. package/docs/discord.md +182 -0
  322. package/docs/slack.md +160 -0
  323. package/package.json +37 -0
  324. package/skills/agent-discord/SKILL.md +273 -0
  325. package/skills/agent-discord/references/authentication.md +294 -0
  326. package/skills/agent-discord/references/common-patterns.md +455 -0
  327. package/skills/agent-discord/templates/guild-summary.sh +167 -0
  328. package/skills/agent-discord/templates/monitor-channel.sh +180 -0
  329. package/skills/agent-discord/templates/post-message.sh +173 -0
  330. package/skills/agent-slack/SKILL.md +268 -0
  331. package/skills/agent-slack/references/authentication.md +332 -0
  332. package/skills/agent-slack/references/common-patterns.md +527 -0
  333. package/skills/agent-slack/templates/monitor-channel.sh +186 -0
  334. package/skills/agent-slack/templates/post-message.sh +130 -0
  335. package/skills/agent-slack/templates/workspace-summary.sh +149 -0
  336. package/src/cli.ts +29 -0
  337. package/src/platforms/discord/cli.ts +36 -0
  338. package/src/platforms/discord/client.test.ts +456 -0
  339. package/src/platforms/discord/client.ts +281 -0
  340. package/src/platforms/discord/commands/auth.test.ts +72 -0
  341. package/src/platforms/discord/commands/auth.ts +206 -0
  342. package/src/platforms/discord/commands/channel.test.ts +153 -0
  343. package/src/platforms/discord/commands/channel.ts +127 -0
  344. package/src/platforms/discord/commands/file.test.ts +98 -0
  345. package/src/platforms/discord/commands/file.ts +134 -0
  346. package/src/platforms/discord/commands/guild.test.ts +117 -0
  347. package/src/platforms/discord/commands/guild.ts +129 -0
  348. package/src/platforms/discord/commands/index.ts +8 -0
  349. package/src/platforms/discord/commands/message.test.ts +107 -0
  350. package/src/platforms/discord/commands/message.ts +182 -0
  351. package/src/platforms/discord/commands/reaction.test.ts +123 -0
  352. package/src/platforms/discord/commands/reaction.ts +156 -0
  353. package/src/platforms/discord/commands/snapshot.test.ts +29 -0
  354. package/src/platforms/discord/commands/snapshot.ts +104 -0
  355. package/src/platforms/discord/commands/user.test.ts +115 -0
  356. package/src/platforms/discord/commands/user.ts +124 -0
  357. package/src/platforms/discord/credential-manager.test.ts +173 -0
  358. package/src/platforms/discord/credential-manager.ts +95 -0
  359. package/src/platforms/discord/token-extractor.test.ts +918 -0
  360. package/src/platforms/discord/token-extractor.ts +549 -0
  361. package/src/platforms/discord/types.test.ts +245 -0
  362. package/src/platforms/discord/types.ts +158 -0
  363. package/src/platforms/slack/cli.ts +36 -0
  364. package/src/platforms/slack/client.ts +466 -0
  365. package/src/platforms/slack/commands/auth.ts +211 -0
  366. package/src/platforms/slack/commands/channel.ts +158 -0
  367. package/src/platforms/slack/commands/file.ts +153 -0
  368. package/src/platforms/slack/commands/index.ts +8 -0
  369. package/src/platforms/slack/commands/message.ts +369 -0
  370. package/src/platforms/slack/commands/reaction.ts +166 -0
  371. package/src/platforms/slack/commands/snapshot.ts +114 -0
  372. package/src/platforms/slack/commands/user.ts +110 -0
  373. package/src/platforms/slack/commands/workspace.ts +111 -0
  374. package/src/platforms/slack/credential-manager.ts +74 -0
  375. package/src/platforms/slack/index.ts +2 -0
  376. package/src/platforms/slack/token-extractor.ts +496 -0
  377. package/src/platforms/slack/types.ts +193 -0
  378. package/src/shared/utils/concurrency.test.ts +53 -0
  379. package/src/shared/utils/concurrency.ts +20 -0
  380. package/src/shared/utils/error-handler.ts +4 -0
  381. package/src/shared/utils/output.ts +3 -0
  382. package/tests/cli.test.ts +94 -0
  383. package/tests/commands/auth.test.ts +383 -0
  384. package/tests/commands/channel.test.ts +185 -0
  385. package/tests/commands/file.test.ts +204 -0
  386. package/tests/commands/message.test.ts +344 -0
  387. package/tests/commands/reaction.test.ts +101 -0
  388. package/tests/commands/snapshot.test.ts +308 -0
  389. package/tests/commands/user.test.ts +138 -0
  390. package/tests/commands/workspace.test.ts +528 -0
  391. package/tests/credential-manager.test.ts +241 -0
  392. package/tests/slack-client.test.ts +916 -0
  393. package/tests/types.test.ts +241 -0
  394. package/tsconfig.json +36 -0
@@ -0,0 +1,344 @@
1
+ import { beforeEach, describe, expect, mock, test } from 'bun:test'
2
+ import { SlackClient } from '../../src/platforms/slack/client'
3
+ import type { SlackMessage } from '../../src/platforms/slack/types'
4
+
5
+ describe('Message Commands', () => {
6
+ let mockClient: SlackClient
7
+
8
+ beforeEach(() => {
9
+ // Mock SlackClient
10
+ mockClient = {
11
+ sendMessage: mock(async (_channel: string, text: string, threadTs?: string) => ({
12
+ ts: '1234567890.123456',
13
+ text,
14
+ type: 'message',
15
+ user: 'U123',
16
+ thread_ts: threadTs,
17
+ })),
18
+ getMessages: mock(async (_channel: string, _limit?: number) => [
19
+ {
20
+ ts: '1234567890.123456',
21
+ text: 'First message',
22
+ type: 'message',
23
+ user: 'U123',
24
+ },
25
+ {
26
+ ts: '1234567890.123457',
27
+ text: 'Second message',
28
+ type: 'message',
29
+ user: 'U456',
30
+ },
31
+ ]),
32
+ updateMessage: mock(async (_channel: string, ts: string, text: string) => ({
33
+ ts,
34
+ text,
35
+ type: 'message',
36
+ user: 'U123',
37
+ })),
38
+ deleteMessage: mock(async (_channel: string, _ts: string) => {
39
+ // no-op
40
+ }),
41
+ getMessage: mock(async (_channel: string, ts: string) => {
42
+ if (ts === '1234567890.123456') {
43
+ return {
44
+ ts: '1234567890.123456',
45
+ text: 'Found single message',
46
+ type: 'message',
47
+ user: 'U123',
48
+ }
49
+ }
50
+ return null
51
+ }),
52
+ searchMessages: mock(async (_query: string, _options?: any) => [
53
+ {
54
+ ts: '1234567890.123456',
55
+ text: 'Found message 1',
56
+ user: 'U123',
57
+ channel: { id: 'C001', name: 'general' },
58
+ permalink: 'https://workspace.slack.com/archives/C001/p1234567890123456',
59
+ },
60
+ {
61
+ ts: '1234567890.123457',
62
+ text: 'Found message 2',
63
+ user: 'U456',
64
+ channel: { id: 'C002', name: 'random' },
65
+ permalink: 'https://workspace.slack.com/archives/C002/p1234567890123457',
66
+ },
67
+ ]),
68
+ getThreadReplies: mock(async (_channel: string, _threadTs: string, _options?: any) => ({
69
+ messages: [
70
+ {
71
+ ts: '1234567890.123456',
72
+ text: 'Parent message',
73
+ type: 'message',
74
+ user: 'U123',
75
+ thread_ts: '1234567890.123456',
76
+ reply_count: 2,
77
+ },
78
+ {
79
+ ts: '1234567890.123457',
80
+ text: 'First reply',
81
+ type: 'message',
82
+ user: 'U456',
83
+ thread_ts: '1234567890.123456',
84
+ },
85
+ {
86
+ ts: '1234567890.123458',
87
+ text: 'Second reply',
88
+ type: 'message',
89
+ user: 'U789',
90
+ thread_ts: '1234567890.123456',
91
+ },
92
+ ],
93
+ has_more: false,
94
+ })),
95
+ } as any
96
+ })
97
+
98
+ describe('message send', () => {
99
+ test('sends message to channel', async () => {
100
+ // Given: A channel and message text
101
+ const channel = 'C123'
102
+ const text = 'Hello, world!'
103
+
104
+ // When: Sending message
105
+ const result = await mockClient.sendMessage(channel, text)
106
+
107
+ // Then: Should return message with ts
108
+ expect(result.ts).toBeDefined()
109
+ expect(result.text).toBe(text)
110
+ expect(result.type).toBe('message')
111
+ })
112
+
113
+ test('sends message to thread', async () => {
114
+ // Given: A channel, message text, and thread ts
115
+ const channel = 'C123'
116
+ const text = 'Reply in thread'
117
+ const threadTs = '1234567890.123456'
118
+
119
+ // When: Sending message with thread_ts
120
+ const result = await mockClient.sendMessage(channel, text, threadTs)
121
+
122
+ // Then: Should include thread_ts
123
+ expect(result.thread_ts).toBe(threadTs)
124
+ expect(result.text).toBe(text)
125
+ })
126
+ })
127
+
128
+ describe('message list', () => {
129
+ test('lists messages from channel', async () => {
130
+ // Given: A channel
131
+ const channel = 'C123'
132
+
133
+ // When: Getting messages
134
+ const messages = await mockClient.getMessages(channel)
135
+
136
+ // Then: Should return array of messages
137
+ expect(messages).toHaveLength(2)
138
+ expect(messages[0].text).toBe('First message')
139
+ expect(messages[1].text).toBe('Second message')
140
+ })
141
+
142
+ test('respects limit parameter', async () => {
143
+ // Given: A channel and limit
144
+ const channel = 'C123'
145
+ const limit = 10
146
+
147
+ // When: Getting messages with limit
148
+ const messages = await mockClient.getMessages(channel, limit)
149
+
150
+ // Then: Should pass limit to API
151
+ expect(messages).toBeDefined()
152
+ })
153
+
154
+ test('filters messages by thread', async () => {
155
+ // Given: A channel and thread ts
156
+ const channel = 'C123'
157
+ const _threadTs = '1234567890.123456'
158
+
159
+ // When: Getting thread messages
160
+ const messages = await mockClient.getMessages(channel)
161
+
162
+ // Then: Should return messages
163
+ expect(messages).toBeDefined()
164
+ })
165
+ })
166
+
167
+ describe('message update', () => {
168
+ test('updates message text', async () => {
169
+ // Given: A channel, message ts, and new text
170
+ const channel = 'C123'
171
+ const ts = '1234567890.123456'
172
+ const newText = 'Updated message'
173
+
174
+ // When: Updating message
175
+ const result = await mockClient.updateMessage(channel, ts, newText)
176
+
177
+ // Then: Should return updated message
178
+ expect(result.ts).toBe(ts)
179
+ expect(result.text).toBe(newText)
180
+ })
181
+ })
182
+
183
+ describe('message delete', () => {
184
+ test('deletes message', async () => {
185
+ // Given: A channel and message ts
186
+ const channel = 'C123'
187
+ const ts = '1234567890.123456'
188
+
189
+ // When: Deleting message
190
+ await mockClient.deleteMessage(channel, ts)
191
+
192
+ // Then: Should complete without error
193
+ expect(mockClient.deleteMessage).toHaveBeenCalled()
194
+ })
195
+ })
196
+
197
+ describe('message get', () => {
198
+ test('gets single message by timestamp', async () => {
199
+ // Given: A channel and message ts
200
+ const channel = 'C123'
201
+ const ts = '1234567890.123456'
202
+
203
+ // When: Getting message by ts
204
+ const message = await mockClient.getMessage(channel, ts)
205
+
206
+ // Then: Should return the message
207
+ expect(message).not.toBeNull()
208
+ expect(message?.ts).toBe(ts)
209
+ expect(message?.text).toBe('Found single message')
210
+ })
211
+
212
+ test('returns null for non-existent message', async () => {
213
+ // Given: A channel and non-existent ts
214
+ const channel = 'C123'
215
+ const ts = '9999999999.999999'
216
+
217
+ // When: Getting non-existent message
218
+ const message = await mockClient.getMessage(channel, ts)
219
+
220
+ // Then: Should return null
221
+ expect(message).toBeNull()
222
+ })
223
+ })
224
+
225
+ describe('message search', () => {
226
+ test('searches messages across workspace', async () => {
227
+ // Given: A search query
228
+ const query = 'hello world'
229
+
230
+ // When: Searching messages
231
+ const results = await mockClient.searchMessages(query)
232
+
233
+ // Then: Should return matching messages with channel info
234
+ expect(results).toHaveLength(2)
235
+ expect(results[0].text).toBe('Found message 1')
236
+ expect(results[0].channel.name).toBe('general')
237
+ expect(results[0].permalink).toBeDefined()
238
+ })
239
+
240
+ test('returns channel info with each result', async () => {
241
+ // Given: A search query
242
+ const query = 'test'
243
+
244
+ // When: Searching messages
245
+ const results = await mockClient.searchMessages(query)
246
+
247
+ // Then: Each result should have channel info
248
+ for (const result of results) {
249
+ expect(result.channel).toBeDefined()
250
+ expect(result.channel.id).toBeDefined()
251
+ expect(result.channel.name).toBeDefined()
252
+ }
253
+ })
254
+ })
255
+
256
+ describe('message replies', () => {
257
+ test('gets thread replies including parent message', async () => {
258
+ // Given: A channel and thread ts
259
+ const channel = 'C123'
260
+ const threadTs = '1234567890.123456'
261
+
262
+ // When: Getting thread replies
263
+ const result = await mockClient.getThreadReplies(channel, threadTs)
264
+
265
+ // Then: Should return parent and replies
266
+ expect(result.messages).toHaveLength(3)
267
+ expect(result.messages[0].text).toBe('Parent message')
268
+ expect(result.messages[0].reply_count).toBe(2)
269
+ expect(result.messages[1].text).toBe('First reply')
270
+ expect(result.messages[2].text).toBe('Second reply')
271
+ })
272
+
273
+ test('returns has_more flag for pagination', async () => {
274
+ // Given: A channel and thread ts
275
+ const channel = 'C123'
276
+ const threadTs = '1234567890.123456'
277
+
278
+ // When: Getting thread replies
279
+ const result = await mockClient.getThreadReplies(channel, threadTs)
280
+
281
+ // Then: Should include pagination info
282
+ expect(result.has_more).toBe(false)
283
+ })
284
+
285
+ test('all replies have same thread_ts as parent', async () => {
286
+ // Given: A channel and thread ts
287
+ const channel = 'C123'
288
+ const threadTs = '1234567890.123456'
289
+
290
+ // When: Getting thread replies
291
+ const result = await mockClient.getThreadReplies(channel, threadTs)
292
+
293
+ // Then: All messages should have the same thread_ts
294
+ for (const msg of result.messages) {
295
+ expect(msg.thread_ts).toBe(threadTs)
296
+ }
297
+ })
298
+ })
299
+
300
+ describe('output formatting', () => {
301
+ test('formats message output', () => {
302
+ // Given: A message
303
+ const message: SlackMessage = {
304
+ ts: '1234567890.123456',
305
+ text: 'Hello',
306
+ type: 'message',
307
+ user: 'U123',
308
+ }
309
+
310
+ // When: Formatting output
311
+ const output = { ...message }
312
+
313
+ // Then: Should include message fields
314
+ expect(output.ts).toBeDefined()
315
+ expect(output.text).toBe('Hello')
316
+ })
317
+
318
+ test('formats multiple messages', () => {
319
+ // Given: Multiple messages
320
+ const messages: SlackMessage[] = [
321
+ {
322
+ ts: '1234567890.123456',
323
+ text: 'First',
324
+ type: 'message',
325
+ user: 'U123',
326
+ },
327
+ {
328
+ ts: '1234567890.123457',
329
+ text: 'Second',
330
+ type: 'message',
331
+ user: 'U456',
332
+ },
333
+ ]
334
+
335
+ // When: Formatting
336
+ const output = messages.map((msg) => ({ ...msg }))
337
+
338
+ // Then: Should have all messages
339
+ expect(output).toHaveLength(2)
340
+ expect(output[0].text).toBe('First')
341
+ expect(output[1].text).toBe('Second')
342
+ })
343
+ })
344
+ })
@@ -0,0 +1,101 @@
1
+ import { describe, expect, mock, test } from 'bun:test'
2
+ import { Command } from 'commander'
3
+ import { reactionCommand } from '../../src/platforms/slack/commands/reaction'
4
+
5
+ describe('reaction command', () => {
6
+ describe('add subcommand', () => {
7
+ test('adds reaction to message with channel and message ts', async () => {
8
+ const channelId = 'C123'
9
+ const messageTs = '1234567890.123456'
10
+ const emoji = 'thumbsup'
11
+
12
+ const mockAddReaction = mock((..._args: any[]) => Promise.resolve())
13
+ await mockAddReaction(channelId, messageTs, emoji)
14
+
15
+ expect(mockAddReaction).toHaveBeenCalledWith(channelId, messageTs, emoji)
16
+ expect(mockAddReaction).toHaveBeenCalledTimes(1)
17
+ })
18
+
19
+ test('handles emoji without colons', async () => {
20
+ const channelId = 'C123'
21
+ const messageTs = '1234567890.123456'
22
+ const emoji = 'thumbsup'
23
+
24
+ const mockAddReaction = mock((..._args: any[]) => Promise.resolve())
25
+ await mockAddReaction(channelId, messageTs, emoji)
26
+
27
+ expect(mockAddReaction).toHaveBeenCalledWith(channelId, messageTs, 'thumbsup')
28
+ })
29
+ })
30
+
31
+ describe('remove subcommand', () => {
32
+ test('removes reaction from message with channel and message ts', async () => {
33
+ const channelId = 'C123'
34
+ const messageTs = '1234567890.123456'
35
+ const emoji = 'thumbsup'
36
+
37
+ const mockRemoveReaction = mock((..._args: any[]) => Promise.resolve())
38
+ await mockRemoveReaction(channelId, messageTs, emoji)
39
+
40
+ expect(mockRemoveReaction).toHaveBeenCalledWith(channelId, messageTs, emoji)
41
+ expect(mockRemoveReaction).toHaveBeenCalledTimes(1)
42
+ })
43
+ })
44
+
45
+ describe('list subcommand', () => {
46
+ test('lists reactions on a message', async () => {
47
+ const messageTs = '1234567890.123456'
48
+ const mockMessages = [
49
+ {
50
+ ts: messageTs,
51
+ text: 'Hello',
52
+ type: 'message',
53
+ user: 'U456',
54
+ reactions: [
55
+ { name: 'thumbsup', count: 2, users: ['U123', 'U456'] },
56
+ { name: 'heart', count: 1, users: ['U789'] },
57
+ ],
58
+ },
59
+ ]
60
+
61
+ const mockGetMessages = mock(() => Promise.resolve(mockMessages))
62
+ const result = await mockGetMessages()
63
+
64
+ expect(result).toHaveLength(1)
65
+ expect(result[0].ts).toBe(messageTs)
66
+ })
67
+
68
+ test('returns empty reactions list when no reactions', async () => {
69
+ const messageTs = '1234567890.123456'
70
+ const mockMessages = [
71
+ {
72
+ ts: messageTs,
73
+ text: 'Hello',
74
+ type: 'message',
75
+ user: 'U456',
76
+ reactions: [],
77
+ },
78
+ ]
79
+
80
+ const mockGetMessages = mock(() => Promise.resolve(mockMessages))
81
+ const result = await mockGetMessages()
82
+
83
+ expect(result).toHaveLength(1)
84
+ expect(result[0].reactions).toEqual([])
85
+ })
86
+ })
87
+
88
+ describe('command structure', () => {
89
+ test('reaction command exists', () => {
90
+ expect(reactionCommand).toBeInstanceOf(Command)
91
+ })
92
+
93
+ test('reaction command has correct name', () => {
94
+ expect(reactionCommand.name()).toBe('reaction')
95
+ })
96
+
97
+ test('reaction command has description', () => {
98
+ expect(reactionCommand.description()).toBe('Reaction commands')
99
+ })
100
+ })
101
+ })