← All Skills

snappy-slack

v1.0.0
20 files, 147.4 KB ~2,432 words · 10 min read Updated 2026-09-09

snappy-slack skill

45 of 53 checks pass
covers 9 of 174 operations of Slack, checked 2026-09-09
What it can do
channelsread
messages channel limit?read
search query limit?read
thread channel tsread
send channel textsend
reply channel ts textsend
react channel ts emojiwrite-reversible
edit channel ts textwrite-reversible
delete channel tsdelete
What does not pass yet
$ npx snappy-skills install snappy-slack
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── adapter.ts ├── api.ts ├── entities.json ├── face.test.ts ├── faces/ │ ├── components/ │ │ ├── slack-channel-list.css │ │ ├── slack-channel-list.tsx │ │ ├── slack-thread.css │ │ └── slack-thread.tsx │ ├── family.tsx │ └── fixtures/ │ ├── slack-channels.json │ ├── slack-decision.json │ ├── slack-draft.json │ ├── slack-list.json │ ├── slack-message.json │ └── slack-thread.json ├── orbiter-status.ts ├── refusals.test.ts └── workflows.md
Documents
AGENTS.md

snappy-slack -- Agent Loader#

You handle Snappy's Slack channel: posting to channels, DMs, thread replies, urgent Robert notifications, and morning triage. Direct Slack Web API via api.ts -- no Xano middleware.

API module#

typescriptimport { listChannels, readMessages, sendSlackMessage, sendDm, replyInThread, editSlackMessage, deleteSlackMessage, searchSlackMessages } from "../snappy-slack/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-slack/api.ts channels
npx tsx ~/.claude/skills/snappy-slack/api.ts messages C09DD2D0S07 10
npx tsx ~/.claude/skills/snappy-slack/api.ts messages general 5
npx tsx ~/.claude/skills/snappy-slack/api.ts send C09DD2D0S07 "Hello from agent"
npx tsx ~/.claude/skills/snappy-slack/api.ts send all-snappy "Hello from agent"

Credentials loaded automatically via snappy-settings/load.ts from .env.cache. Prefers SLACK_USER_TOKEN (xoxp-), falls back to SLACK_BOT_TOKEN (xoxb-).


API functions#

Function Purpose
listChannels(limit?) List public + private channels
readMessages(channelId, limit?) Channel history (CLI accepts channel name or ID + optional limit)
sendSlackMessage(channelId, text, threadTs?) Post to channel (or thread if threadTs)
sendDm(userId, text) Open DM and send
replyInThread(channelId, threadTs, text) Thread reply
editSlackMessage(channelId, ts, text) Edit a posted message
deleteSlackMessage(channelId, ts) Delete a posted message
searchSlackMessages(query, limit?) Search messages across workspace

Pre-cached channel IDs#

Channel ID
#all-snappy C09DD2D0S07
#social C09DD2D0T7H
#bugs-and-issues C09KKEYAH1V
#tech C0A1B3Q2BH9
#proj-total-crm C0AHMKPTY1M

Robert's user ID: U09DD2CLSH5

Notification routing#

Event Channel Endpoint
Bug reports, errors #bugs-and-issues bot-message
Content/social published #social bot-message
General team updates #all-snappy bot-message
Internal ops #tech bot-message
Client updates #client-{name} bot-message
Urgent / Robert-only Robert DM slack-notify-robert

Rules#

  • Use api.ts functions, NOT agent-browser for Slack, NOT Xano endpoints (they're dead)
  • Use pre-cached IDs -- do not look up channels from scratch
  • Route to the correct channel per event type -- not everything to #all-snappy
  • For Robert-only alerts, use sendDm("U09DD2CLSH5", text)
  • Credentials come from .env.cache via snappy-settings/load.ts -- never hardcode tokens

Uses#

skill relationship
snappy-ops Orchestrator -- morning briefing reads channels, posts status
snappy-update Producer -- weekly dev updates to client channels
snappy-clients Producer -- onboarding, status updates to #client-{name}
snappy-freshbooks Producer -- invoice notifications to client channels
snappy-whatsapp / snappy-telegram / snappy-email / snappy-imessage Sibling channels

Full skill reference#

If this loader is insufficient, load ~/.claude/skills/snappy-slack/SKILL.md as last resort. Extended workflows: workflows.md.

If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-slack: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-slack Index]|root: ~/.claude/skills/snappy-slack|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,workflows.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-calendar
  • snappy-course
  • snappy-inbox-sweep
  • snappy-telegram
  • snappy-whatsapp

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
channels read npx tsx ~/.claude/skills/snappy-slack/api.ts channels
messages channel, limit? read npx tsx ~/.claude/skills/snappy-slack/api.ts messages <channel>
search query, limit? read npx tsx ~/.claude/skills/snappy-slack/api.ts search "<query>"
thread channel, ts read npx tsx ~/.claude/skills/snappy-slack/api.ts thread <channel> <ts>
send channel, text send npx tsx ~/.claude/skills/snappy-slack/api.ts send <channel> "<text>"
reply channel, ts, text send npx tsx ~/.claude/skills/snappy-slack/api.ts reply <channel> <ts> "<text>"
react channel, ts, emoji write-reversible npx tsx ~/.claude/skills/snappy-slack/api.ts react <channel> <ts> <emoji>
edit channel, ts, text write-reversible npx tsx ~/.claude/skills/snappy-slack/api.ts edit <channel> <ts> "<text>"
delete channel, ts delete npx tsx ~/.claude/skills/snappy-slack/api.ts delete <channel> <ts>

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-slack
role: Slack messaging -- channel posts, DMs, thread replies, notifications, triage
loaded-by: PreToolUse hook (auto-injected when "snappy-slack" is mentioned)
---

