Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions plugins/slack/skills/slack-channel-summarization/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
name: slack-channel-summarization
description: Summarize activity from one Slack channel and return a concise recap, post-ready update, or summary doc.
---

# Slack Channel Summarization

Use this skill to summarize activity from one Slack channel, using a requested time window when provided or the last 100 messages otherwise, and optionally deliver the result back into Slack.

## Related Skills

| Workflow | Skill |
| --- | --- |
| Draft, send, or rewrite the final Slack update | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) |

## Start Here

- If the user did not name a channel, ask which channel to review.
- If the user provided a window, use it. For requests like "today" or "this week," resolve the user's timezone with `slack_read_user_profile`.
- If the user did not provide a window, default to the last `100` messages in the channel.

## Workflow

1. Resolve the named channel with `slack_search_channels`.
2. Collect the initial pass with `slack_read_channel` and `limit: 100`. If the user gave a window, set `oldest` and `latest`. If not, read the latest messages.
3. Read a thread using `slack_read_thread` when the parent message looks important to the summary, for example a decision, blocker, launch, incident, or open question. Default to the last `50` replies unless the request requires more.
4. Consolidate the channel activity into a short summary grouped by topic. The summary should include recurring conversations, key decisions or follow-ups, notable updates, and important threads.
5. Match the delivery format to the request:
- short recap or brief: reply in chat or draft/send a compact Slack message
- summary doc: use `slack_create_canvas`
6. If the user wants the result delivered in Slack, draft by default unless they explicitly asked to send.

## Formatting

For a concise Slack or chat summary, format as:

```md
*Channel Summary — <channel>*
*Overview:* <1–2 sentence summary of the main themes and biggest updates>

*Topic: <topic 1>*
- ...
- ...

*Topic: <topic 2>*
- ...
- ...

*Notes*
- <gaps, caveats, or sparse activity>
```

- Group the summary into 2–4 topics when possible.
- Keep each topic to 1–5 bullets.
- Use the overview to explain what the channel was focused on overall.
- Start each bullet with the main update. Add an owner or next step only when it is clear from the channel.
- Within each topic, capture decisions, action items, notable updates, and thread outcomes.
- Note if a thread is still open or unresolved instead of implying it concluded.
- Omit *Notes* when there are no caveats, gaps, or sparse-activity disclaimers to add.
- For a canvas, expand each topic into a short section and use `slack_create_canvas`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
interface:
display_name: "Slack Channel Summarization"
short_description: "Summarize one Slack channel"
icon_small: "../slack/assets/slack-small.svg"
icon_large: "../slack/assets/slack.svg"
brand_color: "#611F69"
default_prompt: "Use $slack-channel-summarization to review one Slack channel, using the requested window when provided and otherwise the last 100 messages, then produce a concise summary, post-ready update, or summary canvas."
56 changes: 56 additions & 0 deletions plugins/slack/skills/slack-daily-digest/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
name: slack-daily-digest
description: Create a daily Slack digest from selected channels or topics. Use when the user asks for a daily Slack recap or summary of today's Slack activity.
---

# Slack Daily Digest

Use this skill to produce a daily digest of today's important Slack activity from selected channels or topics.

## Start Here

- If the user did not name channels or topics, ask first before making any Slack tool calls.
- Do not guess the user's main or starred channels.

## Workflow

1. Confirm channels or topic keywords.
2. Resolve the user's timezone with `slack_read_user_profile`. For "today," use local start-of-day through now and state that window in the digest.
3. Named channels: Resolve IDs through `slack_search_channels`, then call `slack_read_channel` for today's window with `limit` at `50` per channel.
4. Named topics: Use `slack_search_public_and_private` for each topic phrase. If channels were also provided, run one search per topic and channel with `query` set to `<topic phrase> in:<#CHANNEL_ID>` so the search stays inside the selected channels. If no channels were provided, set `query` to the topic phrase. Then read the returned channels with `slack_read_channel` or parent threads with `slack_read_thread` when a result looks important.
5. Prioritize decisions, blockers, incidents, asks, ownership changes, deadline changes, and status changes.

## Formatting

Format the digest as:

