home / skills / wellapp-ai / well / slack-announce

slack-announce skill

/cursor-rules/skills/slack-announce

This skill helps you generate copy-ready Slack messages for PRs, hotfixes, deploys, and incidents to streamline team communication.

npx playbooks add skill wellapp-ai/well --skill slack-announce

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.4 KB
---
name: slack-announce
description: Generate formatted Slack messages for team communication
---

# Slack Announce Skill

Generate copy-ready Slack messages for various team announcements.

## When to Use
- Push PR mode: announce new PR
- Hotfix mode: urgent fix notification
- Deploy notifications
- Incident communication

## Phases

### Phase 1: Determine Message Type

Identify the type of announcement:

| Type | Context | Priority |
|------|---------|----------|
| `pr` | New PR created | Normal |
| `hotfix` | Urgent production fix | High |
| `deploy` | Deployment to environment | Normal |
| `incident` | Production issue | Critical |

### Phase 2: Gather Context

Collect required information based on type:

**For PR:**
- Feature name (from branch or PR title)
- PR URL
- Notion task URL
- Reviewer name and handle
- Domain name

**For Hotfix:**
- Issue description
- Affected systems
- PR URL (if applicable)
- Urgency level

**For Deploy:**
- Version/tag
- Environment (test/production)
- Key changes summary

### Phase 3: Select Emoji

**By message type:**

| Type | Primary Emoji | Secondary Emojis |
|------|---------------|------------------|
| pr (feat) | ๐Ÿš€ | ๐Ÿ“‹ ๐Ÿ”— ๐Ÿ‘€ |
| pr (fix) | ๐Ÿ”ง | ๐Ÿ“‹ ๐Ÿ”— ๐Ÿ‘€ |
| pr (chore) | ๐Ÿงน | ๐Ÿ“‹ ๐Ÿ”— ๐Ÿ‘€ |
| pr (docs) | ๐Ÿ“š | ๐Ÿ“‹ ๐Ÿ”— ๐Ÿ‘€ |
| pr (refactor) | โ™ป๏ธ | ๐Ÿ“‹ ๐Ÿ”— ๐Ÿ‘€ |
| hotfix | โš ๏ธ | ๐Ÿ”ฅ ๐Ÿšจ |
| deploy | โœ… | ๐ŸŽ‰ ๐Ÿ“ฆ |
| incident | ๐Ÿšจ | โš ๏ธ ๐Ÿ”ด |

### Phase 4: Generate Fun Closing

Select a closing that matches the **PR context**. Be human, be fun, be relevant.

#### By PR Type

**Features (feat):**
```
- "Feature flag? Where we're going, we don't need feature flags ๐Ÿš—"
- "Users asked, we delivered ๐Ÿ“ฆ"
- "Fresh code, hot off the keyboard! โŒจ๏ธ๐Ÿ”ฅ"
- "Time to make some bytes dance! ๐Ÿ’ƒ"
- "Let's gooooo! ๐ŸŽธ"
```

**Fixes (fix):**
```
- "Bug squashed. No insects were harmed ๐Ÿ›โœจ"
- "It's not a bug, it was an undocumented feature ๐Ÿ“"
- "Another bug bites the dust ๐ŸŽต"
- "Sleep well tonight, this one's fixed ๐Ÿ˜ด"
```

**Refactors (refactor):**
```
- "Same same, but different, but still same ๐Ÿ”„"
- "If it ain't broke... refactor it anyway โ™ป๏ธ"
- "Deleting code is my love language ๐Ÿ’•"
- "Less is more. Literally, we deleted stuff ๐Ÿ—‘๏ธ"
```

**Chores (chore):**
```
- "The unglamorous work that makes the magic happen โœจ"
- "Housekeeping complete, the codebase says thank you ๐Ÿ "
- "Ctrl+S, Ctrl+Ship! ๐Ÿšข"
- "Another day, another deploy (hopefully) ๐Ÿคž"
```

**Docs (docs):**
```
- "Future us will thank present us ๐Ÿ“š"
- "Documentation: because tribal knowledge doesn't scale ๐Ÿง "
- "README? More like READ-ME-PLEASE ๐Ÿ™"
```

#### By Domain (Contextual)

**Cursor Rules / AI Workflow:**
```
- "Teaching the AI new tricks! ๐ŸŽ“๐Ÿค–"
- "The machines are learning... from us, for once ๐Ÿง "
- "The rules now have rules about rules ๐Ÿคฏ"
- "25 skills walk into a codebase... ๐Ÿšถโ€โ™‚๏ธ"
- "Now with 100% more patine (it's French, we're fancy) ๐Ÿฅ"
```

**Tables / Data:**
```
- "Rows and columns, living in harmony ๐Ÿ“Š"
- "Data goes in, insights come out ๐Ÿ”ฎ"
```

**Auth / Security:**
```
- "Keeping the bad guys out since [current_year] ๐Ÿ”"
- "Trust no one. Except this PR. Trust this PR ๐Ÿค"
```

