# Slack Formatter

> Copy markdown text to macOS clipboard as rich HTML + plain-text fallback, ready for Cmd+V into Slack with formatting (bold, lists, code blocks, headings) preserved. Use when the user asks to prepare, format, copy, or paste text for Slack, or when a drafted message with markdown formatting needs to go into Slack without losing structure.

- **Type:** Skill
- **Install:** `agentstack add skill-lexfrei-ccc-slack-formatter`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [lexfrei](https://agentstack.voostack.com/s/lexfrei)
- **Installs:** 0
- **Category:** [Communication](https://agentstack.voostack.com/c/communication)
- **Latest version:** 0.1.0
- **License:** BSD-3-Clause
- **Upstream author:** [lexfrei](https://github.com/lexfrei)
- **Source:** https://github.com/lexfrei/ccc/tree/master/skills/slack-formatter/skills/slack-formatter

## Install

```sh
agentstack add skill-lexfrei-ccc-slack-formatter
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

Convert markdown to rich text and place it in the macOS clipboard so the user can `Cmd+V` it into Slack with formatting preserved.

## When to invoke this skill

Trigger automatically when the user:

- asks to prepare/format text for Slack (any language: "для Slack", "paste to Slack", "send to Slack", "для слака", "put into pbcopy for Slack")
- has a drafted reply in markdown in the conversation and wants it copied to the clipboard for pasting somewhere that supports rich text
- explicitly asks to "put into pbcopy with formatting" / "copy as rich text"

Do **not** invoke when the user asks for plain text only (`tldrpr` already covers that case).

## Input resolution

Parse `$ARGUMENTS`:

1. If a file path is passed — use that file.
2. Otherwise — use the most recent drafted markdown content from the conversation context (a reply, message, summary). Write it to a temp file first:

   ```bash
   TMPFILE=$(mktemp -t slackfmt).md
   # write conversation-drafted markdown here via Write tool
   ```

If no draft is available and no path given — ask the user what text to format.

## Execution

Require `pandoc` (install via Homebrew if missing: `brew install pandoc`). Swift is already shipped with macOS.

Run this block, substituting `$MDFILE` with the resolved input path:

```bash
MDFILE="${1:?markdown file required}"
HTMLFILE="${MDFILE%.md}.html"

command -v pandoc >/dev/null || { echo "pandoc not found — brew install pandoc" >&2; exit 1; }

pandoc -f gfm -t html "$MDFILE" -o "$HTMLFILE" || exit 1

SWIFT_SCRIPT=$(mktemp -t slackfmt).swift
cat > "$SWIFT_SCRIPT" = 3 else {
    FileHandle.standardError.write("usage: pbcopy_html  \n".data(using: .utf8)!)
    exit(2)
}

guard let html = try? String(contentsOfFile: CommandLine.arguments[1], encoding: .utf8),
      let plain = try? String(contentsOfFile: CommandLine.arguments[2], encoding: .utf8) else {
    FileHandle.standardError.write("cannot read input files\n".data(using: .utf8)!)
    exit(1)
}

let pb = NSPasteboard.general
pb.clearContents()
pb.setString(html, forType: .html)
pb.setString(plain, forType: .string)
print("OK: html=\(html.count) bytes, plain=\(plain.count) bytes")
SWIFT

swift "$SWIFT_SCRIPT" "$HTMLFILE" "$MDFILE"
rm -f "$SWIFT_SCRIPT" "$HTMLFILE"
```

## Output

After successful copy, confirm to the user with:

- byte sizes reported by the Swift script
- one-line reminder: **"Paste in Slack with `Cmd+V` — do NOT use `Cmd+Shift+V` (that pastes plain text and drops formatting)."**

## Notes

- `pbpaste` will only show the plain-text fallback — this is normal. The HTML part is in the clipboard under `«class HTML»`, which is what Slack reads.
- Verify with `osascript -e 'clipboard info'` if the user reports pasting issues. Expected output includes both `«class HTML»` and `«class utf8»`.
- Slack normalizes HTML on paste: `##` headings become bold text, nested lists flatten in predictable ways, fenced code blocks keep monospace font, tables become tab-separated plain text.
- GFM input flavor (`-f gfm`) handles GitHub-style fenced code blocks with language hints and task lists correctly.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [lexfrei](https://github.com/lexfrei)
- **Source:** [lexfrei/ccc](https://github.com/lexfrei/ccc)
- **License:** BSD-3-Clause

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-lexfrei-ccc-slack-formatter
- Seller: https://agentstack.voostack.com/s/lexfrei
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