```md
*Daily Slack Digest — YYYY-MM-DD*

*Scope:* <channels + topics + time window + coverage note>
*Summary:* <1–2 line overview of volume + key signals>

*Details (by <channel|topic>)*
*<Group 1>*
- ...
- ...

*<Group 2>*
- ...
- ...

*Needs attention*
- ...

*Notes*
- <gaps, absences, or caveats>
```

- Use short group headers and keep each group to 1–3 bullets.
- Keep the digest compact; aim for 4–10 bullets total across all sections.
- Start each bullet with the key update, then add implication, owner, blocker, or action if relevant.
- If grouping by topic, include the channel when helpful.
- If grouping by channel, include the topic when helpful.
- Preserve exact channel names.
- Include *Needs attention* only for items requiring user action, decisions, or input.
- Include *Notes* for gaps, absences, sparse results, or caveats.
7 changes: 7 additions & 0 deletions plugins/slack/skills/slack-daily-digest/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
interface:
display_name: "Slack Daily Digest"
short_description: "Summarize today's Slack activity"
icon_small: "../slack/assets/slack-small.svg"
icon_large: "../slack/assets/slack.svg"
brand_color: "#611F69"
default_prompt: "Use $slack-daily-digest to summarize today's important Slack activity from selected channels or topics."
36 changes: 36 additions & 0 deletions plugins/slack/skills/slack-messages/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
name: slack-messages
description: Compose or rewrite standalone Slack messages with correct mrkdwn, destination-aware recipient checks, and explicit mention handling.
---

# Slack Messages

## Overview

Use this skill to compose, draft, or refine Slack-ready messages and related Slack content. Apply it when the next step involves `slack_send_message`, `slack_send_message_draft`, or `slack_create_canvas`.

## Reference Notes

Read this reference **before finalizing any outgoing Slack text**:

| Task | Reference |
| --- | --- |
| Exact Slack mrkdwn syntax for emphasis, lists, links, code, and mentions | [../slack/references/mrkdwn.md](../slack/references/mrkdwn.md) |

## Workflow

1. Identify the **intended destination** before drafting: channel, thread, DM, or group DM.
2. Determine whether the user wants a **draft**, a **send-ready message**, or content for a **Slack canvas**. **Default to a draft** unless the user has approved the wording or explicitly asked to send.
3. Read `../slack/references/mrkdwn.md` and use that syntax directly instead of generic Markdown.

## Destination Safety

- If the user wants to **cc, mention, or tag** someone, first check whether that person is already in the destination channel or group DM. If they are not, **warn the user** instead of implying the mention will notify them or that they will see the message.
- Treat `@here`, `@channel`, `@everyone`, and similar broad notifications as **high-impact**. Before posting, **warn the user** that the message will notify a broad audience.

## Mention Rules

- Resolve **user mentions** before writing when the message should tag a person, and use canonical Slack mrkdwn syntax: `<@U123456>`.
- Resolve **Slack user groups** before writing when the message should tag a group, and use canonical Slack mrkdwn syntax: `<!subteam^S123456>`.
- Do not rely on bare `@name` text in outgoing Slack messages.
- If you cannot resolve the correct user or group, **tell the user** and compose the draft or message without implying the mention will work.
7 changes: 7 additions & 0 deletions plugins/slack/skills/slack-messages/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
interface:
display_name: "Slack Messages"
short_description: "Write Slack messages and drafts"
icon_small: "../slack/assets/slack-small.svg"
icon_large: "../slack/assets/slack.svg"
brand_color: "#611F69"
default_prompt: "Use $slack-messages to write, draft, or rewrite Slack message content for sending, saving as a draft, or creating a canvas with correct mrkdwn and explicit Slack mentions."
54 changes: 54 additions & 0 deletions plugins/slack/skills/slack-notification-triage/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
name: slack-notification-triage
description: Triage recent Slack activity into a priority queue or task list for the user.
---

# Slack Notification Triage

Use this skill to produce a priority queue or task list for the user from recent Slack messages. It is for surfacing what the user likely needs to read, reply to, or do next.

## Start Here

- If the user provided a time window, use it. For requests like "today" or "this morning," resolve the user's timezone with `slack_read_user_profile`.
- Treat this as best-effort triage over recent Slack activity, not an exact unread or notification-state view.

## Workflow

