agent-messenger 1.0.0 → 1.2.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 (512) hide show
  1. package/.claude/commands/release.md +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.github/workflows/ci.yml +1 -1
  4. package/.github/workflows/e2e.yml.disabled +69 -0
  5. package/CONTRIBUTING.md +2 -2
  6. package/README.md +18 -15
  7. package/biome.json +34 -2
  8. package/bun.lock +63 -0
  9. package/dist/package.json +8 -4
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +4 -1
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/platforms/discord/cli.js +4 -4
  14. package/dist/src/platforms/discord/cli.js.map +1 -1
  15. package/dist/src/platforms/discord/client.d.ts +26 -5
  16. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  17. package/dist/src/platforms/discord/client.js +115 -17
  18. package/dist/src/platforms/discord/client.js.map +1 -1
  19. package/dist/src/platforms/discord/commands/auth.js +16 -16
  20. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  21. package/dist/src/platforms/discord/commands/channel.js +4 -4
  22. package/dist/src/platforms/discord/commands/channel.js.map +1 -1
  23. package/dist/src/platforms/discord/commands/dm.d.ts +9 -0
  24. package/dist/src/platforms/discord/commands/dm.d.ts.map +1 -0
  25. package/dist/src/platforms/discord/commands/dm.js +68 -0
  26. package/dist/src/platforms/discord/commands/dm.js.map +1 -0
  27. package/dist/src/platforms/discord/commands/friend.d.ts +3 -0
  28. package/dist/src/platforms/discord/commands/friend.d.ts.map +1 -0
  29. package/dist/src/platforms/discord/commands/friend.js +39 -0
  30. package/dist/src/platforms/discord/commands/friend.js.map +1 -0
  31. package/dist/src/platforms/discord/commands/index.d.ts +1 -1
  32. package/dist/src/platforms/discord/commands/index.d.ts.map +1 -1
  33. package/dist/src/platforms/discord/commands/index.js +1 -1
  34. package/dist/src/platforms/discord/commands/index.js.map +1 -1
  35. package/dist/src/platforms/discord/commands/member.d.ts +3 -0
  36. package/dist/src/platforms/discord/commands/member.d.ts.map +1 -0
  37. package/dist/src/platforms/discord/commands/member.js +47 -0
  38. package/dist/src/platforms/discord/commands/member.js.map +1 -0
  39. package/dist/src/platforms/discord/commands/mention.d.ts +8 -0
  40. package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -0
  41. package/dist/src/platforms/discord/commands/mention.js +47 -0
  42. package/dist/src/platforms/discord/commands/mention.js.map +1 -0
  43. package/dist/src/platforms/discord/commands/message.d.ts +13 -0
  44. package/dist/src/platforms/discord/commands/message.d.ts.map +1 -1
  45. package/dist/src/platforms/discord/commands/message.js +95 -1
  46. package/dist/src/platforms/discord/commands/message.js.map +1 -1
  47. package/dist/src/platforms/discord/commands/note.d.ts +3 -0
  48. package/dist/src/platforms/discord/commands/note.d.ts.map +1 -0
  49. package/dist/src/platforms/discord/commands/note.js +56 -0
  50. package/dist/src/platforms/discord/commands/note.js.map +1 -0
  51. package/dist/src/platforms/discord/commands/profile.d.ts +3 -0
  52. package/dist/src/platforms/discord/commands/profile.d.ts.map +1 -0
  53. package/dist/src/platforms/discord/commands/profile.js +47 -0
  54. package/dist/src/platforms/discord/commands/profile.js.map +1 -0
  55. package/dist/src/platforms/discord/commands/server.d.ts +15 -0
  56. package/dist/src/platforms/discord/commands/server.d.ts.map +1 -0
  57. package/dist/src/platforms/discord/commands/server.js +102 -0
  58. package/dist/src/platforms/discord/commands/server.js.map +1 -0
  59. package/dist/src/platforms/discord/commands/snapshot.js +10 -10
  60. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  61. package/dist/src/platforms/discord/commands/thread.d.ts +10 -0
  62. package/dist/src/platforms/discord/commands/thread.d.ts.map +1 -0
  63. package/dist/src/platforms/discord/commands/thread.js +67 -0
  64. package/dist/src/platforms/discord/commands/thread.js.map +1 -0
  65. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -1
  66. package/dist/src/platforms/discord/commands/user.js +14 -5
  67. package/dist/src/platforms/discord/commands/user.js.map +1 -1
  68. package/dist/src/platforms/discord/credential-manager.d.ts +13 -13
  69. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -1
  70. package/dist/src/platforms/discord/credential-manager.js +28 -22
  71. package/dist/src/platforms/discord/credential-manager.js.map +1 -1
  72. package/dist/src/platforms/discord/super-properties.d.ts +4 -0
  73. package/dist/src/platforms/discord/super-properties.d.ts.map +1 -0
  74. package/dist/src/platforms/discord/super-properties.js +50 -0
  75. package/dist/src/platforms/discord/super-properties.js.map +1 -0
  76. package/dist/src/platforms/discord/token-extractor.d.ts +6 -1
  77. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  78. package/dist/src/platforms/discord/token-extractor.js +27 -2
  79. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  80. package/dist/src/platforms/discord/types.d.ts +389 -22
  81. package/dist/src/platforms/discord/types.d.ts.map +1 -1
  82. package/dist/src/platforms/discord/types.js +46 -4
  83. package/dist/src/platforms/discord/types.js.map +1 -1
  84. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  85. package/dist/src/platforms/slack/cli.js +7 -2
  86. package/dist/src/platforms/slack/cli.js.map +1 -1
  87. package/dist/src/platforms/slack/client.d.ts +19 -1
  88. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  89. package/dist/src/platforms/slack/client.js +134 -0
  90. package/dist/src/platforms/slack/client.js.map +1 -1
  91. package/dist/src/platforms/slack/commands/activity.d.ts +3 -0
  92. package/dist/src/platforms/slack/commands/activity.d.ts.map +1 -0
  93. package/dist/src/platforms/slack/commands/activity.js +40 -0
  94. package/dist/src/platforms/slack/commands/activity.js.map +1 -0
  95. package/dist/src/platforms/slack/commands/drafts.d.ts +3 -0
  96. package/dist/src/platforms/slack/commands/drafts.d.ts.map +1 -0
  97. package/dist/src/platforms/slack/commands/drafts.js +45 -0
  98. package/dist/src/platforms/slack/commands/drafts.js.map +1 -0
  99. package/dist/src/platforms/slack/commands/index.d.ts +5 -0
  100. package/dist/src/platforms/slack/commands/index.d.ts.map +1 -1
  101. package/dist/src/platforms/slack/commands/index.js +5 -0
  102. package/dist/src/platforms/slack/commands/index.js.map +1 -1
  103. package/dist/src/platforms/slack/commands/saved.d.ts +3 -0
  104. package/dist/src/platforms/slack/commands/saved.d.ts.map +1 -0
  105. package/dist/src/platforms/slack/commands/saved.js +54 -0
  106. package/dist/src/platforms/slack/commands/saved.js.map +1 -0
  107. package/dist/src/platforms/slack/commands/sections.d.ts +3 -0
  108. package/dist/src/platforms/slack/commands/sections.d.ts.map +1 -0
  109. package/dist/src/platforms/slack/commands/sections.js +37 -0
  110. package/dist/src/platforms/slack/commands/sections.js.map +1 -0
  111. package/dist/src/platforms/slack/commands/unread.d.ts +12 -0
  112. package/dist/src/platforms/slack/commands/unread.d.ts.map +1 -0
  113. package/dist/src/platforms/slack/commands/unread.js +89 -0
  114. package/dist/src/platforms/slack/commands/unread.js.map +1 -0
  115. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -1
  116. package/dist/src/platforms/slack/credential-manager.js +20 -6
  117. package/dist/src/platforms/slack/credential-manager.js.map +1 -1
  118. package/dist/src/platforms/slack/token-extractor.d.ts +8 -1
  119. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  120. package/dist/src/platforms/slack/token-extractor.js +83 -11
  121. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  122. package/dist/src/platforms/slack/types.d.ts +52 -0
  123. package/dist/src/platforms/slack/types.d.ts.map +1 -1
  124. package/dist/src/platforms/slack/types.js.map +1 -1
  125. package/dist/src/platforms/teams/cli.d.ts.map +1 -0
  126. package/dist/{cli.js → src/platforms/teams/cli.js} +11 -10
  127. package/dist/src/platforms/teams/cli.js.map +1 -0
  128. package/dist/src/platforms/teams/client.d.ts +32 -0
  129. package/dist/src/platforms/teams/client.d.ts.map +1 -0
  130. package/dist/src/platforms/teams/client.js +202 -0
  131. package/dist/src/platforms/teams/client.js.map +1 -0
  132. package/dist/src/platforms/teams/commands/auth.d.ts +14 -0
  133. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -0
  134. package/dist/src/platforms/teams/commands/auth.js +176 -0
  135. package/dist/src/platforms/teams/commands/auth.js.map +1 -0
  136. package/dist/src/platforms/teams/commands/channel.d.ts +13 -0
  137. package/dist/src/platforms/teams/commands/channel.d.ts.map +1 -0
  138. package/dist/src/platforms/teams/commands/channel.js +97 -0
  139. package/dist/src/platforms/teams/commands/channel.js.map +1 -0
  140. package/dist/src/platforms/teams/commands/file.d.ts +12 -0
  141. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -0
  142. package/dist/src/platforms/teams/commands/file.js +104 -0
  143. package/dist/src/platforms/teams/commands/file.js.map +1 -0
  144. package/dist/{commands → src/platforms/teams/commands}/index.d.ts +5 -2
  145. package/dist/src/platforms/teams/commands/index.d.ts.map +1 -0
  146. package/dist/{commands → src/platforms/teams/commands}/index.js +5 -2
  147. package/dist/src/platforms/teams/commands/index.js.map +1 -0
  148. package/dist/src/platforms/teams/commands/message.d.ts +17 -0
  149. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -0
  150. package/dist/src/platforms/teams/commands/message.js +133 -0
  151. package/dist/src/platforms/teams/commands/message.js.map +1 -0
  152. package/dist/src/platforms/teams/commands/reaction.d.ts +9 -0
  153. package/dist/src/platforms/teams/commands/reaction.d.ts.map +1 -0
  154. package/dist/src/platforms/teams/commands/reaction.js +68 -0
  155. package/dist/src/platforms/teams/commands/reaction.js.map +1 -0
  156. package/dist/src/platforms/teams/commands/snapshot.d.ts +10 -0
  157. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -0
  158. package/dist/src/platforms/teams/commands/snapshot.js +85 -0
  159. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -0
  160. package/dist/src/platforms/teams/commands/team.d.ts +18 -0
  161. package/dist/src/platforms/teams/commands/team.d.ts.map +1 -0
  162. package/dist/src/platforms/teams/commands/team.js +130 -0
  163. package/dist/src/platforms/teams/commands/team.js.map +1 -0
  164. package/dist/src/platforms/teams/commands/user.d.ts.map +1 -0
  165. package/dist/src/platforms/teams/commands/user.js +88 -0
  166. package/dist/src/platforms/teams/commands/user.js.map +1 -0
  167. package/dist/src/platforms/teams/credential-manager.d.ts +18 -0
  168. package/dist/src/platforms/teams/credential-manager.d.ts.map +1 -0
  169. package/dist/src/platforms/teams/credential-manager.js +81 -0
  170. package/dist/src/platforms/teams/credential-manager.js.map +1 -0
  171. package/dist/src/platforms/teams/index.d.ts +4 -0
  172. package/dist/src/platforms/teams/index.d.ts.map +1 -0
  173. package/dist/src/platforms/teams/index.js +6 -0
  174. package/dist/src/platforms/teams/index.js.map +1 -0
  175. package/dist/src/platforms/teams/token-extractor.d.ts +41 -0
  176. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -0
  177. package/dist/src/platforms/teams/token-extractor.js +360 -0
  178. package/dist/src/platforms/teams/token-extractor.js.map +1 -0
  179. package/dist/src/platforms/teams/types.d.ts +209 -0
  180. package/dist/src/platforms/teams/types.d.ts.map +1 -0
  181. package/dist/src/platforms/teams/types.js +65 -0
  182. package/dist/src/platforms/teams/types.js.map +1 -0
  183. package/dist/src/shared/utils/derived-key-cache.d.ts +20 -0
  184. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -0
  185. package/dist/src/shared/utils/derived-key-cache.js +52 -0
  186. package/dist/src/shared/utils/derived-key-cache.js.map +1 -0
  187. package/docs/README.md +113 -0
  188. package/docs/biome.json +8 -0
  189. package/docs/bun.lock +1426 -0
  190. package/docs/content/docs/agent-skills.mdx +98 -0
  191. package/docs/content/docs/index.mdx +124 -0
  192. package/docs/{discord.md → content/docs/integrations/discord.mdx} +46 -21
  193. package/docs/content/docs/integrations/meta.json +5 -0
  194. package/docs/{slack.md → content/docs/integrations/slack.mdx} +5 -4
  195. package/docs/content/docs/integrations/teams.mdx +322 -0
  196. package/docs/content/docs/meta.json +8 -0
  197. package/docs/content/docs/quick-start.mdx +103 -0
  198. package/docs/eslint.config.mjs +30 -0
  199. package/docs/next.config.ts +10 -0
  200. package/docs/package.json +42 -0
  201. package/docs/postcss.config.mjs +7 -0
  202. package/docs/public/file.svg +1 -0
  203. package/docs/public/globe.svg +1 -0
  204. package/docs/public/next.svg +1 -0
  205. package/docs/public/vercel.svg +1 -0
  206. package/docs/public/window.svg +1 -0
  207. package/docs/source.config.ts +11 -0
  208. package/docs/src/app/api/search/route.ts +4 -0
  209. package/docs/src/app/docs/[[...slug]]/page.tsx +53 -0
  210. package/docs/src/app/docs/layout.tsx +21 -0
  211. package/docs/src/app/globals.css +10 -0
  212. package/docs/src/app/icon.png +0 -0
  213. package/docs/src/app/layout.config.tsx +7 -0
  214. package/docs/src/app/layout.tsx +35 -0
  215. package/docs/src/app/page.tsx +489 -0
  216. package/docs/src/lib/source.ts +15 -0
  217. package/docs/src/mdx-components.tsx +18 -0
  218. package/docs/tsconfig.json +36 -0
  219. package/e2e/README.md +256 -0
  220. package/e2e/config.ts +51 -0
  221. package/e2e/discord.e2e.test.ts +252 -0
  222. package/e2e/helpers.ts +107 -0
  223. package/e2e/slack.e2e.test.ts +309 -0
  224. package/package.json +8 -4
  225. package/scripts/postbuild.ts +15 -0
  226. package/skills/agent-discord/SKILL.md +96 -30
  227. package/skills/agent-discord/references/authentication.md +27 -27
  228. package/skills/agent-discord/references/common-patterns.md +15 -15
  229. package/skills/agent-discord/templates/post-message.sh +6 -6
  230. package/skills/agent-discord/templates/{guild-summary.sh → server-summary.sh} +20 -20
  231. package/skills/agent-slack/SKILL.md +53 -0
  232. package/skills/agent-teams/SKILL.md +292 -0
  233. package/skills/agent-teams/references/authentication.md +375 -0
  234. package/skills/agent-teams/references/common-patterns.md +596 -0
  235. package/skills/agent-teams/templates/monitor-channel.sh +239 -0
  236. package/skills/agent-teams/templates/post-message.sh +224 -0
  237. package/skills/agent-teams/templates/team-summary.sh +210 -0
  238. package/src/cli.ts +4 -0
  239. package/src/platforms/discord/cli.ts +3 -3
  240. package/src/platforms/discord/client.test.ts +15 -15
  241. package/src/platforms/discord/client.ts +163 -17
  242. package/src/platforms/discord/commands/auth.test.ts +53 -37
  243. package/src/platforms/discord/commands/auth.ts +16 -16
  244. package/src/platforms/discord/commands/channel.test.ts +58 -46
  245. package/src/platforms/discord/commands/channel.ts +4 -4
  246. package/src/platforms/discord/commands/dm.test.ts +146 -0
  247. package/src/platforms/discord/commands/dm.ts +85 -0
  248. package/src/platforms/discord/commands/file.test.ts +40 -53
  249. package/src/platforms/discord/commands/friend.test.ts +134 -0
  250. package/src/platforms/discord/commands/friend.ts +45 -0
  251. package/src/platforms/discord/commands/index.ts +1 -1
  252. package/src/platforms/discord/commands/member.test.ts +98 -0
  253. package/src/platforms/discord/commands/member.ts +59 -0
  254. package/src/platforms/discord/commands/mention.test.ts +129 -0
  255. package/src/platforms/discord/commands/mention.ts +59 -0
  256. package/src/platforms/discord/commands/message.test.ts +139 -44
  257. package/src/platforms/discord/commands/message.ts +134 -1
  258. package/src/platforms/discord/commands/note.test.ts +84 -0
  259. package/src/platforms/discord/commands/note.ts +73 -0
  260. package/src/platforms/discord/commands/profile.test.ts +107 -0
  261. package/src/platforms/discord/commands/profile.ts +55 -0
  262. package/src/platforms/discord/commands/reaction.test.ts +54 -42
  263. package/src/platforms/discord/commands/server.test.ts +137 -0
  264. package/src/platforms/discord/commands/{guild.ts → server.ts} +31 -31
  265. package/src/platforms/discord/commands/snapshot.test.ts +1 -1
  266. package/src/platforms/discord/commands/snapshot.ts +10 -10
  267. package/src/platforms/discord/commands/thread.test.ts +121 -0
  268. package/src/platforms/discord/commands/thread.ts +92 -0
  269. package/src/platforms/discord/commands/user.test.ts +8 -8
  270. package/src/platforms/discord/commands/user.ts +16 -5
  271. package/src/platforms/discord/credential-manager.test.ts +137 -136
  272. package/src/platforms/discord/credential-manager.ts +35 -26
  273. package/src/platforms/discord/super-properties.ts +55 -0
  274. package/src/platforms/discord/token-extractor.test.ts +133 -383
  275. package/src/platforms/discord/token-extractor.ts +37 -3
  276. package/src/platforms/discord/types.test.ts +8 -8
  277. package/src/platforms/discord/types.ts +144 -8
  278. package/{tests → src/platforms/slack}/cli.test.ts +3 -3
  279. package/src/platforms/slack/cli.ts +10 -0
  280. package/{tests/slack-client.test.ts → src/platforms/slack/client.test.ts} +1 -1
  281. package/src/platforms/slack/client.ts +172 -1
  282. package/src/platforms/slack/commands/activity.test.ts +147 -0
  283. package/src/platforms/slack/commands/activity.ts +65 -0
  284. package/{tests → src/platforms/slack}/commands/auth.test.ts +25 -13
  285. package/{tests → src/platforms/slack}/commands/channel.test.ts +2 -2
  286. package/src/platforms/slack/commands/drafts.test.ts +136 -0
  287. package/src/platforms/slack/commands/drafts.ts +62 -0
  288. package/{tests → src/platforms/slack}/commands/file.test.ts +2 -2
  289. package/src/platforms/slack/commands/index.ts +5 -0
  290. package/{tests → src/platforms/slack}/commands/message.test.ts +2 -2
  291. package/{tests → src/platforms/slack}/commands/reaction.test.ts +1 -1
  292. package/src/platforms/slack/commands/saved.test.ts +140 -0
  293. package/src/platforms/slack/commands/saved.ts +71 -0
  294. package/src/platforms/slack/commands/sections.test.ts +80 -0
  295. package/src/platforms/slack/commands/sections.ts +50 -0
  296. package/{tests → src/platforms/slack}/commands/snapshot.test.ts +117 -105
  297. package/src/platforms/slack/commands/unread.test.ts +139 -0
  298. package/src/platforms/slack/commands/unread.ts +129 -0
  299. package/{tests → src/platforms/slack}/commands/user.test.ts +3 -3
  300. package/{tests → src/platforms/slack}/commands/workspace.test.ts +44 -95
  301. package/{tests → src/platforms/slack}/credential-manager.test.ts +2 -2
  302. package/src/platforms/slack/credential-manager.ts +22 -7
  303. package/src/platforms/slack/token-extractor-node-test.ts +40 -0
  304. package/src/platforms/slack/token-extractor-node.test.ts +10 -0
  305. package/src/platforms/slack/token-extractor.ts +93 -12
  306. package/{tests → src/platforms/slack}/types.test.ts +1 -1
  307. package/src/platforms/slack/types.ts +58 -0
  308. package/src/platforms/teams/cli.ts +36 -0
  309. package/src/platforms/teams/client.test.ts +500 -0
  310. package/src/platforms/teams/client.ts +365 -0
  311. package/src/platforms/teams/commands/auth.test.ts +99 -0
  312. package/src/platforms/teams/commands/auth.ts +232 -0
  313. package/src/platforms/teams/commands/channel.test.ts +147 -0
  314. package/src/platforms/teams/commands/channel.ts +129 -0
  315. package/src/platforms/teams/commands/file.test.ts +88 -0
  316. package/src/platforms/teams/commands/file.ts +144 -0
  317. package/src/platforms/teams/commands/index.ts +12 -0
  318. package/src/platforms/teams/commands/message.test.ts +110 -0
  319. package/src/platforms/teams/commands/message.ts +188 -0
  320. package/src/platforms/teams/commands/reaction.test.ts +87 -0
  321. package/src/platforms/teams/commands/reaction.ts +104 -0
  322. package/src/platforms/teams/commands/snapshot.test.ts +35 -0
  323. package/src/platforms/teams/commands/snapshot.ts +115 -0
  324. package/src/platforms/teams/commands/team.test.ts +157 -0
  325. package/src/platforms/teams/commands/team.ts +164 -0
  326. package/src/platforms/teams/commands/user.test.ts +83 -0
  327. package/src/platforms/teams/commands/user.ts +112 -0
  328. package/src/platforms/teams/credential-manager.test.ts +178 -0
  329. package/src/platforms/teams/credential-manager.ts +92 -0
  330. package/src/platforms/teams/index.ts +5 -0
  331. package/src/platforms/teams/token-extractor.test.ts +429 -0
  332. package/src/platforms/teams/token-extractor.ts +490 -0
  333. package/src/platforms/teams/types.test.ts +226 -0
  334. package/src/platforms/teams/types.ts +140 -0
  335. package/src/shared/utils/derived-key-cache.test.ts +136 -0
  336. package/src/shared/utils/derived-key-cache.ts +63 -0
  337. package/tsconfig.json +1 -1
  338. package/dist/cli.d.ts.map +0 -1
  339. package/dist/cli.js.map +0 -1
  340. package/dist/commands/auth.d.ts +0 -3
  341. package/dist/commands/auth.d.ts.map +0 -1
  342. package/dist/commands/auth.js +0 -140
  343. package/dist/commands/auth.js.map +0 -1
  344. package/dist/commands/channel.d.ts +0 -3
  345. package/dist/commands/channel.d.ts.map +0 -1
  346. package/dist/commands/channel.js +0 -118
  347. package/dist/commands/channel.js.map +0 -1
  348. package/dist/commands/file.d.ts +0 -3
  349. package/dist/commands/file.d.ts.map +0 -1
  350. package/dist/commands/file.js +0 -113
  351. package/dist/commands/file.js.map +0 -1
  352. package/dist/commands/index.d.ts.map +0 -1
  353. package/dist/commands/index.js.map +0 -1
  354. package/dist/commands/message.d.ts +0 -3
  355. package/dist/commands/message.d.ts.map +0 -1
  356. package/dist/commands/message.js +0 -214
  357. package/dist/commands/message.js.map +0 -1
  358. package/dist/commands/reaction.d.ts +0 -3
  359. package/dist/commands/reaction.d.ts.map +0 -1
  360. package/dist/commands/reaction.js +0 -100
  361. package/dist/commands/reaction.js.map +0 -1
  362. package/dist/commands/snapshot.d.ts +0 -3
  363. package/dist/commands/snapshot.d.ts.map +0 -1
  364. package/dist/commands/snapshot.js +0 -88
  365. package/dist/commands/snapshot.js.map +0 -1
  366. package/dist/commands/user.d.ts.map +0 -1
  367. package/dist/commands/user.js +0 -96
  368. package/dist/commands/user.js.map +0 -1
  369. package/dist/commands/workspace.d.ts +0 -3
  370. package/dist/commands/workspace.d.ts.map +0 -1
  371. package/dist/commands/workspace.js +0 -89
  372. package/dist/commands/workspace.js.map +0 -1
  373. package/dist/lib/credential-manager.d.ts +0 -13
  374. package/dist/lib/credential-manager.d.ts.map +0 -1
  375. package/dist/lib/credential-manager.js +0 -58
  376. package/dist/lib/credential-manager.js.map +0 -1
  377. package/dist/lib/index.d.ts +0 -3
  378. package/dist/lib/index.d.ts.map +0 -1
  379. package/dist/lib/index.js +0 -3
  380. package/dist/lib/index.js.map +0 -1
  381. package/dist/lib/ref-manager.d.ts +0 -26
  382. package/dist/lib/ref-manager.d.ts.map +0 -1
  383. package/dist/lib/ref-manager.js +0 -92
  384. package/dist/lib/ref-manager.js.map +0 -1
  385. package/dist/lib/slack-client.d.ts +0 -37
  386. package/dist/lib/slack-client.d.ts.map +0 -1
  387. package/dist/lib/slack-client.js +0 -379
  388. package/dist/lib/slack-client.js.map +0 -1
  389. package/dist/lib/token-extractor.d.ts +0 -28
  390. package/dist/lib/token-extractor.d.ts.map +0 -1
  391. package/dist/lib/token-extractor.js +0 -401
  392. package/dist/lib/token-extractor.js.map +0 -1
  393. package/dist/src/platforms/discord/client.test.d.ts +0 -2
  394. package/dist/src/platforms/discord/client.test.d.ts.map +0 -1
  395. package/dist/src/platforms/discord/client.test.js +0 -367
  396. package/dist/src/platforms/discord/client.test.js.map +0 -1
  397. package/dist/src/platforms/discord/commands/auth.test.d.ts +0 -2
  398. package/dist/src/platforms/discord/commands/auth.test.d.ts.map +0 -1
  399. package/dist/src/platforms/discord/commands/auth.test.js +0 -65
  400. package/dist/src/platforms/discord/commands/auth.test.js.map +0 -1
  401. package/dist/src/platforms/discord/commands/channel.test.d.ts +0 -2
  402. package/dist/src/platforms/discord/commands/channel.test.d.ts.map +0 -1
  403. package/dist/src/platforms/discord/commands/channel.test.js +0 -136
  404. package/dist/src/platforms/discord/commands/channel.test.js.map +0 -1
  405. package/dist/src/platforms/discord/commands/file.test.d.ts +0 -2
  406. package/dist/src/platforms/discord/commands/file.test.d.ts.map +0 -1
  407. package/dist/src/platforms/discord/commands/file.test.js +0 -83
  408. package/dist/src/platforms/discord/commands/file.test.js.map +0 -1
  409. package/dist/src/platforms/discord/commands/guild.test.d.ts +0 -2
  410. package/dist/src/platforms/discord/commands/guild.test.d.ts.map +0 -1
  411. package/dist/src/platforms/discord/commands/guild.test.js +0 -100
  412. package/dist/src/platforms/discord/commands/guild.test.js.map +0 -1
  413. package/dist/src/platforms/discord/commands/message.test.d.ts +0 -2
  414. package/dist/src/platforms/discord/commands/message.test.d.ts.map +0 -1
  415. package/dist/src/platforms/discord/commands/message.test.js +0 -91
  416. package/dist/src/platforms/discord/commands/message.test.js.map +0 -1
  417. package/dist/src/platforms/discord/commands/reaction.test.d.ts +0 -2
  418. package/dist/src/platforms/discord/commands/reaction.test.d.ts.map +0 -1
  419. package/dist/src/platforms/discord/commands/reaction.test.js +0 -115
  420. package/dist/src/platforms/discord/commands/reaction.test.js.map +0 -1
  421. package/dist/src/platforms/discord/commands/snapshot.test.d.ts +0 -2
  422. package/dist/src/platforms/discord/commands/snapshot.test.d.ts.map +0 -1
  423. package/dist/src/platforms/discord/commands/snapshot.test.js +0 -25
  424. package/dist/src/platforms/discord/commands/snapshot.test.js.map +0 -1
  425. package/dist/src/platforms/discord/commands/user.test.d.ts +0 -2
  426. package/dist/src/platforms/discord/commands/user.test.d.ts.map +0 -1
  427. package/dist/src/platforms/discord/commands/user.test.js +0 -103
  428. package/dist/src/platforms/discord/commands/user.test.js.map +0 -1
  429. package/dist/src/platforms/discord/credential-manager.test.d.ts +0 -2
  430. package/dist/src/platforms/discord/credential-manager.test.d.ts.map +0 -1
  431. package/dist/src/platforms/discord/credential-manager.test.js +0 -136
  432. package/dist/src/platforms/discord/credential-manager.test.js.map +0 -1
  433. package/dist/src/platforms/discord/token-extractor.test.d.ts +0 -2
  434. package/dist/src/platforms/discord/token-extractor.test.d.ts.map +0 -1
  435. package/dist/src/platforms/discord/token-extractor.test.js +0 -789
  436. package/dist/src/platforms/discord/token-extractor.test.js.map +0 -1
  437. package/dist/src/platforms/discord/types.test.d.ts +0 -2
  438. package/dist/src/platforms/discord/types.test.d.ts.map +0 -1
  439. package/dist/src/platforms/discord/types.test.js +0 -211
  440. package/dist/src/platforms/discord/types.test.js.map +0 -1
  441. package/dist/src/shared/utils/concurrency.test.d.ts +0 -2
  442. package/dist/src/shared/utils/concurrency.test.d.ts.map +0 -1
  443. package/dist/src/shared/utils/concurrency.test.js +0 -39
  444. package/dist/src/shared/utils/concurrency.test.js.map +0 -1
  445. package/dist/tests/cli.test.d.ts +0 -2
  446. package/dist/tests/cli.test.d.ts.map +0 -1
  447. package/dist/tests/cli.test.js +0 -83
  448. package/dist/tests/cli.test.js.map +0 -1
  449. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/CURRENT +0 -1
  450. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOCK +0 -0
  451. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG +0 -3
  452. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG.old +0 -1
  453. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/MANIFEST-000004 +0 -0
  454. package/dist/tests/commands/auth.test.d.ts +0 -2
  455. package/dist/tests/commands/auth.test.d.ts.map +0 -1
  456. package/dist/tests/commands/auth.test.js +0 -304
  457. package/dist/tests/commands/auth.test.js.map +0 -1
  458. package/dist/tests/commands/channel.test.d.ts +0 -2
  459. package/dist/tests/commands/channel.test.d.ts.map +0 -1
  460. package/dist/tests/commands/channel.test.js +0 -166
  461. package/dist/tests/commands/channel.test.js.map +0 -1
  462. package/dist/tests/commands/file.test.d.ts +0 -2
  463. package/dist/tests/commands/file.test.d.ts.map +0 -1
  464. package/dist/tests/commands/file.test.js +0 -175
  465. package/dist/tests/commands/file.test.js.map +0 -1
  466. package/dist/tests/commands/message.test.d.ts +0 -2
  467. package/dist/tests/commands/message.test.d.ts.map +0 -1
  468. package/dist/tests/commands/message.test.js +0 -293
  469. package/dist/tests/commands/message.test.js.map +0 -1
  470. package/dist/tests/commands/reaction.test.d.ts +0 -2
  471. package/dist/tests/commands/reaction.test.d.ts.map +0 -1
  472. package/dist/tests/commands/reaction.test.js +0 -84
  473. package/dist/tests/commands/reaction.test.js.map +0 -1
  474. package/dist/tests/commands/snapshot.test.d.ts +0 -2
  475. package/dist/tests/commands/snapshot.test.d.ts.map +0 -1
  476. package/dist/tests/commands/snapshot.test.js +0 -280
  477. package/dist/tests/commands/snapshot.test.js.map +0 -1
  478. package/dist/tests/commands/user.test.d.ts +0 -2
  479. package/dist/tests/commands/user.test.d.ts.map +0 -1
  480. package/dist/tests/commands/user.test.js +0 -117
  481. package/dist/tests/commands/user.test.js.map +0 -1
  482. package/dist/tests/commands/workspace.test.d.ts +0 -2
  483. package/dist/tests/commands/workspace.test.d.ts.map +0 -1
  484. package/dist/tests/commands/workspace.test.js +0 -453
  485. package/dist/tests/commands/workspace.test.js.map +0 -1
  486. package/dist/tests/credential-manager.test.d.ts +0 -2
  487. package/dist/tests/credential-manager.test.d.ts.map +0 -1
  488. package/dist/tests/credential-manager.test.js +0 -199
  489. package/dist/tests/credential-manager.test.js.map +0 -1
  490. package/dist/tests/slack-client.test.d.ts +0 -2
  491. package/dist/tests/slack-client.test.d.ts.map +0 -1
  492. package/dist/tests/slack-client.test.js +0 -741
  493. package/dist/tests/slack-client.test.js.map +0 -1
  494. package/dist/tests/types.test.d.ts +0 -2
  495. package/dist/tests/types.test.d.ts.map +0 -1
  496. package/dist/tests/types.test.js +0 -215
  497. package/dist/tests/types.test.js.map +0 -1
  498. package/dist/types/index.d.ts +0 -369
  499. package/dist/types/index.d.ts.map +0 -1
  500. package/dist/types/index.js +0 -92
  501. package/dist/types/index.js.map +0 -1
  502. package/dist/utils/error-handler.d.ts +0 -2
  503. package/dist/utils/error-handler.d.ts.map +0 -1
  504. package/dist/utils/error-handler.js +0 -5
  505. package/dist/utils/error-handler.js.map +0 -1
  506. package/dist/utils/output.d.ts +0 -2
  507. package/dist/utils/output.d.ts.map +0 -1
  508. package/dist/utils/output.js +0 -4
  509. package/dist/utils/output.js.map +0 -1
  510. package/src/platforms/discord/commands/guild.test.ts +0 -117
  511. /package/dist/{cli.d.ts → src/platforms/teams/cli.d.ts} +0 -0
  512. /package/dist/{commands → src/platforms/teams/commands}/user.d.ts +0 -0
