agentleFS
rolandtolnayrolandtolnay/llm-toolkit/skills/slack/SKILL.md

slack

Skill1 starsChanged 3 months agoMITView on GitHub

Send messages, search conversations, read channel history, and manage status in Slack. Use when sending DMs, posting to channels, searching messages, reading threads, editing messages, setting status, or scheduling messages. Examples: "message Roland", "search for deployment", "set my status to deep work".

64 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use taskflow-inbox-triage, BlueBubbles and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • AtomicBot-aiSkill

    taskflow-inbox-triage

    Also in 6 projects that use this

  • jiulingyunSkill

    BlueBubbles

    为Clawdbot构建或更新BlueBubbles外部通道插件(扩展包,REST发送/探测,webhook入站)。

    Also in 18 projects that use this

  • seedprodSkill

    voice-call

    Start voice calls via the OpenClaw voice-call plugin.

    Also in 16 projects that use this

  • hkyutongSkill

    openclaw-release-maintainer

    Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.

    Also in 4 projects that use this

  • seedprodSkill

    session-logs

    Search and analyze your own session logs (older/parent conversations) using jq.

    Also in 16 projects that use this

  • AtomicBot-aiSkill

    taskflow

    Also in 6 projects that use this

  • +5 more from seedprod

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 61 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    When the user says "message Roland about X" or "tell Ejaz Y", extract the person's name as the target and the rest as the message content.

    line 110
  2. Very specific:

    MISSING_TOKEN: Read the references/setup-guide.md file next to this skill and guide user through setup

    line 132
  3. Very specific:

    RATE_LIMITED: Wait and retry after the indicated period

    line 137
  4. Distinctive:

    Always parse JSON error response and present human-friendly message with suggestions.

    line 139

“Common” is measured: kept by at least 6 in 10 of the 61 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md
<objective> Conversational interface to Slack for messaging and search. Read-only commands (search, history, channels, users) execute immediately. Outbound messages always require user confirmation before sending.

Do NOT explore the codebase unless the user explicitly asks. Work from user's description only. </objective>