1. Treat this as personal triage for the user. Focus on messages directed at the user, messages likely needing a reply, and messages that create a concrete follow-up or task for the user.
2. Resolve the current user with `slack_read_user_profile` so you have the user's Slack ID for mention-based searches.
3. If the user provided channel names, DMs, people, or topic keywords, use that scope.
4. **Named channels:** Resolve IDs through `slack_search_channels`, then call `slack_read_channel` with `limit` at `100` per channel.
5. **Named people or DMs:** Resolve people through `slack_search_users`, then use `slack_search_public_and_private` with several small searches using filters `from:<@USER_ID>`, `to:<@USER_ID>`, or `in:<@USER_ID>` to surface relevant DM or person-specific activity.
6. **Named topics:** Use `slack_search_public_and_private`, and if channels were also provided, keep the search inside those channels.
7. **No explicit scope:** Run several small `slack_search_public_and_private` searches using filters such as `to:me`, `<@USER_ID>`, and `is:thread`, then expand the strongest results with `slack_read_thread` for threads or `slack_read_channel` for surrounding channel context.
8. Use `slack_read_thread` when the thread could hold more necessary context.
9. Prioritize messages that likely need a reply or could create a concrete follow-up or task for the user.

## Formatting

Format the triage as:

```md
*Slack Notification Triage — YYYY-MM-DD*

*Summary:* <1–2 line overview of what the user most likely needs to read, reply to, or do next>

*Tasks for you*
- ...

*Worth skimming*
- ...

*Can ignore for now*
- ...

*Notes*
- <gaps, caveats, or partial coverage>
```

- Keep the triage compact; aim for 3–15 bullets total across all sections.
- Treat *Tasks for you* as the primary section whenever the triage is meant to produce a personal todo list.
- Include *Can ignore for now* only when the user explicitly asked to filter tasks.
- Start each bullet with the key update, then add the action the user may need to take.
- Preserve exact channel names and mention DMs explicitly.
- Use *Notes* for coverage limits or sparse results.
71 changes: 71 additions & 0 deletions plugins/slack/skills/slack-reply-drafting/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
name: slack-reply-drafting
description: Draft Slack replies from available context. Use when the user wants help finding messages that likely need a response and preparing reply drafts.
---

# Slack Reply Drafting

Use this skill to identify messages that likely need a reply and produce Slack-ready draft responses from the available context.

## Related Skills

| Workflow | Skill |
| --- | --- |
| Refine, draft, or send the final Slack text | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) |

## Start Here

- If the user provided channels, threads, DMs, people, or topics, use that scope instead of the default search.
- If no source scope was provided, default to searching:
- unanswered direct conversations
- direct mentions
- threads with prior user participation and newer replies
- threads with prior user mention and newer replies
- For time-specific requests, resolve the user's timezone with `slack_read_user_profile`.

## Support Boundaries

- **Draft by default.** Do not send unless the user explicitly asked to send.
- Do not invent facts, commitments, approvals, or decisions. If the context is not enough to answer confidently, draft a clarifying reply instead of guessing.

## Workflow

1. **Resolve the current user** with `slack_read_user_profile` so you have the user's `user_id` and can resolve the time window if necessary.
2. **Resolve the time window** if the user supplied one.
3. If the user provided an explicit scope, use the cheapest matching path:
- specific thread: `slack_read_thread`
- named channel: `slack_search_channels`, then `slack_read_channel`
- named person or DM: `slack_search_users`, then `slack_search_public_and_private`
- bounded keyword search: `slack_search_public_and_private`
4. If no scope was provided, search these default categories:
- unanswered direct conversations: `slack_search_public_and_private` across `im,mpim`, then `slack_read_channel` to keep conversations where the latest relevant message is from someone else
- direct mentions: `slack_search_public_and_private` with `query` set to `<@USER_ID>`
- threads with prior user participation: `slack_search_public_and_private` with `query` set to `from:<@USER_ID> is:thread`, then `slack_read_thread` for newer replies
- threads with prior user mention: `slack_search_public_and_private` with `query` set to `<@USER_ID> is:thread`, then `slack_read_thread` for newer replies after the mention
5. Keep only candidates where the latest relevant message is from someone else, or where newer replies appeared after the user's last reply or mention.
6. Expand only the threads or surrounding messages needed to answer accurately. Answer the question first, then add clarification or next steps when the context supports it.
7. If the context is incomplete, write the smallest useful clarifying reply instead of pretending the answer is known.
8. Create the draft with `slack_send_message_draft` in the source channel or DM, and include `thread_ts` for thread replies.

