agent-messenger 1.0.0 → 1.1.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 (330) 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/README.md +16 -14
  6. package/biome.json +33 -1
  7. package/bun.lock +63 -0
  8. package/dist/package.json +8 -4
  9. package/dist/src/cli.d.ts.map +1 -1
  10. package/dist/src/cli.js +4 -1
  11. package/dist/src/cli.js.map +1 -1
  12. package/dist/src/platforms/discord/cli.js +1 -1
  13. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  14. package/dist/src/platforms/discord/client.js +3 -3
  15. package/dist/src/platforms/discord/client.js.map +1 -1
  16. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -1
  17. package/dist/src/platforms/discord/commands/user.js +10 -1
  18. package/dist/src/platforms/discord/commands/user.js.map +1 -1
  19. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -1
  20. package/dist/src/platforms/discord/credential-manager.js +18 -12
  21. package/dist/src/platforms/discord/credential-manager.js.map +1 -1
  22. package/dist/src/platforms/slack/cli.js +1 -1
  23. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -1
  24. package/dist/src/platforms/slack/credential-manager.js +20 -6
  25. package/dist/src/platforms/slack/credential-manager.js.map +1 -1
  26. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  27. package/dist/src/platforms/slack/token-extractor.js +34 -9
  28. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  29. package/dist/src/platforms/teams/cli.d.ts.map +1 -0
  30. package/dist/{cli.js → src/platforms/teams/cli.js} +11 -10
  31. package/dist/src/platforms/teams/cli.js.map +1 -0
  32. package/dist/src/platforms/teams/client.d.ts +32 -0
  33. package/dist/src/platforms/teams/client.d.ts.map +1 -0
  34. package/dist/src/platforms/teams/client.js +202 -0
  35. package/dist/src/platforms/teams/client.js.map +1 -0
  36. package/dist/src/platforms/teams/commands/auth.d.ts +14 -0
  37. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -0
  38. package/dist/src/platforms/teams/commands/auth.js +176 -0
  39. package/dist/src/platforms/teams/commands/auth.js.map +1 -0
  40. package/dist/src/platforms/teams/commands/channel.d.ts +13 -0
  41. package/dist/src/platforms/teams/commands/channel.d.ts.map +1 -0
  42. package/dist/src/platforms/teams/commands/channel.js +97 -0
  43. package/dist/src/platforms/teams/commands/channel.js.map +1 -0
  44. package/dist/src/platforms/teams/commands/file.d.ts +12 -0
  45. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -0
  46. package/dist/src/platforms/teams/commands/file.js +104 -0
  47. package/dist/src/platforms/teams/commands/file.js.map +1 -0
  48. package/dist/{commands → src/platforms/teams/commands}/index.d.ts +5 -2
  49. package/dist/src/platforms/teams/commands/index.d.ts.map +1 -0
  50. package/dist/{commands → src/platforms/teams/commands}/index.js +5 -2
  51. package/dist/src/platforms/teams/commands/index.js.map +1 -0
  52. package/dist/src/platforms/teams/commands/message.d.ts +17 -0
  53. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -0
  54. package/dist/src/platforms/teams/commands/message.js +133 -0
  55. package/dist/src/platforms/teams/commands/message.js.map +1 -0
  56. package/dist/src/platforms/teams/commands/reaction.d.ts +9 -0
  57. package/dist/src/platforms/teams/commands/reaction.d.ts.map +1 -0
  58. package/dist/src/platforms/teams/commands/reaction.js +68 -0
  59. package/dist/src/platforms/teams/commands/reaction.js.map +1 -0
  60. package/dist/src/platforms/teams/commands/snapshot.d.ts +10 -0
  61. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -0
  62. package/dist/src/platforms/teams/commands/snapshot.js +85 -0
  63. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -0
  64. package/dist/src/platforms/teams/commands/team.d.ts +18 -0
  65. package/dist/src/platforms/teams/commands/team.d.ts.map +1 -0
  66. package/dist/src/platforms/teams/commands/team.js +130 -0
  67. package/dist/src/platforms/teams/commands/team.js.map +1 -0
  68. package/dist/src/platforms/teams/commands/user.d.ts.map +1 -0
  69. package/dist/src/platforms/teams/commands/user.js +88 -0
  70. package/dist/src/platforms/teams/commands/user.js.map +1 -0
  71. package/dist/src/platforms/teams/credential-manager.d.ts +18 -0
  72. package/dist/src/platforms/teams/credential-manager.d.ts.map +1 -0
  73. package/dist/src/platforms/teams/credential-manager.js +81 -0
  74. package/dist/src/platforms/teams/credential-manager.js.map +1 -0
  75. package/dist/src/platforms/teams/index.d.ts +4 -0
  76. package/dist/src/platforms/teams/index.d.ts.map +1 -0
  77. package/dist/src/platforms/teams/index.js +6 -0
  78. package/dist/src/platforms/teams/index.js.map +1 -0
  79. package/dist/src/platforms/teams/token-extractor.d.ts +36 -0
  80. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -0
  81. package/dist/src/platforms/teams/token-extractor.js +335 -0
  82. package/dist/src/platforms/teams/token-extractor.js.map +1 -0
  83. package/dist/src/platforms/teams/types.d.ts +209 -0
  84. package/dist/src/platforms/teams/types.d.ts.map +1 -0
  85. package/dist/src/platforms/teams/types.js +65 -0
  86. package/dist/src/platforms/teams/types.js.map +1 -0
  87. package/docs/teams.md +321 -0
  88. package/e2e/README.md +256 -0
  89. package/e2e/config.ts +45 -0
  90. package/e2e/discord.e2e.test.ts +252 -0
  91. package/e2e/helpers.ts +107 -0
  92. package/e2e/slack.e2e.test.ts +309 -0
  93. package/package.json +8 -4
  94. package/scripts/postbuild.ts +15 -0
  95. package/skills/agent-teams/SKILL.md +292 -0
  96. package/skills/agent-teams/references/authentication.md +375 -0
  97. package/skills/agent-teams/references/common-patterns.md +596 -0
  98. package/skills/agent-teams/templates/monitor-channel.sh +239 -0
  99. package/skills/agent-teams/templates/post-message.sh +224 -0
  100. package/skills/agent-teams/templates/team-summary.sh +210 -0
  101. package/src/cli.ts +4 -0
  102. package/src/platforms/discord/client.ts +3 -3
  103. package/src/platforms/discord/commands/auth.test.ts +48 -32
  104. package/src/platforms/discord/commands/channel.test.ts +54 -42
  105. package/src/platforms/discord/commands/file.test.ts +40 -53
  106. package/src/platforms/discord/commands/guild.test.ts +47 -27
  107. package/src/platforms/discord/commands/message.test.ts +54 -51
  108. package/src/platforms/discord/commands/reaction.test.ts +54 -42
  109. package/src/platforms/discord/commands/user.ts +12 -1
  110. package/src/platforms/discord/credential-manager.test.ts +137 -136
  111. package/src/platforms/discord/credential-manager.ts +20 -13
  112. package/src/platforms/discord/token-extractor.test.ts +133 -383
  113. package/{tests → src/platforms/slack}/cli.test.ts +3 -3
  114. package/{tests/slack-client.test.ts → src/platforms/slack/client.test.ts} +1 -1
  115. package/{tests → src/platforms/slack}/commands/auth.test.ts +25 -13
  116. package/{tests → src/platforms/slack}/commands/channel.test.ts +2 -2
  117. package/{tests → src/platforms/slack}/commands/file.test.ts +2 -2
  118. package/{tests → src/platforms/slack}/commands/message.test.ts +2 -2
  119. package/{tests → src/platforms/slack}/commands/reaction.test.ts +1 -1
  120. package/{tests → src/platforms/slack}/commands/snapshot.test.ts +117 -105
  121. package/{tests → src/platforms/slack}/commands/user.test.ts +3 -3
  122. package/{tests → src/platforms/slack}/commands/workspace.test.ts +44 -95
  123. package/{tests → src/platforms/slack}/credential-manager.test.ts +2 -2
  124. package/src/platforms/slack/credential-manager.ts +22 -7
  125. package/src/platforms/slack/token-extractor-node-test.ts +40 -0
  126. package/src/platforms/slack/token-extractor-node.test.ts +10 -0
  127. package/src/platforms/slack/token-extractor.ts +36 -10
  128. package/{tests → src/platforms/slack}/types.test.ts +1 -1
  129. package/src/platforms/teams/cli.ts +36 -0
  130. package/src/platforms/teams/client.test.ts +500 -0
  131. package/src/platforms/teams/client.ts +365 -0
  132. package/src/platforms/teams/commands/auth.test.ts +99 -0
  133. package/src/platforms/teams/commands/auth.ts +232 -0
  134. package/src/platforms/teams/commands/channel.test.ts +147 -0
  135. package/src/platforms/teams/commands/channel.ts +129 -0
  136. package/src/platforms/teams/commands/file.test.ts +88 -0
  137. package/src/platforms/teams/commands/file.ts +144 -0
  138. package/src/platforms/teams/commands/index.ts +12 -0
  139. package/src/platforms/teams/commands/message.test.ts +110 -0
  140. package/src/platforms/teams/commands/message.ts +188 -0
  141. package/src/platforms/teams/commands/reaction.test.ts +87 -0
  142. package/src/platforms/teams/commands/reaction.ts +104 -0
  143. package/src/platforms/teams/commands/snapshot.test.ts +35 -0
  144. package/src/platforms/teams/commands/snapshot.ts +115 -0
  145. package/src/platforms/teams/commands/team.test.ts +157 -0
  146. package/src/platforms/teams/commands/team.ts +164 -0
  147. package/src/platforms/teams/commands/user.test.ts +83 -0
  148. package/src/platforms/teams/commands/user.ts +112 -0
  149. package/src/platforms/teams/credential-manager.test.ts +178 -0
  150. package/src/platforms/teams/credential-manager.ts +92 -0
  151. package/src/platforms/teams/index.ts +5 -0
  152. package/src/platforms/teams/token-extractor.test.ts +429 -0
  153. package/src/platforms/teams/token-extractor.ts +462 -0
  154. package/src/platforms/teams/types.test.ts +226 -0
  155. package/src/platforms/teams/types.ts +140 -0
  156. package/tsconfig.json +1 -1
  157. package/dist/cli.d.ts.map +0 -1
  158. package/dist/cli.js.map +0 -1
  159. package/dist/commands/auth.d.ts +0 -3
  160. package/dist/commands/auth.d.ts.map +0 -1
  161. package/dist/commands/auth.js +0 -140
  162. package/dist/commands/auth.js.map +0 -1
  163. package/dist/commands/channel.d.ts +0 -3
  164. package/dist/commands/channel.d.ts.map +0 -1
  165. package/dist/commands/channel.js +0 -118
  166. package/dist/commands/channel.js.map +0 -1
  167. package/dist/commands/file.d.ts +0 -3
  168. package/dist/commands/file.d.ts.map +0 -1
  169. package/dist/commands/file.js +0 -113
  170. package/dist/commands/file.js.map +0 -1
  171. package/dist/commands/index.d.ts.map +0 -1
  172. package/dist/commands/index.js.map +0 -1
  173. package/dist/commands/message.d.ts +0 -3
  174. package/dist/commands/message.d.ts.map +0 -1
  175. package/dist/commands/message.js +0 -214
  176. package/dist/commands/message.js.map +0 -1
  177. package/dist/commands/reaction.d.ts +0 -3
  178. package/dist/commands/reaction.d.ts.map +0 -1
  179. package/dist/commands/reaction.js +0 -100
  180. package/dist/commands/reaction.js.map +0 -1
  181. package/dist/commands/snapshot.d.ts +0 -3
  182. package/dist/commands/snapshot.d.ts.map +0 -1
  183. package/dist/commands/snapshot.js +0 -88
  184. package/dist/commands/snapshot.js.map +0 -1
  185. package/dist/commands/user.d.ts.map +0 -1
  186. package/dist/commands/user.js +0 -96
  187. package/dist/commands/user.js.map +0 -1
  188. package/dist/commands/workspace.d.ts +0 -3
  189. package/dist/commands/workspace.d.ts.map +0 -1
  190. package/dist/commands/workspace.js +0 -89
  191. package/dist/commands/workspace.js.map +0 -1
  192. package/dist/lib/credential-manager.d.ts +0 -13
  193. package/dist/lib/credential-manager.d.ts.map +0 -1
  194. package/dist/lib/credential-manager.js +0 -58
  195. package/dist/lib/credential-manager.js.map +0 -1
  196. package/dist/lib/index.d.ts +0 -3
  197. package/dist/lib/index.d.ts.map +0 -1
  198. package/dist/lib/index.js +0 -3
  199. package/dist/lib/index.js.map +0 -1
  200. package/dist/lib/ref-manager.d.ts +0 -26
  201. package/dist/lib/ref-manager.d.ts.map +0 -1
  202. package/dist/lib/ref-manager.js +0 -92
  203. package/dist/lib/ref-manager.js.map +0 -1
  204. package/dist/lib/slack-client.d.ts +0 -37
  205. package/dist/lib/slack-client.d.ts.map +0 -1
  206. package/dist/lib/slack-client.js +0 -379
  207. package/dist/lib/slack-client.js.map +0 -1
  208. package/dist/lib/token-extractor.d.ts +0 -28
  209. package/dist/lib/token-extractor.d.ts.map +0 -1
  210. package/dist/lib/token-extractor.js +0 -401
  211. package/dist/lib/token-extractor.js.map +0 -1
  212. package/dist/src/platforms/discord/client.test.d.ts +0 -2
  213. package/dist/src/platforms/discord/client.test.d.ts.map +0 -1
  214. package/dist/src/platforms/discord/client.test.js +0 -367
  215. package/dist/src/platforms/discord/client.test.js.map +0 -1
  216. package/dist/src/platforms/discord/commands/auth.test.d.ts +0 -2
  217. package/dist/src/platforms/discord/commands/auth.test.d.ts.map +0 -1
  218. package/dist/src/platforms/discord/commands/auth.test.js +0 -65
  219. package/dist/src/platforms/discord/commands/auth.test.js.map +0 -1
  220. package/dist/src/platforms/discord/commands/channel.test.d.ts +0 -2
  221. package/dist/src/platforms/discord/commands/channel.test.d.ts.map +0 -1
  222. package/dist/src/platforms/discord/commands/channel.test.js +0 -136
  223. package/dist/src/platforms/discord/commands/channel.test.js.map +0 -1
  224. package/dist/src/platforms/discord/commands/file.test.d.ts +0 -2
  225. package/dist/src/platforms/discord/commands/file.test.d.ts.map +0 -1
  226. package/dist/src/platforms/discord/commands/file.test.js +0 -83
  227. package/dist/src/platforms/discord/commands/file.test.js.map +0 -1
  228. package/dist/src/platforms/discord/commands/guild.test.d.ts +0 -2
  229. package/dist/src/platforms/discord/commands/guild.test.d.ts.map +0 -1
  230. package/dist/src/platforms/discord/commands/guild.test.js +0 -100
  231. package/dist/src/platforms/discord/commands/guild.test.js.map +0 -1
  232. package/dist/src/platforms/discord/commands/message.test.d.ts +0 -2
  233. package/dist/src/platforms/discord/commands/message.test.d.ts.map +0 -1
  234. package/dist/src/platforms/discord/commands/message.test.js +0 -91
  235. package/dist/src/platforms/discord/commands/message.test.js.map +0 -1
  236. package/dist/src/platforms/discord/commands/reaction.test.d.ts +0 -2
  237. package/dist/src/platforms/discord/commands/reaction.test.d.ts.map +0 -1
  238. package/dist/src/platforms/discord/commands/reaction.test.js +0 -115
  239. package/dist/src/platforms/discord/commands/reaction.test.js.map +0 -1
  240. package/dist/src/platforms/discord/commands/snapshot.test.d.ts +0 -2
  241. package/dist/src/platforms/discord/commands/snapshot.test.d.ts.map +0 -1
  242. package/dist/src/platforms/discord/commands/snapshot.test.js +0 -25
  243. package/dist/src/platforms/discord/commands/snapshot.test.js.map +0 -1
  244. package/dist/src/platforms/discord/commands/user.test.d.ts +0 -2
  245. package/dist/src/platforms/discord/commands/user.test.d.ts.map +0 -1
  246. package/dist/src/platforms/discord/commands/user.test.js +0 -103
  247. package/dist/src/platforms/discord/commands/user.test.js.map +0 -1
  248. package/dist/src/platforms/discord/credential-manager.test.d.ts +0 -2
  249. package/dist/src/platforms/discord/credential-manager.test.d.ts.map +0 -1
  250. package/dist/src/platforms/discord/credential-manager.test.js +0 -136
  251. package/dist/src/platforms/discord/credential-manager.test.js.map +0 -1
  252. package/dist/src/platforms/discord/token-extractor.test.d.ts +0 -2
  253. package/dist/src/platforms/discord/token-extractor.test.d.ts.map +0 -1
  254. package/dist/src/platforms/discord/token-extractor.test.js +0 -789
  255. package/dist/src/platforms/discord/token-extractor.test.js.map +0 -1
  256. package/dist/src/platforms/discord/types.test.d.ts +0 -2
  257. package/dist/src/platforms/discord/types.test.d.ts.map +0 -1
  258. package/dist/src/platforms/discord/types.test.js +0 -211
  259. package/dist/src/platforms/discord/types.test.js.map +0 -1
  260. package/dist/src/shared/utils/concurrency.test.d.ts +0 -2
  261. package/dist/src/shared/utils/concurrency.test.d.ts.map +0 -1
  262. package/dist/src/shared/utils/concurrency.test.js +0 -39
  263. package/dist/src/shared/utils/concurrency.test.js.map +0 -1
  264. package/dist/tests/cli.test.d.ts +0 -2
  265. package/dist/tests/cli.test.d.ts.map +0 -1
  266. package/dist/tests/cli.test.js +0 -83
  267. package/dist/tests/cli.test.js.map +0 -1
  268. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/CURRENT +0 -1
  269. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOCK +0 -0
  270. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG +0 -3
  271. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG.old +0 -1
  272. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/MANIFEST-000004 +0 -0
  273. package/dist/tests/commands/auth.test.d.ts +0 -2
  274. package/dist/tests/commands/auth.test.d.ts.map +0 -1
  275. package/dist/tests/commands/auth.test.js +0 -304
  276. package/dist/tests/commands/auth.test.js.map +0 -1
  277. package/dist/tests/commands/channel.test.d.ts +0 -2
  278. package/dist/tests/commands/channel.test.d.ts.map +0 -1
  279. package/dist/tests/commands/channel.test.js +0 -166
  280. package/dist/tests/commands/channel.test.js.map +0 -1
  281. package/dist/tests/commands/file.test.d.ts +0 -2
  282. package/dist/tests/commands/file.test.d.ts.map +0 -1
  283. package/dist/tests/commands/file.test.js +0 -175
  284. package/dist/tests/commands/file.test.js.map +0 -1
  285. package/dist/tests/commands/message.test.d.ts +0 -2
  286. package/dist/tests/commands/message.test.d.ts.map +0 -1
  287. package/dist/tests/commands/message.test.js +0 -293
  288. package/dist/tests/commands/message.test.js.map +0 -1
  289. package/dist/tests/commands/reaction.test.d.ts +0 -2
  290. package/dist/tests/commands/reaction.test.d.ts.map +0 -1
  291. package/dist/tests/commands/reaction.test.js +0 -84
  292. package/dist/tests/commands/reaction.test.js.map +0 -1
  293. package/dist/tests/commands/snapshot.test.d.ts +0 -2
  294. package/dist/tests/commands/snapshot.test.d.ts.map +0 -1
  295. package/dist/tests/commands/snapshot.test.js +0 -280
  296. package/dist/tests/commands/snapshot.test.js.map +0 -1
  297. package/dist/tests/commands/user.test.d.ts +0 -2
  298. package/dist/tests/commands/user.test.d.ts.map +0 -1
  299. package/dist/tests/commands/user.test.js +0 -117
  300. package/dist/tests/commands/user.test.js.map +0 -1
  301. package/dist/tests/commands/workspace.test.d.ts +0 -2
  302. package/dist/tests/commands/workspace.test.d.ts.map +0 -1
  303. package/dist/tests/commands/workspace.test.js +0 -453
  304. package/dist/tests/commands/workspace.test.js.map +0 -1
  305. package/dist/tests/credential-manager.test.d.ts +0 -2
  306. package/dist/tests/credential-manager.test.d.ts.map +0 -1
  307. package/dist/tests/credential-manager.test.js +0 -199
  308. package/dist/tests/credential-manager.test.js.map +0 -1
  309. package/dist/tests/slack-client.test.d.ts +0 -2
  310. package/dist/tests/slack-client.test.d.ts.map +0 -1
  311. package/dist/tests/slack-client.test.js +0 -741
  312. package/dist/tests/slack-client.test.js.map +0 -1
  313. package/dist/tests/types.test.d.ts +0 -2
  314. package/dist/tests/types.test.d.ts.map +0 -1
  315. package/dist/tests/types.test.js +0 -215
  316. package/dist/tests/types.test.js.map +0 -1
  317. package/dist/types/index.d.ts +0 -369
  318. package/dist/types/index.d.ts.map +0 -1
  319. package/dist/types/index.js +0 -92
  320. package/dist/types/index.js.map +0 -1
  321. package/dist/utils/error-handler.d.ts +0 -2
  322. package/dist/utils/error-handler.d.ts.map +0 -1
  323. package/dist/utils/error-handler.js +0 -5
  324. package/dist/utils/error-handler.js.map +0 -1
  325. package/dist/utils/output.d.ts +0 -2
  326. package/dist/utils/output.d.ts.map +0 -1
  327. package/dist/utils/output.js +0 -4
  328. package/dist/utils/output.js.map +0 -1
  329. /package/dist/{cli.d.ts → src/platforms/teams/cli.d.ts} +0 -0
  330. /package/dist/{commands → src/platforms/teams/commands}/user.d.ts +0 -0
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, test } from 'bun:test'
2
2
  import { spawn } from 'bun'
