Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read this when you need to use Slack.
.claude/skills/kunanonj-aside-slack/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 143% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -10% | 0% |
Use the slack global in the REPL tool. It extracts credentials from the logged-in Slack browser session and returns a @slack/web-api WebClient. No openTab is needed- just use the official Slack API.
Always gather 3-5 user's message writing examples to the channel/person and try to match the tones and writing styles. (and remember it to memory).
The main goal is try to look like the user you're delegating. Be natural like human, and copy habits (e.g., spliting into multiple messages)
js// List workspaces const workspaces = await slack.listWorkspaces(); console.log(workspaces); // → [{ teamId, name, slug, status, memberCount, iconUrl, userId, url, isLastActive? }, ...] // Get a WebClient for a workspace. IMPORTANT: Save it in a const so you can reuse it in later REPL calls. const client = await slack.getClient('T05DP5U7M8X'); // List channels const { channels } = await client.conversations.list({ types: 'public_channel,private_channel', limit: 50 }); console.log(channels.map(c => `#${c.name} (${c.id})`)); // Read messages const { messages } = await client.conversations.history({ channel: 'C0ARUCEK04A', limit: 20 }); console.log(JSON.stringify(messages, null, 2)); // Post a message await client.chat.postMessage({ channel: 'C0ARUCEK04A', text: 'Hello from Aside!' }); // Search const results = await client.search.messages({ query: 'from:alice quarterly report' }); console.log(JSON.stringify(results.messages.matches, null, 2)); // send message with uploading files await client.filesUploadV2({ channel_id: 'C0ARUCEK04A', thread_ts: '1223313423434.131321', // optional: upload into a thread initial_comment: 'Hey <@U05DP5U7M8X>, here are the files you\'ve requested:', file_uploads: [ { file: './logo.png', filename: 'logo.png' }, { file: './logo-sm.png', filename: 'logo-sm.png' }, ], }); // Each entry in `file_uploads` accepts: `file`, `content`, `filename`, `filetype`, `title`, `snippet_type` (e.g. `python`), `alt_text`.
slack.listWorkspaces(): Promise<Workspace[]>Fetch all workspaces the user belongs to. Only requires the session cookie — no page tab opened.
Return type:
tsinterface Workspace { teamId: string; // e.g. 'T05DP5U7M8X' name: string; // e.g. 'My Company' url: string; // e.g. 'https://app.slack.com/client/T05DP5U7M8X' iconUrl: string; // 88×88 workspace icon memberCount: number; status: 'joined' | 'pending-invite' | 'needs-login'; isLastActive?: boolean; slug: string; // e.g. 'mycompany' from mycompany.slack.com userId: string | null; // current user's ID in this workspace }
Each workspace has a status field:
'joined' — active member, ready to use'needs-login' — session expired, needs re-login in browser'pending-invite' — not yet accepted invitationslack.getClient(teamId?: string): Promise<WebClient>Extract credentials and return a fully configured @slack/web-api WebClient. Opens a temporary Slack tab to read the xoxc- token from localStorage, then closes it. If teamId is omitted, uses the last active workspace.
The returned WebClient is the standard @slack/web-api SDK - it has all the methods and parameters as documented in the Slack API docs. If you have struggle using the correct API, please search https://docs.slack.dev/reference for the correct method and parameters.
filesUploadV2Upload single or multiple files with client.filesUploadV2. Accepts file (path, Buffer, or ReadStream) or content (string).
js// Single file await client.filesUploadV2({ channel_id: 'C0ARUCEK04A', file: './logo.png', filename: 'logo.png', initial_comment: 'New logo', });
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 10,960 | 3,815 | -65% | 1 | 1 | 0% | 1,608 | 1,950 | +21% | 0 | 0 | — |
case-09 | pass→pass | 4,623 | 2,101 | -55% | 1 | 1 | 0% | 952 | 1,586 | +67% | 0 | 0 | — |
case-14 | pass→pass | 2,958 | 1,433 | -52% | 1 | 1 | 0% | 572 | 1,359 | +138% | 0 | 0 | — |
case-01 | fail→fail | 2,902 | 7,920 | +173% | 1 | 1 | 0% | 418 | 1,754 | +320% | 0 | 0 | — |
case-02 | fail→fail | 3,269 | 6,586 | +101% | 1 | 1 | 0% | 529 | 1,360 | +157% | 0 | 0 | — |
case-03 | pass→fail | 5,440 | 6,226 | +14% | 1 | 1 | 0% | 958 | 1,694 | +77% | 0 | 0 | — |
case-05 | fail→pass | 7,050 | 2,349 | -67% | 1 | 1 | 0% | 1,477 | 1,610 | +9% | 0 | 0 | — |
case-06 | pass→pass | 10,377 | 3,686 | -64% | 1 | 1 | 0% | 1,414 | 1,810 | +28% | 0 | 0 | — |
case-07 | fail→pass | 5,915 | 1,128 | -81% | 1 | 1 | 0% | 1,025 | 1,309 | +28% | 0 | 0 | — |
case-08 | pass→pass | 4,285 | 4,815 | +12% | 1 | 1 | 0% | 880 | 2,036 | +131% | 0 | 0 | — |
case-10 | fail→pass | 4,032 | 3,385 | -16% | 1 | 1 | 0% | 573 | 1,392 | +143% | 0 | 0 | — |
case-11 | pass→pass | 3,968 | 2,807 | -29% | 1 | 1 | 0% | 789 | 1,755 | +122% | 0 | 0 | — |
case-12 | fail→pass | 8,645 | 1,440 | -83% | 1 | 1 | 0% | 1,481 | 1,329 | -10% | 0 | 0 | — |
case-13 | fail→fail | 11,077 | 3,231 | -71% | 1 | 1 | 0% | 1,804 | 1,680 | -7% | 0 | 0 | — |
case-15 | pass→pass | 5,091 | 2,967 | -42% | 1 | 1 | 0% | 943 | 1,699 | +80% | 0 | 0 | — |
case-16 | fail→pass | 17,663 | 5,983 | -66% | 1 | 1 | 0% | 1,651 | 2,247 | +36% | 0 | 0 | — |
case-17 | pass→pass | 9,286 | 2,236 | -76% | 1 | 1 | 0% | 1,947 | 1,565 | -20% | 0 | 0 | — |
case-18 | pass→pass | 3,833 | 1,783 | -53% | 1 | 1 | 0% | 675 | 1,498 | +122% | 0 | 0 | — |
case-19 | fail→pass | 2,919 | 1,281 | -56% | 1 | 1 | 0% | 523 | 1,338 | +156% | 0 | 0 | — |
case-20 | pass→fail | 8,024 | 7,135 | -11% | 1 | 1 | 0% | 1,747 | 1,644 | -6% | 0 | 0 | — |
case-21 | pass→pass | 2,617 | 3,721 | +42% | 1 | 1 | 0% | 558 | 1,867 | +235% | 0 | 0 | — |
case-22 | pass→pass | 7,285 | 6,901 | -5% | 1 | 1 | 0% | 1,591 | 2,633 | +65% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +23 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.