## Drafting Rules

- Use the [../slack-messages/SKILL.md](../slack-messages/SKILL.md) skill to draft outgoing Slack text.

## Formatting

Format multiple drafts as:

```md
*Reply Drafts — <scope>*

*<channel / DM / thread info>*
Draft: <link to draft>

*<channel / DM / thread info>*
Draft: <link to draft>
```

- Keep each item minimal: a short header plus the draft link.
- The header should identify the channel, DM, or thread.
- If the user asked for a single reply, return just that item.
- If no unreplied messages are found, say so directly and explain the scope checked.
7 changes: 7 additions & 0 deletions plugins/slack/skills/slack-reply-drafting/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
interface:
display_name: "Slack Reply Drafting"
short_description: "Draft Slack replies from context"
icon_small: "../slack/assets/slack-small.svg"
icon_large: "../slack/assets/slack.svg"
brand_color: "#611F69"
default_prompt: "Use $slack-reply-drafting to identify Slack messages that likely need a response and draft reply text grounded in the conversation context."
35 changes: 23 additions & 12 deletions plugins/slack/skills/slack/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,33 @@ description: Summarize Slack channels and threads, draft post-ready Slack messag

## Overview

Use this skill to turn channel and thread context into concise, post-ready Slack communication. Read the conversation first, preserve the intended audience and tone, and format drafts with Slack-native mrkdwn instead of generic prose.
Use this skill to turn channel and thread context into concise, post-ready Slack communication. Read the conversation first, preserve the intended audience and tone, and format messages with Slack-native mrkdwn.

## Preferred Deliverables
## Related Skills

- Thread briefs that capture status, blockers, decisions, and owners.
- Channel-ready updates with clean mrkdwn and an explicit ask or next step.
- Reply drafts that match the tone and urgency of the thread.
| Workflow | Skill |
| --- | --- |
| Message composition, rewrites, drafts, and canvas-writing workflows | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) |
| Bounded channel recaps and thematic Slack summaries | [../slack-channel-summarization/SKILL.md](../slack-channel-summarization/SKILL.md) |
| Daily digests across selected channels or topics | [../slack-daily-digest/SKILL.md](../slack-daily-digest/SKILL.md) |
| Find messages that likely need a response and prepare reply drafts | [../slack-reply-drafting/SKILL.md](../slack-reply-drafting/SKILL.md) |
| Triage for what the user needs to read, reply to, or do next | [../slack-notification-triage/SKILL.md](../slack-notification-triage/SKILL.md) |

## Workflow
## Reference Notes

1. Read the channel or thread before drafting. Capture who is involved, the latest status, unresolved questions, owners, and any links or code snippets that should be preserved.
2. Summarize the thread before writing when the conversation is long or the user asks for a response strategy first.
3. Draft messages in Slack-native mrkdwn. Use concise blocks, clear lists, clean code fences, and deliberate mentions.
4. If the user asks for a reply but does not explicitly ask to post, default to a draft.
5. If the request is ambiguous, present a proposed message and explain who it is aimed at and what it is trying to accomplish.
6. Only post to a channel or DM when the user has explicitly asked for the message to be sent.
| Task | Reference |
| --- | --- |
| Slack mrkdwn formatting rules and examples | [references/mrkdwn.md](./references/mrkdwn.md) |

## Support Checks

- Confirm the requested action is supported before asking the user for more input. If Slack does not support the action, say so immediately and offer the closest supported path instead of collecting unnecessary details.
- For broad Slack analysis requests, fail fast if the connector cannot establish the needed coverage or signals reliably. Do not invent channel names, imply the user is in a channel, or present workspace-wide conclusions as authoritative. Ask for a candidate list, a narrower scope, or a question that can be answered from specific channels, threads, profiles, or search results.

## DM Routing

- When the same message is meant for multiple specific people, first look for an existing group DM with the right people and prefer that over duplicate one-to-one DMs.
- If there is no suitable group DM, do not silently fan out separate DMs. Ask whether the user wants individual DMs instead, or ask them to create the group DM if that is the better path and the connector cannot create it.

## Write Safety

Expand Down
Loading