<cli_reference> CLI script: scripts/slack.py (relative to this skill's install directory)

Resolve the script path before first use: check ~/.claude/skills/slack/scripts/slack.py, then .claude/skills/slack/scripts/slack.py. Cache the result for the session.

Run with: uv run <resolved-path>/scripts/slack.py <command> [options]

Commands:

CommandUsagePurpose
sendsend <target> <message> [--thread/-t ts]Send message (or thread reply)
editedit <channel_id> <ts> <new_text>Edit a sent message (own only)
searchsearch <query> [--count/-c N]Search messages (default 20)
historyhistory <channel> [--count/-c N]Recent channel messages (default 20)
read-threadread-thread <channel> <thread_ts>Read thread replies
channelschannels [--search/-s name]List/search channels
usersusers [--search/-s name]List/search workspace members
deletedelete <channel_id> <ts>Delete a message
reactreact <channel_id> <ts> <emoji>Add reaction to a message
statusstatus [text] [--emoji/-e name] [--expires/-x duration]Set/clear Slack status
scheduleschedule <target> <message> --at <time>Schedule message for later

Target resolution (for send):

  • Channel ID (starts with C, G, or D) → use directly
  • #channel-name → finds channel by name
  • Person's name (e.g. Roland) → finds user, opens DM, sends there

Search query modifiers: Slack search syntax works — from:me, in:#channel, before:2026-03-01, after:2026-02-01, has:link, etc.

Status duration format: 2h, 30m, 1h30m — auto-clears after the specified time.

Schedule time format: --at "in 2h", --at "in 30m", --at "in 1h30m", or a Unix timestamp. </cli_reference>

<process><step name="parse_intent"> **Parse the command to determine intent:**
PatternIntentAction
send <target> <message>Send messageGo to send_flow
reply to thread, respond in threadThread replyUse send with --thread
edit message, fix that message, update what I sentEdit messageExecute edit with channel, ts, new text
search <query>, find messages aboutSearchExecute search directly
history <channel>, read #channel, what's happening in #channelChannel historyExecute history directly
read thread, show thread repliesRead threadExecute read-thread directly
channels, list channels, find channelList channelsExecute channels directly
users, who's in the workspace, find userList usersExecute users directly
delete messageDeleteExecute delete directly
react, add reaction, add emojiReactExecute react directly
set status, set my status to, I'm doingSet statusExecute status with text, emoji, optional expiry
clear status, remove statusClear statusExecute status with empty text
schedule message, send later, send tomorrowScheduleGo to send_flow but use schedule with --at
message <name> <text>, DM <name>, tell <name>Send DMGo to send_flow with person target
post in #channel <text>Send to channelGo to send_flow with channel target
post about the PR, share the PR, announce the PRPR announcementGo to pr_announcement_flow
</step><step name="direct_commands"> **For direct commands (search, history, read-thread, channels, users, delete, react, edit, status, schedule):**

Execute CLI and format output.

uv run <slack.py> [command] [args]

Parse JSON response and present result:

  • Success: Format messages readably — show user, text, timestamp, and permalink where available
  • For channels/users: List with IDs for reference
  • For history: Show messages in chronological order with thread indicators
  • Error: Show error message and suggestions</step>
<step name="send_flow"> **For sending and scheduling messages:**

CRITICAL: Every outbound message MUST be confirmed by the user before sending.

  1. Resolve target from user's description — the CLI handles channel/user resolution automatically
  2. Draft the message and present it to the user using AskUserQuestion with options to confirm or request changes.
  3. Only after the user confirms, execute:
    • Immediate send:
      uv run <slack.py> send "<target>" "<message>" [--thread <ts>]
    • Scheduled send:
      uv run <slack.py> schedule "<target>" "<message>" --at "<time>"
  4. Confirm delivery: Show channel/DM and timestamp from response

When the user says "message Roland about X" or "tell Ejaz Y", extract the person's name as the target and the rest as the message content. </step>

<step name="pr_announcement_flow"> **For PR announcements (e.g. "post about the PR", "share PR in #engineering-pr"):**

Triggered when the user asks to post/share/announce a PR to a channel. Gather the PR details automatically, compose the message using the template below, then follow the normal send_flow (draft → confirm → send).

  1. Gather PR info — run gh pr view --json number,title,url,body to get the current branch's PR. If the user specifies a PR number, use gh pr view <number> instead.
  2. Compose the message using this format:
    PR #<number>: <title>
    <url>
    <one-liner context>
    The <one-liner context> is a single sentence explaining why this matters — what it enables or unblocks, not just what files changed. Derive from the PR body/summary. Focus on impact for the team (e.g. "Enables end-to-end local testing of payments and subscriptions" rather than "Updates local-seed.sh").
  3. Present the draft to the user for confirmation, then follow the normal send_flow to post it.</step>
<step name="error_handling"> **Handle errors gracefully:**
  • MISSING_TOKEN: Read the references/setup-guide.md file next to this skill and guide user through setup
  • AUTH_FAILED: Token is invalid or revoked — regenerate from Slack app settings
  • CHANNEL_NOT_FOUND: Suggest using channels --search to find the right name
  • USER_NOT_FOUND: Suggest using users --search to find the right person
  • PERMISSION_DENIED: Token missing required scope — list needed scopes and suggest reinstalling the app
  • RATE_LIMITED: Wait and retry after the indicated period

Always parse JSON error response and present human-friendly message with suggestions. </step>

</process>

<success_criteria>

  • Outbound messages (send, schedule, DM) are ALWAYS shown to the user and confirmed before posting
  • Read-only commands (search, history, channels, users, read-thread) execute immediately
  • Errors handled with helpful setup instructions
  • Search results include permalink for easy navigation
  • History output shows user names (not raw IDs) and thread indicators
  • CLI output parsed and formatted — show user names, text, timestamps, and permalinks
  • Target resolution handles channels (#name), channel IDs, and person names </success_criteria>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.