# snappy-slack -- Agent Loader

You handle Snappy's Slack channel: posting to channels, DMs, thread replies, urgent Robert notifications, and morning triage. Direct Slack Web API via `api.ts` -- no Xano middleware.

## API module

```typescript
import { listChannels, readMessages, sendSlackMessage, sendDm, replyInThread, editSlackMessage, deleteSlackMessage, searchSlackMessages } from "../snappy-slack/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-slack/api.ts channels
npx tsx ~/.claude/skills/snappy-slack/api.ts messages C09DD2D0S07 10
npx tsx ~/.claude/skills/snappy-slack/api.ts messages general 5
npx tsx ~/.claude/skills/snappy-slack/api.ts send C09DD2D0S07 "Hello from agent"
npx tsx ~/.claude/skills/snappy-slack/api.ts send all-snappy "Hello from agent"
```

Credentials loaded automatically via `snappy-settings/load.ts` from `.env.cache`. Prefers `SLACK_USER_TOKEN` (xoxp-), falls back to `SLACK_BOT_TOKEN` (xoxb-).

---

## API functions

| Function | Purpose |
|----------|---------|
| `listChannels(limit?)` | List public + private channels |
| `readMessages(channelId, limit?)` | Channel history (CLI accepts channel name or ID + optional limit) |
| `sendSlackMessage(channelId, text, threadTs?)` | Post to channel (or thread if threadTs) |
| `sendDm(userId, text)` | Open DM and send |
| `replyInThread(channelId, threadTs, text)` | Thread reply |
| `editSlackMessage(channelId, ts, text)` | Edit a posted message |
| `deleteSlackMessage(channelId, ts)` | Delete a posted message |
| `searchSlackMessages(query, limit?)` | Search messages across workspace |

## Pre-cached channel IDs

| Channel | ID |
|---------|-----|
| `#all-snappy` | `C09DD2D0S07` |
| `#social` | `C09DD2D0T7H` |
| `#bugs-and-issues` | `C09KKEYAH1V` |
| `#tech` | `C0A1B3Q2BH9` |
| `#proj-total-crm` | `C0AHMKPTY1M` |

Robert's user ID: `U09DD2CLSH5`

## Notification routing

| Event | Channel | Endpoint |
|-------|---------|----------|
| Bug reports, errors | `#bugs-and-issues` | `bot-message` |
| Content/social published | `#social` | `bot-message` |
| General team updates | `#all-snappy` | `bot-message` |
| Internal ops | `#tech` | `bot-message` |
| Client updates | `#client-{name}` | `bot-message` |
| Urgent / Robert-only | Robert DM | `slack-notify-robert` |

## Rules

- Use `api.ts` functions, NOT `agent-browser` for Slack, NOT Xano endpoints (they're dead)
- Use pre-cached IDs -- do not look up channels from scratch
- Route to the correct channel per event type -- not everything to `#all-snappy`
- For Robert-only alerts, use `sendDm("U09DD2CLSH5", text)`
- Credentials come from `.env.cache` via `snappy-settings/load.ts` -- never hardcode tokens

## Uses

| skill | relationship |
|-------|-------------|
| `snappy-ops` | Orchestrator -- morning briefing reads channels, posts status |
| `snappy-update` | Producer -- weekly dev updates to client channels |
| `snappy-clients` | Producer -- onboarding, status updates to `#client-{name}` |
| `snappy-freshbooks` | Producer -- invoice notifications to client channels |
| `snappy-whatsapp` / `snappy-telegram` / `snappy-email` / `snappy-imessage` | Sibling channels |

---

## Full skill reference

If this loader is insufficient, load `~/.claude/skills/snappy-slack/SKILL.md` as last resort. Extended workflows: [workflows.md](workflows.md).

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-slack: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-slack Index]|root: ~/.claude/skills/snappy-slack|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,workflows.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-calendar`
- `snappy-course`
- `snappy-inbox-sweep`
- `snappy-telegram`
- `snappy-whatsapp`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `channels` | — | `read` | `npx tsx ~/.claude/skills/snappy-slack/api.ts channels` |
| `messages` | `channel`, `limit?` | `read` | `npx tsx ~/.claude/skills/snappy-slack/api.ts messages <channel>` |
| `search` | `query`, `limit?` | `read` | `npx tsx ~/.claude/skills/snappy-slack/api.ts search "<query>"` |
| `thread` | `channel`, `ts` | `read` | `npx tsx ~/.claude/skills/snappy-slack/api.ts thread <channel> <ts>` |
| `send` | `channel`, `text` | `send` | `npx tsx ~/.claude/skills/snappy-slack/api.ts send <channel> "<text>"` |
| `reply` | `channel`, `ts`, `text` | `send` | `npx tsx ~/.claude/skills/snappy-slack/api.ts reply <channel> <ts> "<text>"` |
| `react` | `channel`, `ts`, `emoji` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-slack/api.ts react <channel> <ts> <emoji>` |
| `edit` | `channel`, `ts`, `text` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-slack/api.ts edit <channel> <ts> "<text>"` |
| `delete` | `channel`, `ts` | `delete` | `npx tsx ~/.claude/skills/snappy-slack/api.ts delete <channel> <ts>` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?