skills/add-slack/SKILL.md
Add Slack as a communication channel
npx skillsauth add Rawknee-69/Beta-Claw add-slackInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are the Slack integration assistant. Set up a Slack app as a communication channel for betaclaw.
Guide the user through creating a Slack app:
chat:write — Send messageschannels:history — Read public channel messagesgroups:history — Read private channel messagesim:history — Read DMsapp_mentions:read — Detect mentionsfiles:read — Read file attachmentsconnections:write scopemessage.channelsmessage.groupsmessage.imapp_mentionxoxb-...), Signing Secret, and App-Level Token (xapp-...)SLACK_BOT_TOKEN (starts with xoxb-).SLACK_SIGNING_SECRET (hex string from Basic Information page).SLACK_APP_TOKEN (starts with xapp-, for Socket Mode).Run: npm install @slack/bolt
Create src/channels/slack.ts implementing the IChannel interface using @slack/bolt in Socket Mode (no public URL needed):
import { App } from '@slack/bolt';
import type { IChannel, InboundMessage, OutboundMessage, ChannelFeature } from './interface.js';
class SlackChannel implements IChannel {
id = 'slack';
name = 'Slack';
private app: App;
private messageHandler: ((msg: InboundMessage) => void) | null = null;
constructor(botToken: string, appToken: string, signingSecret: string) {
this.app = new App({
token: botToken,
appToken: appToken,
signingSecret: signingSecret,
socketMode: true,
});
}
async connect(): Promise<void> {
this.app.message(async ({ message }) => {
if (!this.messageHandler || message.subtype) return;
if ('text' in message && 'user' in message) {
this.messageHandler({
id: message.ts ?? '',
groupId: message.channel,
senderId: message.user ?? 'unknown',
content: message.text ?? '',
timestamp: parseFloat(message.ts ?? '0') * 1000,
replyToId: ('thread_ts' in message) ? message.thread_ts : undefined,
});
}
});
await this.app.start();
}
async disconnect(): Promise<void> {
await this.app.stop();
}
async send(msg: OutboundMessage): Promise<void> {
await this.app.client.chat.postMessage({
channel: msg.groupId,
text: msg.content,
thread_ts: msg.replyToId,
});
}
onMessage(handler: (msg: InboundMessage) => void): void {
this.messageHandler = handler;
}
supportsFeature(f: ChannelFeature): boolean {
const supported: ChannelFeature[] = ['markdown', 'images', 'files', 'reactions', 'threads'];
return supported.includes(f);
}
}
Adapt to match the project's exact interface and conventions.
slack to the enabled channels list in .beta/config.toon.Ask the user:
Report:
/customize to change Slack settingsdevelopment
Search the web and summarize results
development
Send messages via Telegram Bot API
data-ai
Show system health, active models, channels, and skills
tools
Full betaclaw installation and onboarding wizard