3
- import pkg from '../package.json'
4
- import { handleError } from '../src/shared/utils/error-handler'
5
- import { formatOutput } from '../src/shared/utils/output'
3
+ import { handleError } from '@/shared/utils/error-handler'
4
+ import { formatOutput } from '@/shared/utils/output'
5
+ import pkg from '../../../package.json'
6
6
 
7
7
  describe('CLI Framework', () => {
8
8
  describe('formatOutput utility', () => {
@@ -1,6 +1,6 @@
1
1
  import { beforeEach, describe, expect, mock, test } from 'bun:test'
2
2
  import type { WebClient } from '@slack/web-api'
3
- import { SlackClient, SlackError } from '../src/platforms/slack/client'
3
+ import { SlackClient, SlackError } from '@/platforms/slack/client'
4
4
 
5
5
  const mockWebClient: any = {
6
6
  conversations: {
@@ -2,8 +2,8 @@ import { afterAll, beforeEach, describe, expect, mock, test } from 'bun:test'
2
2
  import { mkdirSync, rmSync } from 'node:fs'
3
3
  import { homedir } from 'node:os'
4
4
  import { join } from 'node:path'
5
- import { CredentialManager } from '../../src/platforms/slack/credential-manager'
6
- import { type ExtractedWorkspace, TokenExtractor } from '../../src/platforms/slack/token-extractor'
5
+ import { CredentialManager } from '@/platforms/slack/credential-manager'
6
+ import { type ExtractedWorkspace, TokenExtractor } from '@/platforms/slack/token-extractor'
7
7
 
8
8
  const testConfigDir = join(import.meta.dir, '.test-auth-config')
9
9
  const testSlackDir = join(import.meta.dir, '.test-slack-data')
@@ -74,8 +74,9 @@ describe('TokenExtractor', () => {
74
74
 
75
75
  describe('extract', () => {
76
76
  test('throws error when Slack directory does not exist', async () => {
77
- // Given: Slack directory does not exist
78
- extractor = new TokenExtractor('darwin', '/nonexistent/path')
77
+ // Given: Slack directory does not exist (use unique path to avoid any collision)
78
+ const nonExistentPath = `/tmp/nonexistent-slack-${Date.now()}-${Math.random()}`
79
+ extractor = new TokenExtractor('darwin', nonExistentPath)
79
80
 
80
81
  // When/Then: extract should throw
81
82
  await expect(extractor.extract()).rejects.toThrow('Slack directory not found')
@@ -124,6 +125,7 @@ describe('Auth Commands Integration', () => {
124
125
 
125
126
  beforeEach(() => {
126
127
  rmSync(testConfigDir, { recursive: true, force: true })
128
+ mkdirSync(testConfigDir, { recursive: true })
127
129
  credManager = new CredentialManager(testConfigDir)
128
130
  })
129
131
 
@@ -350,23 +352,33 @@ describe('Output Formatting', () => {
350
352
  })
351
353
 
352
354
  describe('Error Handling', () => {
355
+ beforeEach(() => {
356
+ rmSync(testSlackDir, { recursive: true, force: true })
357
+ mkdirSync(testSlackDir, { recursive: true })
358
+ })
359
+
360
+ afterAll(() => {
361
+ rmSync(testSlackDir, { recursive: true, force: true })
362
+ })
363
+
353
364
  test('handles missing Slack installation gracefully', async () => {
354
- // Given: Slack is not installed
355
- const extractor = new TokenExtractor('darwin', '/nonexistent/slack')
365
+ // Given: Slack is not installed (use unique path)
366
+ const nonExistentPath = `/tmp/nonexistent-slack-${Date.now()}-${Math.random()}`
367
+ const extractor = new TokenExtractor('darwin', nonExistentPath)
356
368
 
357
369
  // When/Then: Should throw descriptive error
358
370
  await expect(extractor.extract()).rejects.toThrow('Slack directory not found')
359
371
  })
360
372
 
361
- test('handles corrupted LevelDB gracefully', async () => {
362
- // Given: Corrupted LevelDB
363
- // This would require creating a corrupted LevelDB file
364
- // We test that the extractor handles errors gracefully
373
+ test('handles empty Slack directory gracefully', async () => {
374
+ // Given: Slack directory exists but has no data
365
375
  const extractor = new TokenExtractor('darwin', testSlackDir)
366
376
 
367
- // When: Trying to extract from non-existent storage
368
- // Then: Should handle gracefully (return empty or throw)
369
- await expect(extractor.extract()).rejects.toThrow()
377
+ // When: Trying to extract from empty directory
378
+ const result = await extractor.extract()
379
+
380
+ // Then: Should return empty array
381
+ expect(result).toEqual([])
370
382
  })
371
383
 
372
384
  test('handles missing Cookies database gracefully', async () => {
@@ -1,6 +1,6 @@
1
1
  import { beforeEach, describe, expect, mock, test } from 'bun:test'
2
- import { SlackClient } from '../../src/platforms/slack/client'
3
- import type { SlackChannel } from '../../src/platforms/slack/types'
2
+ import { SlackClient } from '@/platforms/slack/client'
3
+ import type { SlackChannel } from '@/platforms/slack/types'
4
4
 
5
5
  describe('Channel Commands', () => {
6
6
  let mockClient: SlackClient
@@ -1,6 +1,6 @@
1
1
  import { beforeEach, describe, expect, mock, test } from 'bun:test'
2
- import { SlackClient } from '../../src/platforms/slack/client'
3
- import type { SlackFile } from '../../src/platforms/slack/types'
2
+ import { SlackClient } from '@/platforms/slack/client'
3
+ import type { SlackFile } from '@/platforms/slack/types'
4
4
 
5
5
  describe('File Commands', () => {
6
6
  let mockClient: SlackClient
@@ -1,6 +1,6 @@
1
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'
2
+ import { SlackClient } from '@/platforms/slack/client'
3
+ import type { SlackMessage } from '@/platforms/slack/types'
4
4
 
5
5
  describe('Message Commands', () => {
6
6
  let mockClient: SlackClient
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, mock, test } from 'bun:test'
2
2
  import { Command } from 'commander'
3
- import { reactionCommand } from '../../src/platforms/slack/commands/reaction'
3
+ import { reactionCommand } from '@/platforms/slack/commands/reaction'
4
4
 
5
5
  describe('reaction command', () => {
6
6
  describe('add subcommand', () => {
@@ -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')
@@ -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[] = [