@urugus/slack-cli 0.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 (116) hide show
  1. package/.claude/settings.local.json +53 -0
  2. package/.eslintrc.json +25 -0
  3. package/.github/dependabot.yml +18 -0
  4. package/.github/workflows/ci.yml +70 -0
  5. package/.github/workflows/pr-validation.yml +51 -0
  6. package/.prettierignore +11 -0
  7. package/.prettierrc +10 -0
  8. package/CLAUDE.md +16 -0
  9. package/README.md +161 -0
  10. package/dist/commands/channels.d.ts +3 -0
  11. package/dist/commands/channels.d.ts.map +1 -0
  12. package/dist/commands/channels.js +50 -0
  13. package/dist/commands/channels.js.map +1 -0
  14. package/dist/commands/config.d.ts +3 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +87 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/history.d.ts +3 -0
  19. package/dist/commands/history.d.ts.map +1 -0
  20. package/dist/commands/history.js +79 -0
  21. package/dist/commands/history.js.map +1 -0
  22. package/dist/commands/send.d.ts +3 -0
  23. package/dist/commands/send.d.ts.map +1 -0
  24. package/dist/commands/send.js +85 -0
  25. package/dist/commands/send.js.map +1 -0
  26. package/dist/commands/unread.d.ts +3 -0
  27. package/dist/commands/unread.d.ts.map +1 -0
  28. package/dist/commands/unread.js +104 -0
  29. package/dist/commands/unread.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/types/commands.d.ts +40 -0
  35. package/dist/types/commands.d.ts.map +1 -0
  36. package/dist/types/commands.js +3 -0
  37. package/dist/types/commands.js.map +1 -0
  38. package/dist/types/config.d.ts +18 -0
  39. package/dist/types/config.d.ts.map +1 -0
  40. package/dist/types/config.js +3 -0
  41. package/dist/types/config.js.map +1 -0
  42. package/dist/utils/channel-formatter.d.ts +16 -0
  43. package/dist/utils/channel-formatter.d.ts.map +1 -0
  44. package/dist/utils/channel-formatter.js +77 -0
  45. package/dist/utils/channel-formatter.js.map +1 -0
  46. package/dist/utils/client-factory.d.ts +6 -0
  47. package/dist/utils/client-factory.d.ts.map +1 -0
  48. package/dist/utils/client-factory.js +13 -0
  49. package/dist/utils/client-factory.js.map +1 -0
  50. package/dist/utils/command-wrapper.d.ts +6 -0
  51. package/dist/utils/command-wrapper.d.ts.map +1 -0
  52. package/dist/utils/command-wrapper.js +27 -0
  53. package/dist/utils/command-wrapper.js.map +1 -0
  54. package/dist/utils/config-helper.d.ts +8 -0
  55. package/dist/utils/config-helper.d.ts.map +1 -0
  56. package/dist/utils/config-helper.js +19 -0
  57. package/dist/utils/config-helper.js.map +1 -0
  58. package/dist/utils/config.d.ts +10 -0
  59. package/dist/utils/config.d.ts.map +1 -0
  60. package/dist/utils/config.js +94 -0
  61. package/dist/utils/config.js.map +1 -0
  62. package/dist/utils/constants.d.ts +32 -0
  63. package/dist/utils/constants.d.ts.map +1 -0
  64. package/dist/utils/constants.js +42 -0
  65. package/dist/utils/constants.js.map +1 -0
  66. package/dist/utils/date-utils.d.ts +3 -0
  67. package/dist/utils/date-utils.d.ts.map +1 -0
  68. package/dist/utils/date-utils.js +12 -0
  69. package/dist/utils/date-utils.js.map +1 -0
  70. package/dist/utils/error-utils.d.ts +2 -0
  71. package/dist/utils/error-utils.d.ts.map +1 -0
  72. package/dist/utils/error-utils.js +10 -0
  73. package/dist/utils/error-utils.js.map +1 -0
  74. package/dist/utils/errors.d.ts +17 -0
  75. package/dist/utils/errors.d.ts.map +1 -0
  76. package/dist/utils/errors.js +40 -0
  77. package/dist/utils/errors.js.map +1 -0
  78. package/dist/utils/profile-config.d.ts +21 -0
  79. package/dist/utils/profile-config.d.ts.map +1 -0
  80. package/dist/utils/profile-config.js +173 -0
  81. package/dist/utils/profile-config.js.map +1 -0
  82. package/dist/utils/slack-api-client.d.ts +74 -0
  83. package/dist/utils/slack-api-client.d.ts.map +1 -0
  84. package/dist/utils/slack-api-client.js +132 -0
  85. package/dist/utils/slack-api-client.js.map +1 -0
  86. package/package.json +56 -0
  87. package/src/commands/channels.ts +65 -0
  88. package/src/commands/config.ts +104 -0
  89. package/src/commands/history.ts +96 -0
  90. package/src/commands/send.ts +52 -0
  91. package/src/commands/unread.ts +118 -0
  92. package/src/index.ts +19 -0
  93. package/src/types/commands.ts +46 -0
  94. package/src/types/config.ts +20 -0
  95. package/src/utils/channel-formatter.ts +89 -0
  96. package/src/utils/client-factory.ts +10 -0
  97. package/src/utils/command-wrapper.ts +27 -0
  98. package/src/utils/config-helper.ts +21 -0
  99. package/src/utils/constants.ts +47 -0
  100. package/src/utils/date-utils.ts +8 -0
  101. package/src/utils/error-utils.ts +6 -0
  102. package/src/utils/errors.ts +37 -0
  103. package/src/utils/profile-config.ts +171 -0
  104. package/src/utils/slack-api-client.ts +218 -0
  105. package/tests/commands/channels.test.ts +250 -0
  106. package/tests/commands/config.test.ts +158 -0
  107. package/tests/commands/history.test.ts +250 -0
  108. package/tests/commands/send.test.ts +156 -0
  109. package/tests/commands/unread.test.ts +248 -0
  110. package/tests/test-utils.ts +28 -0
  111. package/tests/utils/config.test.ts +400 -0
  112. package/tests/utils/date-utils.test.ts +30 -0
  113. package/tests/utils/error-utils.test.ts +34 -0
  114. package/tests/utils/slack-api-client.test.ts +170 -0
  115. package/tsconfig.json +22 -0
  116. package/vitest.config.ts +27 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupHistoryCommand = setupHistoryCommand;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const command_wrapper_1 = require("../utils/command-wrapper");