**Payments / Billing:**
```
- "Making money moves ๐Ÿ’ฐ"
- "Cha-ching! ๐Ÿ’ต"
```

#### Generic (Fallback)

```
- "Shipping it before my coffee gets cold โ˜•"
- "May the code review gods be merciful ๐Ÿ™"
- "Works on my machineโ„ข ๐Ÿ’ป"
- "One small commit for dev, one giant leap for the product ๐ŸŒ™"
```

#### Hotfixes (Serious but Human)

```
- "On it! ๐Ÿ”ฅ"
- "Fix incoming, hold tight! ๐Ÿƒโ€โ™‚๏ธ"
- "Crisis averted. Coffee break earned โ˜•"
- "The bat-signal was answered ๐Ÿฆ‡"
```

#### Selection Logic

1. First, try **domain-specific** closing if domain is detected
2. Then, try **type-specific** closing based on commit type
3. Fall back to **generic** if no match
4. **Rotate** - don't repeat the same closing twice in a row

### Phase 5: Format Message

**PR Template:**
```
[emoji] **[Feature Name]**

[Two-liner: what this does + why it matters]

๐Ÿ“‹ Notion: [notion-link]
๐Ÿ”— PR: [github-pr-link]
๐Ÿ‘€ Reviewer: @[handle] (auto-assigned from [domain])

[Fun closing]
```

**Hotfix Template:**
```
โš ๏ธ **HOTFIX: [Issue Title]**

๐Ÿ”ด **Impact:** [affected systems/users]
๐Ÿ”ง **Fix:** [brief description]

๐Ÿ”— PR: [github-pr-link]
๐Ÿ‘€ Reviewer: @[handle]

[Closing]
```

**Deploy Template:**
```
โœ… **Deployed to [Environment]**

๐Ÿ“ฆ Version: [tag/version]
๐Ÿ“ Changes:
- [bullet 1]
- [bullet 2]

๐ŸŽ‰ Ship it!
```

---

## Output

Present the formatted message in a copyable code block:

```
## Slack Message (copy-ready)

[Formatted message here - ready to paste into Slack]
```

---

## Slack MCP Integration (Optional)

If Slack MCP is configured, messages can be sent automatically.

### Phase 6: Send via Slack MCP

**Prerequisites:**
- Slack MCP server installed and configured
- Bot token with `chat:write` scope
- Channel ID for announcements

**Send message:**
```
Slack MCP:
  tool: send_message
  arguments:
    channel: "[CHANNEL_ID]"
    text: "[formatted message from Phase 5]"
```

**Fallback:** If Slack MCP not available, output copy-ready message for manual posting.

### Setup Instructions

See `setup` skill Phase 9 for Slack MCP installation.

---

## Integration

This skill is invoked by:
- `push-pr.mdc` - Phase 3.1 (Announce)
- `pr-threshold` - When threshold crossed (optional notification)
- `hotfix/SKILL.md` - Urgent notification
- Deploy scripts (future)

Overview

This skill generates copy-ready, formatted Slack messages for team announcements like PRs, hotfixes, deploys, and incidents. It streamlines message composition by selecting emojis, collecting context, and adding a human-friendly closing so posts are consistent and engaging. Use it to speed up communication and reduce manual formatting.

How this skill works

The skill inspects the announcement type (pr, hotfix, deploy, incident) and gathers required context such as feature name, PR URL, reviewer handle, version/tag, affected systems, and a short summary. It picks appropriate emojis, chooses a domain- and type-aware closing line, and applies a template for the final Slack message. Output is a copy-ready message or an optional payload to send via Slack MCP if configured.

When to use it

  • Announcing a new pull request and assigning reviewers
  • Notifying the team about an urgent hotfix in production
  • Communicating deployments to test or production environments
  • Reporting incidents and impacted systems to the team
  • Automating announcement posts from CI or automation pipelines

Best practices

  • Provide concise context: feature title, PR link, and brief why it matters
  • Include a Notion or task link when available to give reviewers background
  • Choose the correct announcement type to trigger proper emojis and priority
  • Rotate closing lines to keep messages fresh and avoid repetition
  • Use Slack MCP for automated posting only when tokens and channel IDs are securely stored

Example use cases

  • A developer opens a feature PR: generate a ๐Ÿš€ PR announcement with reviewer mention and Notion link
  • On a production bug, create a โš ๏ธ hotfix message with impact summary and PR link for rapid triage
  • After a successful release, post a โœ… deploy message listing version and key changes
  • When an incident is detected, broadcast a ๐Ÿšจ incident message outlining affected services and mitigation steps

FAQ

Can this skill post messages automatically to Slack?

Yes โ€” if Slack MCP is configured and a bot token plus channel ID are provided, the skill can send messages automatically. Otherwise it outputs a copy-ready message for manual posting.

How does the skill choose a fun closing line?

It first tries domain-specific closings, then type-specific ones, falls back to generic options, and rotates choices to avoid repeating the same closing twice in a row.