@@ -0,0 +1,50 @@
1
+ import { Command } from 'commander'
2
+ import { handleError } from '../../../shared/utils/error-handler'
3
+ import { formatOutput } from '../../../shared/utils/output'
4
+ import { SlackClient } from '../client'
5
+ import { CredentialManager } from '../credential-manager'
6
+
7
+ async function listAction(options: { pretty?: boolean }): Promise<void> {
8
+ try {
9
+ const credManager = new CredentialManager()
10
+ const workspace = await credManager.getWorkspace()
11
+
12
+ if (!workspace) {
13
+ console.log(
14
+ formatOutput(
15
+ { error: 'No current workspace set. Run "auth extract" first.' },
16
+ options.pretty
17
+ )
18
+ )
19
+ process.exit(1)
20
+ }
21
+
22
+ const client = new SlackClient(workspace.token, workspace.cookie)
23
+ const sections = await client.getChannelSections()
24
+
25
+ const output = sections.map((section) => ({
26
+ id: section.id,
27
+ name: section.name,
28
+ channel_count: section.channel_ids.length,
29
+ channel_ids: section.channel_ids,
30
+ date_created: section.date_created,
31
+ date_updated: section.date_updated,
32
+ }))
33
+
34
+ console.log(formatOutput(output, options.pretty))
35
+ } catch (error) {
36
+ handleError(error as Error)
37
+ }
38
+ }
39
+
40
+ const sections = new Command('sections').description(
41
+ 'Manage Slack channel sections (sidebar folders)'
42
+ )
43
+
44
+ sections
45
+ .command('list')
46
+ .description('List all channel sections')
47
+ .option('--pretty', 'Pretty print output')
48
+ .action(listAction)
49
+
50
+ export const sectionsCommand = sections
@@ -1,113 +1,10 @@
1
- import { expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
  import { SlackClient } from '@/platforms/slack/client'
3
3
  import { snapshotCommand } from '@/platforms/slack/commands/snapshot'
4
4
  import { CredentialManager } from '@/platforms/slack/credential-manager'
5
5
  import type { SlackChannel, SlackMessage, SlackUser } from '@/platforms/slack/types'
6
6
 
7
- mock.module('@/platforms/slack/credential-manager', () => ({
8
- CredentialManager: class {
9
- async getWorkspace() {
10
- return {
11
- workspace_id: 'T123',
12
- workspace_name: 'Test Workspace',
13
- token: 'xoxc-test',
14
- cookie: 'test-cookie',
15
- }
16
- }
17
- },
18
- }))
19
-
20
- mock.module('@/platforms/slack/client', () => ({
21
- SlackClient: class {
22
- async testAuth() {
23
- return {
24
- user_id: 'U123',
25
- team_id: 'T123',
26
- user: 'testuser',
27
- team: 'Test Workspace',
28
- }
29
- }
30
- async listChannels(): Promise<SlackChannel[]> {
31
- return [
32
- {
33
- id: 'C123',
34
- name: 'general',
35
- is_private: false,
36
- is_archived: false,
37
- created: 1234567890,
38
- creator: 'U123',
39
- topic: { value: 'General discussion', creator: 'U123', last_set: 1234567890 },
40
- purpose: { value: 'General channel', creator: 'U123', last_set: 1234567890 },
41
- },
42
- {
43
- id: 'C456',
44
- name: 'random',
45
- is_private: false,
46
- is_archived: false,
47
- created: 1234567891,
48
- creator: 'U123',
49
- topic: { value: 'Random stuff', creator: 'U123', last_set: 1234567891 },
50
- purpose: { value: 'Random channel', creator: 'U123', last_set: 1234567891 },
51
- },
52
- ]
53
- }
54
- async getMessages(_channel: string, _limit?: number): Promise<SlackMessage[]> {
55
- return [
56
- {
57
- ts: '1234567890.000100',
58
- text: 'Hello world',
59
- type: 'message',
60
- user: 'U123',
61
- username: 'testuser',
62
- thread_ts: undefined,
63
- reply_count: 0,
64
- edited: undefined,
65
- },
66
- {
67
- ts: '1234567890.000200',
68
- text: 'Second message',
69
- type: 'message',
70
- user: 'U456',
71
- username: 'otheruser',
72
- thread_ts: undefined,
73
- reply_count: 0,
74
- edited: undefined,
75
- },
76
- ]
77
- }
78
- async listUsers(): Promise<SlackUser[]> {
79
- return [
80
- {
81
- id: 'U123',
82
- name: 'alice',
83
- real_name: 'Alice Smith',
84
- is_admin: true,
85
- is_owner: false,
86
- is_bot: false,
87
- is_app_user: false,
88
- profile: {
89
- email: 'alice@example.com',
90
- title: 'Engineer',
91
- },
92
- },
93
- {
94
- id: 'U456',
95
- name: 'bob',
96
- real_name: 'Bob Jones',
97
- is_admin: false,
98
- is_owner: false,
99
- is_bot: false,
100
- is_app_user: false,
101
- profile: {
102
- email: 'bob@example.com',
103
- title: 'Designer',
104
- },
105
- },
106
- ]
107
- }
108
- },
109
- }))
110
-
7
+ // Test the command structure (no mocks needed)
111
8
  test('snapshot command exports correctly', () => {
112
9
  expect(snapshotCommand).toBeDefined()
113
10
  expect(typeof snapshotCommand).toBe('object')
@@ -136,6 +33,121 @@ test('snapshot command has --limit option', () => {
136
33
  expect(hasLimit).toBe(true)
137
34
  })
138
35
 
36
+ // Test snapshot logic using spyOn (no global mock pollution)
37
+ let credManagerSpy: ReturnType<typeof spyOn>
38
+ let clientTestAuthSpy: ReturnType<typeof spyOn>
39
+ let clientListChannelsSpy: ReturnType<typeof spyOn>
40
+ let clientListUsersSpy: ReturnType<typeof spyOn>
41
+ let clientGetMessagesSpy: ReturnType<typeof spyOn>
42
+
43
+ const mockChannels: SlackChannel[] = [
44
+ {
45
+ id: 'C123',
46
+ name: 'general',
47
+ is_private: false,
48
+ is_archived: false,
49
+ created: 1234567890,
50
+ creator: 'U123',
51
+ topic: { value: 'General discussion', creator: 'U123', last_set: 1234567890 },
52
+ purpose: { value: 'General channel', creator: 'U123', last_set: 1234567890 },
53
+ },
54
+ {
55
+ id: 'C456',
56
+ name: 'random',
57
+ is_private: false,
58
+ is_archived: false,
59
+ created: 1234567891,
60
+ creator: 'U123',
61
+ topic: { value: 'Random stuff', creator: 'U123', last_set: 1234567891 },
62
+ purpose: { value: 'Random channel', creator: 'U123', last_set: 1234567891 },
63
+ },
64
+ ]
65
+
66
+ const mockMessages: SlackMessage[] = [
67
+ {
68
+ ts: '1234567890.000100',
69
+ text: 'Hello world',
70
+ type: 'message',
71
+ user: 'U123',
72
+ username: 'testuser',
73
+ thread_ts: undefined,
74
+ reply_count: 0,
75
+ edited: undefined,
76
+ },
77
+ {
78
+ ts: '1234567890.000200',
79
+ text: 'Second message',
80
+ type: 'message',
81
+ user: 'U456',
82
+ username: 'otheruser',
83
+ thread_ts: undefined,
84
+ reply_count: 0,
85
+ edited: undefined,
86
+ },
87
+ ]
88
+
89
+ const mockUsers: SlackUser[] = [
90
+ {
91
+ id: 'U123',
92
+ name: 'alice',
93
+ real_name: 'Alice Smith',
94
+ is_admin: true,
95
+ is_owner: false,
96
+ is_bot: false,
97
+ is_app_user: false,
98
+ profile: {
99
+ email: 'alice@example.com',
100
+ title: 'Engineer',
101
+ },
102
+ },
103
+ {
104
+ id: 'U456',
105
+ name: 'bob',
106
+ real_name: 'Bob Jones',
107
+ is_admin: false,
108
+ is_owner: false,
109
+ is_bot: false,
110
+ is_app_user: false,
111
+ profile: {
112
+ email: 'bob@example.com',
113
+ title: 'Designer',
114
+ },
115
+ },
116
+ ]
117
+
118
+ beforeEach(() => {
119
+ // Spy on CredentialManager.prototype.getWorkspace
120
+ credManagerSpy = spyOn(CredentialManager.prototype, 'getWorkspace').mockResolvedValue({
121
+ workspace_id: 'T123',
122
+ workspace_name: 'Test Workspace',
123
+ token: 'xoxc-test',
124
+ cookie: 'test-cookie',
125
+ })
126
+
127
+ // Spy on SlackClient.prototype methods
128
+ clientTestAuthSpy = spyOn(SlackClient.prototype, 'testAuth').mockResolvedValue({
129
+ user_id: 'U123',
130
+ team_id: 'T123',
131
+ user: 'testuser',
132
+ team: 'Test Workspace',
133
+ })
134
+
135
+ clientListChannelsSpy = spyOn(SlackClient.prototype, 'listChannels').mockResolvedValue(
136
+ mockChannels
137
+ )
138
+ clientListUsersSpy = spyOn(SlackClient.prototype, 'listUsers').mockResolvedValue(mockUsers)
139
+ clientGetMessagesSpy = spyOn(SlackClient.prototype, 'getMessages').mockResolvedValue(mockMessages)
140
+ })
141
+
142
+ afterEach(() => {
143
+ // Restore all spies
144
+ credManagerSpy?.mockRestore()
145
+ clientTestAuthSpy?.mockRestore()
146
+ clientListChannelsSpy?.mockRestore()
147
+ clientListUsersSpy?.mockRestore()
148
+ clientGetMessagesSpy?.mockRestore()
149
+ })
150
+
139
151
  test('full snapshot returns workspace, channels, messages, and users', async () => {
140
152
  const credManager = new CredentialManager()
141
153
  const client = new SlackClient('xoxc-test', 'test-cookie')
@@ -0,0 +1,139 @@
1
+ import { afterEach, beforeEach, describe, expect, it, mock, spyOn } from 'bun:test'
2
+ import { SlackClient } from '../client'
3
+ import { CredentialManager } from '../credential-manager'
4
+ import { countsAction, markAction, threadsAction } from './unread'
5
+
6
+ let credManagerGetWorkspaceSpy: ReturnType<typeof spyOn>
7
+ let clientGetUnreadCountsSpy: ReturnType<typeof spyOn>
8
+ let clientGetThreadViewSpy: ReturnType<typeof spyOn>
9
+ let clientMarkReadSpy: ReturnType<typeof spyOn>
10
+
11
+ beforeEach(() => {
12
+ credManagerGetWorkspaceSpy = spyOn(CredentialManager.prototype, 'getWorkspace').mockResolvedValue(
13
+ {
14
+ workspace_id: 'T123',
15
+ workspace_name: 'Test Workspace',
16
+ token: 'xoxc-test',
17
+ cookie: 'test-cookie',
18
+ }
19
+ )
20
+
21
+ clientGetUnreadCountsSpy = spyOn(SlackClient.prototype, 'getUnreadCounts').mockResolvedValue({
22
+ channels: [{ id: 'C123', name: 'general', unread_count: 5, mention_count: 2 }],
23
+ total_unread: 5,
24
+ total_mentions: 2,
25
+ })
26
+
27
+ clientGetThreadViewSpy = spyOn(SlackClient.prototype, 'getThreadView').mockResolvedValue({
28
+ channel_id: 'C123',
29
+ thread_ts: '1234567890.123456',
30
+ unread_count: 3,
31
+ last_read: '1234567890.123450',
32
+ subscribed: true,
33
+ })
34
+
35
+ clientMarkReadSpy = spyOn(SlackClient.prototype, 'markRead').mockResolvedValue(undefined)
36
+ })
37
+
38
+ afterEach(() => {
39
+ credManagerGetWorkspaceSpy?.mockRestore()
40
+ clientGetUnreadCountsSpy?.mockRestore()
41
+ clientGetThreadViewSpy?.mockRestore()
42
+ clientMarkReadSpy?.mockRestore()
43
+ })
44
+
45
+ describe('unread commands', () => {
46
+ describe('getUnreadCounts', () => {
47
+ it('should return unread counts', async () => {
48
+ const mockCounts = {
49
+ channels: [
50
+ { id: 'C123', name: 'general', unread_count: 5, mention_count: 2 },
51
+ { id: 'C456', name: 'random', unread_count: 3, mention_count: 0 },
52
+ ],
53
+ total_unread: 8,
54
+ total_mentions: 2,
55
+ }
56
+
57
+ clientGetUnreadCountsSpy.mockResolvedValue(mockCounts)
58
+
59
+ const mockClient = new SlackClient('xoxc-test', 'test-cookie')
60
+ const result = await mockClient.getUnreadCounts()
61
+
62
+ expect(result).toEqual(mockCounts)
63
+ expect(result.total_unread).toBe(8)
64
+ expect(result.total_mentions).toBe(2)
65
+ expect(result.channels).toHaveLength(2)
66
+ })
67
+ })
68
+
69
+ describe('getThreadView', () => {
70
+ it('should return thread subscription details', async () => {
71
+ const mockThreadView = {
72
+ channel_id: 'C123',
73
+ thread_ts: '1234567890.123456',
74
+ unread_count: 3,
75
+ last_read: '1234567890.123450',
76
+ subscribed: true,
77
+ }
78
+
79
+ clientGetThreadViewSpy.mockResolvedValue(mockThreadView)
80
+
81
+ const mockClient = new SlackClient('xoxc-test', 'test-cookie')
82
+ const result = await mockClient.getThreadView('C123', '1234567890.123456')
83
+
84
+ expect(result).toEqual(mockThreadView)
85
+ expect(result.unread_count).toBe(3)
86
+ expect(result.subscribed).toBe(true)
87
+ })
88
+ })
89
+
90
+ describe('markRead', () => {
91
+ it('should mark channel as read', async () => {
92
+ const mockClient = new SlackClient('xoxc-test', 'test-cookie')
93
+ await mockClient.markRead('C123', '1234567890.123456')
94
+
95
+ expect(clientMarkReadSpy).toHaveBeenCalledWith('C123', '1234567890.123456')
96
+ })
97
+ })
98
+
99
+ describe('CLI commands', () => {
100
+ it('should handle unread counts command', async () => {
101
+ const mockConsoleLog = mock(() => {})
102
+ const originalLog = console.log
103
+ console.log = mockConsoleLog
104
+
105
+ await countsAction({ pretty: false })
106
+
107
+ expect(clientGetUnreadCountsSpy).toHaveBeenCalled()
108
+ expect(mockConsoleLog).toHaveBeenCalled()
109
+
110
+ console.log = originalLog
111
+ })
112
+
113
+ it('should handle unread threads command', async () => {
114
+ const mockConsoleLog = mock(() => {})
115
+ const originalLog = console.log
116
+ console.log = mockConsoleLog
117
+
118
+ await threadsAction('C123', '1234567890.123456', { pretty: false })
119
+
120
+ expect(clientGetThreadViewSpy).toHaveBeenCalledWith('C123', '1234567890.123456')
121
+ expect(mockConsoleLog).toHaveBeenCalled()
122
+
123
+ console.log = originalLog
124
+ })
125
+
126
+ it('should handle mark read command', async () => {
127
+ const mockConsoleLog = mock(() => {})
128
+ const originalLog = console.log
129
+ console.log = mockConsoleLog
130
+
131
+ await markAction('C123', '1234567890.123456', { pretty: false })
132
+
133
+ expect(clientMarkReadSpy).toHaveBeenCalledWith('C123', '1234567890.123456')
134
+ expect(mockConsoleLog).toHaveBeenCalled()
135
+
136
+ console.log = originalLog
137
+ })
138
+ })
139
+ })
@@ -0,0 +1,129 @@
1
+ import { Command } from 'commander'
2
+ import { handleError } from '../../../shared/utils/error-handler'
3
+ import { formatOutput } from '../../../shared/utils/output'
4
+ import { SlackClient } from '../client'
5
+ import { CredentialManager } from '../credential-manager'
6
+
7
+ export async function countsAction(options: { pretty?: boolean }): Promise<void> {
8
+ try {
9
+ const credManager = new CredentialManager()
10
+ const workspace = await credManager.getWorkspace()
11
+
12
+ if (!workspace) {
13
+ console.log(
14
+ formatOutput(
15
+ { error: 'No current workspace set. Run "auth extract" first.' },
16
+ options.pretty
17
+ )
18
+ )
19
+ process.exit(1)
20
+ }
21
+
22
+ const client = new SlackClient(workspace.token, workspace.cookie)
23
+ const counts = await client.getUnreadCounts()
24
+
25
+ const output = {
26
+ total_unread: counts.total_unread,
27
+ total_mentions: counts.total_mentions,
28
+ channels: counts.channels.map((ch) => ({
29
+ id: ch.id,
30
+ name: ch.name,
31
+ unread_count: ch.unread_count,
32
+ mention_count: ch.mention_count,
33
+ })),
34
+ }
35
+
36
+ console.log(formatOutput(output, options.pretty))
37
+ } catch (error) {
38
+ handleError(error as Error)
39
+ }
40
+ }
41
+
42
+ export async function threadsAction(
43
+ channel: string,
44
+ threadTs: string,
45
+ options: { pretty?: boolean }
46
+ ): Promise<void> {
47
+ try {
48
+ const credManager = new CredentialManager()
49
+ const workspace = await credManager.getWorkspace()
50
+
51
+ if (!workspace) {
52
+ console.log(
53
+ formatOutput(
54
+ { error: 'No current workspace set. Run "auth extract" first.' },
55
+ options.pretty
56
+ )
57
+ )
58
+ process.exit(1)
59
+ }
60
+
61
+ const client = new SlackClient(workspace.token, workspace.cookie)
62
+ const threadView = await client.getThreadView(channel, threadTs)
63
+
64
+ const output = {
65
+ channel_id: threadView.channel_id,
66
+ thread_ts: threadView.thread_ts,
67
+ unread_count: threadView.unread_count,
68
+ last_read: threadView.last_read,
69
+ subscribed: threadView.subscribed,
70
+ }
71
+
72
+ console.log(formatOutput(output, options.pretty))
73
+ } catch (error) {
74
+ handleError(error as Error)
75
+ }
76
+ }
77
+
78
+ export async function markAction(
79
+ channel: string,
80
+ ts: string,
81
+ options: { pretty?: boolean }
82
+ ): Promise<void> {
83
+ try {
84
+ const credManager = new CredentialManager()
85
+ const workspace = await credManager.getWorkspace()
86
+
87
+ if (!workspace) {
88
+ console.log(
89
+ formatOutput(
90
+ { error: 'No current workspace set. Run "auth extract" first.' },
91
+ options.pretty
92
+ )
93
+ )
94
+ process.exit(1)
95
+ }
96
+
97
+ const client = new SlackClient(workspace.token, workspace.cookie)
98
+ await client.markRead(channel, ts)
99
+
100
+ console.log(formatOutput({ marked_read: true, channel, ts }, options.pretty))
101
+ } catch (error) {
102
+ handleError(error as Error)
103
+ }
104
+ }
105
+
106
+ export const unreadCommand = new Command('unread')
107
+ .description('Unread message commands')
108
+ .addCommand(
109
+ new Command('counts')
110
+ .description('Get unread counts for all channels')
111
+ .option('--pretty', 'Pretty print JSON output')
112
+ .action(countsAction)
113
+ )
114
+ .addCommand(
115
+ new Command('threads')
116
+ .description('Get thread subscription details')
117
+ .argument('<channel>', 'Channel ID or name')
118
+ .argument('<thread_ts>', 'Thread timestamp')
119
+ .option('--pretty', 'Pretty print JSON output')
120
+ .action(threadsAction)
121
+ )
122
+ .addCommand(
123
+ new Command('mark')
124
+ .description('Mark channel as read up to timestamp')
125
+ .argument('<channel>', 'Channel ID or name')
126
+ .argument('<ts>', 'Message timestamp to mark as read')
127
+ .option('--pretty', 'Pretty print JSON output')
128
+ .action(markAction)
129
+ )
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, test } from 'bun:test'
2
- import { SlackClient } from '../../src/platforms/slack/client'
3
- import { userCommand } from '../../src/platforms/slack/commands/user'
4
- import type { SlackUser } from '../../src/platforms/slack/types'
2
+ import { SlackClient } from '@/platforms/slack/client'
3
+ import { userCommand } from '@/platforms/slack/commands/user'
4
+ import type { SlackUser } from '@/platforms/slack/types'
5
5
 
6
6
  // Mock users
7
7
  const mockUsers: SlackUser[] = [