10
+ const client_factory_1 = require("../utils/client-factory");
11
+ const date_utils_1 = require("../utils/date-utils");
12
+ const constants_1 = require("../utils/constants");
13
+ function setupHistoryCommand() {
14
+ const historyCommand = new commander_1.Command('history')
15
+ .description('Get message history from a Slack channel')
16
+ .requiredOption('-c, --channel <channel>', 'Target channel name or ID')
17
+ .option('-n, --number <number>', 'Number of messages to retrieve', constants_1.API_LIMITS.DEFAULT_MESSAGE_COUNT.toString())
18
+ .option('--since <date>', 'Get messages since specific date (YYYY-MM-DD HH:MM:SS)')
19
+ .option('--profile <profile>', 'Use specific workspace profile')
20
+ .hook('preAction', (thisCommand) => {
21
+ const options = thisCommand.opts();
22
+ // Validate number option
23
+ if (options.number) {
24
+ const num = parseInt(options.number, 10);
25
+ if (isNaN(num) ||
26
+ num < constants_1.API_LIMITS.MIN_MESSAGE_COUNT ||
27
+ num > constants_1.API_LIMITS.MAX_MESSAGE_COUNT) {
28
+ thisCommand.error(`Error: Message count must be between ${constants_1.API_LIMITS.MIN_MESSAGE_COUNT} and ${constants_1.API_LIMITS.MAX_MESSAGE_COUNT}`);
29
+ }
30
+ }
31
+ // Validate since option
32
+ if (options.since) {
33
+ const timestamp = Date.parse(options.since);
34
+ if (isNaN(timestamp)) {
35
+ thisCommand.error('Error: Invalid date format. Use YYYY-MM-DD HH:MM:SS');
36
+ }
37
+ }
38
+ })
39
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
40
+ // Create Slack client
41
+ const client = await (0, client_factory_1.createSlackClient)(options.profile);
42
+ // Prepare API options
43
+ const historyOptions = {
44
+ limit: parseInt(options.number || constants_1.API_LIMITS.DEFAULT_MESSAGE_COUNT.toString(), 10),
45
+ };
46
+ if (options.since) {
47
+ // Convert date to Unix timestamp (in seconds)
48
+ const timestamp = Math.floor(Date.parse(options.since) / 1000);
49
+ historyOptions.oldest = timestamp.toString();
50
+ }
51
+ // Get message history
52
+ const { messages, users } = await client.getHistory(options.channel, historyOptions);
53
+ // Display results
54
+ if (messages.length === 0) {
55
+ console.log(chalk_1.default.yellow('No messages found in the specified channel.'));
56
+ return;
57
+ }
58
+ console.log(chalk_1.default.bold(`\nMessage History for #${options.channel}:\n`));
59
+ // Display messages in reverse order (oldest first)
60
+ messages.reverse().forEach((message) => {
61
+ const timestamp = (0, date_utils_1.formatSlackTimestamp)(message.ts);
62
+ let author = 'Unknown';
63
+ if (message.user && users.has(message.user)) {
64
+ author = users.get(message.user);
65
+ }
66
+ else if (message.bot_id) {
67
+ author = 'Bot';
68
+ }
69
+ console.log(chalk_1.default.gray(`[${timestamp}]`) + ' ' + chalk_1.default.cyan(author));
70
+ if (message.text) {
71
+ console.log(message.text);
72
+ }
73
+ console.log(''); // Empty line between messages
74
+ });
75
+ console.log(chalk_1.default.green(`✓ Displayed ${messages.length} message(s)`));
76
+ }));
77
+ return historyCommand;
78
+ }
79
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function setupSendCommand(): Command;
3
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,gBAAgB,IAAI,OAAO,CAyC1C"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.setupSendCommand = setupSendCommand;
40
+ const commander_1 = require("commander");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const command_wrapper_1 = require("../utils/command-wrapper");
43
+ const constants_1 = require("../utils/constants");
44
+ const client_factory_1 = require("../utils/client-factory");
45
+ const errors_1 = require("../utils/errors");
46
+ const error_utils_1 = require("../utils/error-utils");
47
+ const fs = __importStar(require("fs/promises"));
48
+ function setupSendCommand() {
49
+ const sendCommand = new commander_1.Command('send')
50
+ .description('Send a message to a Slack channel')
51
+ .requiredOption('-c, --channel <channel>', 'Target channel name or ID')
52
+ .option('-m, --message <message>', 'Message to send')
53
+ .option('-f, --file <file>', 'File containing message content')
54
+ .option('--profile <profile>', 'Use specific workspace profile')
55
+ .hook('preAction', (thisCommand) => {
56
+ const options = thisCommand.opts();
57
+ if (!options.message && !options.file) {
58
+ thisCommand.error(`Error: ${constants_1.ERROR_MESSAGES.NO_MESSAGE_OR_FILE}`);
59
+ }
60
+ if (options.message && options.file) {
61
+ thisCommand.error(`Error: ${constants_1.ERROR_MESSAGES.BOTH_MESSAGE_AND_FILE}`);
62
+ }
63
+ })
64
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
65
+ // Get message content
66
+ let messageContent;
67
+ if (options.file) {
68
+ try {
69
+ messageContent = await fs.readFile(options.file, 'utf-8');
70
+ }
71
+ catch (error) {
72
+ throw new errors_1.FileError(constants_1.ERROR_MESSAGES.FILE_READ_ERROR(options.file, (0, error_utils_1.extractErrorMessage)(error)));
73
+ }
74
+ }
75
+ else {
76
+ messageContent = options.message; // This is safe because of preAction validation
77
+ }
78
+ // Send message
79
+ const client = await (0, client_factory_1.createSlackClient)(options.profile);
80
+ await client.sendMessage(options.channel, messageContent);
81
+ console.log(chalk_1.default.green(`✓ ${constants_1.SUCCESS_MESSAGES.MESSAGE_SENT(options.channel)}`));
82
+ }));
83
+ return sendCommand;
84
+ }
85
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,4CAyCC;AAnDD,yCAAoC;AACpC,kDAA0B;AAC1B,8DAAuD;AACvD,kDAAsE;AACtE,4DAA4D;AAC5D,4CAA4C;AAE5C,sDAA2D;AAC3D,gDAAkC;AAElC,SAAgB,gBAAgB;IAC9B,MAAM,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SACpC,WAAW,CAAC,mCAAmC,CAAC;SAChD,cAAc,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;SACtE,MAAM,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;SACpD,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;SAC/D,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,WAAW,CAAC,KAAK,CAAC,UAAU,0BAAc,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,WAAW,CAAC,KAAK,CAAC,UAAU,0BAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CACL,IAAA,6BAAW,EAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACzC,sBAAsB;QACtB,IAAI,cAAsB,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAS,CACjB,0BAAc,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAA,iCAAmB,EAAC,KAAK,CAAC,CAAC,CACzE,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,OAAO,CAAC,OAAQ,CAAC,CAAC,+CAA+C;QACpF,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAiB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,4BAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function setupUnreadCommand(): Command;
3
+ //# sourceMappingURL=unread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unread.d.ts","sourceRoot":"","sources":["../../src/commands/unread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgGpC,wBAAgB,kBAAkB,IAAI,OAAO,CAqB5C"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupUnreadCommand = setupUnreadCommand;
7
+ const commander_1 = require("commander");
8
+ const command_wrapper_1 = require("../utils/command-wrapper");
9
+ const client_factory_1 = require("../utils/client-factory");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const date_utils_1 = require("../utils/date-utils");
12
+ const channel_formatter_1 = require("../utils/channel-formatter");
13
+ async function handleSpecificChannelUnread(client, options) {
14
+ const result = await client.getChannelUnread(options.channel);
15
+ const channelName = (0, channel_formatter_1.formatChannelName)(result.channel.name);
16
+ console.log(chalk_1.default.bold(`${channelName}: ${result.channel.unread_count || 0} unread messages`));
17
+ if (!options.countOnly && result.messages.length > 0) {
18
+ console.log('');
19
+ result.messages.forEach((message) => {
20
+ const timestamp = (0, date_utils_1.formatSlackTimestamp)(message.ts);
21
+ const author = message.user ? result.users.get(message.user) || message.user : 'unknown';
22
+ console.log(`${chalk_1.default.gray(timestamp)} ${chalk_1.default.cyan(author)}`);
23
+ console.log(message.text || '(no text)');
24
+ console.log('');
25
+ });
26
+ }
27
+ }
28
+ async function handleAllChannelsUnread(client, options) {
29
+ const channels = await client.listUnreadChannels();
30
+ if (channels.length === 0) {
31
+ console.log(chalk_1.default.green('✓ No unread messages'));
32
+ return;
33
+ }
34
+ // Apply limit
35
+ const limit = parseInt(options.limit || '50', 10);
36
+ const displayChannels = channels.slice(0, limit);
37
+ if (options.countOnly) {
38
+ displayCountOnly(displayChannels);
39
+ }
40
+ else if (options.format === 'json') {
41
+ displayAsJson(displayChannels);
42
+ }
43
+ else if (options.format === 'simple') {
44
+ displayAsSimple(displayChannels);
45
+ }
46
+ else {
47
+ displayAsTable(displayChannels);
48
+ }
49
+ }
50
+ function displayCountOnly(channels) {
51
+ let totalUnread = 0;
52
+ channels.forEach((channel) => {
53
+ const count = channel.unread_count || 0;
54
+ totalUnread += count;
55
+ const channelName = (0, channel_formatter_1.formatChannelName)(channel.name);
56
+ console.log(`${channelName}: ${count}`);
57
+ });
58
+ console.log(chalk_1.default.bold(`Total: ${totalUnread} unread messages`));
59
+ }
60
+ function displayAsJson(channels) {
61
+ const output = channels.map((channel) => ({
62
+ channel: (0, channel_formatter_1.formatChannelName)(channel.name),
63
+ channelId: channel.id,
64
+ unreadCount: channel.unread_count || 0,
65
+ }));
66
+ console.log(JSON.stringify(output, null, 2));
67
+ }
68
+ function displayAsSimple(channels) {
69
+ channels.forEach((channel) => {
70
+ const channelName = (0, channel_formatter_1.formatChannelName)(channel.name);
71
+ console.log(`${channelName} (${channel.unread_count || 0})`);
72
+ });
73
+ }
74
+ function displayAsTable(channels) {
75
+ console.log(chalk_1.default.bold('Channel Unread Last Message'));
76
+ console.log('─'.repeat(50));
77
+ channels.forEach((channel) => {
78
+ const channelName = (0, channel_formatter_1.formatChannelName)(channel.name);
79
+ const paddedName = channelName.padEnd(16);
80
+ const count = (channel.unread_count || 0).toString().padEnd(6);
81
+ const lastRead = channel.last_read ? (0, date_utils_1.formatSlackTimestamp)(channel.last_read) : 'Unknown';
82
+ console.log(`${paddedName} ${count} ${lastRead}`);
83
+ });
84
+ }
85
+ function setupUnreadCommand() {
86
+ const unreadCommand = new commander_1.Command('unread')
87
+ .description('Show unread messages across channels')
88
+ .option('-c, --channel <channel>', 'Show unread for a specific channel')
89
+ .option('--format <format>', 'Output format: table, simple, json', 'table')
90
+ .option('--count-only', 'Show only unread counts', false)
91
+ .option('--limit <number>', 'Maximum number of channels to display', '50')
92
+ .option('--profile <profile>', 'Use specific workspace profile')
93
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
94
+ const client = await (0, client_factory_1.createSlackClient)(options.profile);
95
+ if (options.channel) {
96
+ await handleSpecificChannelUnread(client, options);
97
+ }
98
+ else {
99
+ await handleAllChannelsUnread(client, options);
100
+ }
101
+ }));
102
+ return unreadCommand;
103
+ }
104
+ //# sourceMappingURL=unread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unread.js","sourceRoot":"","sources":["../../src/commands/unread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const config_1 = require("./commands/config");
6
+ const send_1 = require("./commands/send");
7
+ const channels_1 = require("./commands/channels");
8
+ const history_1 = require("./commands/history");
9
+ const unread_1 = require("./commands/unread");
10
+ const program = new commander_1.Command();
11
+ program.name('slack-cli').description('CLI tool to send messages via Slack API').version('1.0.0');
12
+ program.addCommand((0, config_1.setupConfigCommand)());
13
+ program.addCommand((0, send_1.setupSendCommand)());
14
+ program.addCommand((0, channels_1.setupChannelsCommand)());
15
+ program.addCommand((0, history_1.setupHistoryCommand)());
16
+ program.addCommand((0, unread_1.setupUnreadCommand)());
17
+ program.parse();
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,8CAAuD;AACvD,0CAAmD;AACnD,kDAA2D;AAC3D,gDAAyD;AACzD,8CAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAElG,OAAO,CAAC,UAAU,CAAC,IAAA,2BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,uBAAgB,GAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAmB,GAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,IAAA,2BAAkB,GAAE,CAAC,CAAC;AAEzC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface ConfigSetOptions {
2
+ token: string;
3
+ profile?: string;
4
+ }
5
+ export interface ConfigGetOptions {
6
+ profile?: string;
7
+ }
8
+ export interface ConfigUseOptions {
9
+ profile: string;
10
+ }
11
+ export interface ConfigClearOptions {
12
+ profile?: string;
13
+ }
14
+ export interface SendOptions {
15
+ channel: string;
16
+ message?: string;
17
+ file?: string;
18
+ profile?: string;
19
+ }
20
+ export interface ChannelsOptions {
21
+ type: 'public' | 'private' | 'im' | 'mpim' | 'all';
22
+ includeArchived: boolean;
23
+ format: 'table' | 'simple' | 'json';
24
+ limit: string;
25
+ profile?: string;
26
+ }
27
+ export interface HistoryOptions {
28
+ channel: string;
29
+ number?: string;
30
+ since?: string;
31
+ profile?: string;
32
+ }
33
+ export interface UnreadOptions {
34
+ channel?: string;
35
+ format?: 'table' | 'simple' | 'json';
36
+ countOnly?: boolean;
37
+ limit?: string;
38
+ profile?: string;
39
+ }
40
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/types/commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/types/commands.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ export interface Config {
2
+ token: string;
3
+ updatedAt: string;
4
+ }
5
+ export interface Profile {
6
+ name: string;
7
+ config: Config;
8
+ isDefault?: boolean;
9
+ }
10
+ export interface ConfigStore {
11
+ profiles: Record<string, Config>;
12
+ defaultProfile?: string;
13
+ }
14
+ export interface ConfigOptions {
15
+ configDir?: string;
16
+ profile?: string;
17
+ }
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { Channel } from './slack-api-client';
2
+ export interface ChannelInfo {
3
+ id: string;
4
+ name: string;
5
+ type: string;
6
+ members: number;
7
+ created: string;
8
+ purpose: string;
9
+ }
10
+ export declare function mapChannelToInfo(channel: Channel): ChannelInfo;
11
+ export declare function formatChannelsAsTable(channels: ChannelInfo[]): void;
12
+ export declare function formatChannelsAsSimple(channels: ChannelInfo[]): void;
13
+ export declare function formatChannelsAsJson(channels: ChannelInfo[]): void;
14
+ export declare function formatChannelName(channelName?: string): string;
15
+ export declare function getChannelTypes(type: string): string;
16
+ //# sourceMappingURL=channel-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/channel-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAe9D;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAgBnE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAelE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAepD"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapChannelToInfo = mapChannelToInfo;
4
+ exports.formatChannelsAsTable = formatChannelsAsTable;
5
+ exports.formatChannelsAsSimple = formatChannelsAsSimple;
6
+ exports.formatChannelsAsJson = formatChannelsAsJson;
7
+ exports.formatChannelName = formatChannelName;
8
+ exports.getChannelTypes = getChannelTypes;
9
+ const date_utils_1 = require("./date-utils");
10
+ function mapChannelToInfo(channel) {
11
+ let type = 'unknown';
12
+ if (channel.is_channel && !channel.is_private)
13
+ type = 'public';
14
+ else if (channel.is_group || (channel.is_channel && channel.is_private))
15
+ type = 'private';
16
+ else if (channel.is_im)
17
+ type = 'im';
18
+ else if (channel.is_mpim)
19
+ type = 'mpim';
20
+ return {
21
+ id: channel.id,
22
+ name: channel.name || 'unnamed',
23
+ type,
24
+ members: channel.num_members || 0,
25
+ created: (0, date_utils_1.formatUnixTimestamp)(channel.created),
26
+ purpose: channel.purpose?.value || '',
27
+ };
28
+ }
29
+ function formatChannelsAsTable(channels) {
30
+ // Print table header
31
+ console.log('Name Type Members Created Description');
32
+ console.log('─'.repeat(65));
33
+ // Print channel rows
34
+ channels.forEach((channel) => {
35
+ const name = channel.name.padEnd(17);
36
+ const type = channel.type.padEnd(9);
37
+ const members = channel.members.toString().padEnd(8);
38
+ const created = channel.created.padEnd(12);
39
+ const purpose = channel.purpose.length > 30 ? channel.purpose.substring(0, 27) + '...' : channel.purpose;
40
+ console.log(`${name} ${type} ${members} ${created} ${purpose}`);
41
+ });
42
+ }
43
+ function formatChannelsAsSimple(channels) {
44
+ channels.forEach((channel) => console.log(channel.name));
45
+ }
46
+ function formatChannelsAsJson(channels) {
47
+ console.log(JSON.stringify(channels.map((channel) => ({
48
+ id: channel.id,
49
+ name: channel.name,
50
+ type: channel.type,
51
+ members: channel.members,
52
+ created: channel.created + 'T00:00:00Z',
53
+ purpose: channel.purpose,
54
+ })), null, 2));
55
+ }
56
+ function formatChannelName(channelName) {
57
+ if (!channelName)
58
+ return '#unknown';
59
+ return channelName.startsWith('#') ? channelName : `#${channelName}`;
60
+ }
61
+ function getChannelTypes(type) {
62
+ switch (type) {
63
+ case 'public':
64
+ return 'public_channel';
65
+ case 'private':
66
+ return 'private_channel';
67
+ case 'im':
68
+ return 'im';
69
+ case 'mpim':
70
+ return 'mpim';
71
+ case 'all':
72
+ return 'public_channel,private_channel,mpim,im';
73
+ default:
74
+ return 'public_channel';
75
+ }
76
+ }
77
+ //# sourceMappingURL=channel-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-formatter.js","sourceRoot":"","sources":["../../src/utils/channel-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { SlackApiClient } from './slack-api-client';
2
+ /**
3
+ * Creates a SlackApiClient instance with configuration from the specified profile
4
+ */
5
+ export declare function createSlackClient(profile?: string): Promise<SlackApiClient>;
6
+ //# sourceMappingURL=client-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../../src/utils/client-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAGjF"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSlackClient = createSlackClient;
4
+ const slack_api_client_1 = require("./slack-api-client");
5
+ const config_helper_1 = require("./config-helper");
6
+ /**
7
+ * Creates a SlackApiClient instance with configuration from the specified profile
8
+ */
9
+ async function createSlackClient(profile) {
10
+ const config = await (0, config_helper_1.getConfigOrThrow)(profile);
11
+ return new slack_api_client_1.SlackApiClient(config.token);
12
+ }
13
+ //# sourceMappingURL=client-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../src/utils/client-factory.ts"],"names":[],"mappings":";;AAMA,8CAGC;AATD,yDAAoD;AACpD,mDAAmD;AAEnD;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAAgB;IACtD,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAgB,EAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,iCAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type CommandAction<T = unknown> = (options: T) => Promise<void> | void;
2
+ export declare function wrapCommand<T = unknown>(action: CommandAction<T>): CommandAction<T>;
3
+ export declare function getProfileName(configManager: {
4
+ getCurrentProfile: () => Promise<string>;
5
+ }, providedProfile?: string): Promise<string>;
6
+ //# sourceMappingURL=command-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-wrapper.d.ts","sourceRoot":"","sources":["../../src/utils/command-wrapper.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE9E,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAcnF;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE;IAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,EAC3D,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAEjB"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.wrapCommand = wrapCommand;
7
+ exports.getProfileName = getProfileName;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const error_utils_1 = require("./error-utils");
10
+ function wrapCommand(action) {
11
+ return async (options) => {
12
+ try {
13
+ await action(options);
14
+ }
15
+ catch (error) {
16
+ console.error(chalk_1.default.red('✗ Error:'), (0, error_utils_1.extractErrorMessage)(error));
17
+ if (process.env.NODE_ENV === 'development' && error instanceof Error) {
18
+ console.error(chalk_1.default.gray(error.stack));
19
+ }
20
+ process.exit(1);
21
+ }
22
+ };
23
+ }
24
+ async function getProfileName(configManager, providedProfile) {
25
+ return providedProfile || (await configManager.getCurrentProfile());
26
+ }
27
+ //# sourceMappingURL=command-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-wrapper.js","sourceRoot":"","sources":["../../src/utils/command-wrapper.ts"],"names":[],"mappings":";;;;;AAKA,kCAcC;AAED,wCAKC;AA1BD,kDAA0B;AAC1B,+CAAoD;AAIpD,SAAgB,WAAW,CAAc,MAAwB;IAC/D,OAAO,KAAK,EAAE,OAAU,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAA,iCAAmB,EAAC,KAAK,CAAC,CAAC,CAAC;YAEjE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBACrE,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,aAA2D,EAC3D,eAAwB;IAExB,OAAO,eAAe,IAAI,CAAC,MAAM,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ProfileConfigManager } from './profile-config';
2
+ /**
3
+ * Helper function to get configuration with proper error handling
4
+ */
5
+ export declare function getConfigOrThrow(profile?: string, configManager?: ProfileConfigManager): Promise<{
6
+ token: string;
7
+ }>;
8
+ //# sourceMappingURL=config-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-helper.d.ts","sourceRoot":"","sources":["../../src/utils/config-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIxD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,GAAE,oBAAiD,GAC/D,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5B"}