Respond to slack thread
Skill warpdotdev/client-release-agent-oss/.warp/skills/respond-to-slack-thread
Warp agent skills for release engineering automation — cherry-picking fixes, cutting release candidates, tracking PR status, and posting Sentry/Slack digests.
npx -y skills add warpdotdev/client-release-agent-oss --skill respond-to-slack-threadAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 29 days oldThe repository was created 29 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Post a reply to a Slack thread. Use when the user asks to reply to, respond to, or follow up on a Slack thread. Handles fetching thread context and posting a reply.
SKILL.md
4.1 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
respond-to-slack-thread
Post a reply to an existing Slack thread. Requires $SLACK_BOT_TOKEN with channels:history, channels:read, and chat:write OAuth scopes.
Step 1: Clarify inputs
Before proceeding, ensure you have:
- Channel ID: The Slack channel ID (e.g.
C0123456789). If the user gave a channel name, resolve it in Step 2. - Thread timestamp (
thread_ts): Thetsof the parent message (e.g.1234567890.123456).- If the user provided a Slack message link (e.g.
https://yourworkspace.slack.com/archives/C0123456789/p1234567890123456), parse it:- Channel ID = the segment after
/archives/(e.g.C0123456789) thread_ts= thep-prefixed value at the end, with a decimal inserted 6 characters from the right (e.g.p1234567890123456→1234567890.123456)
- Channel ID = the segment after
- If the user provided a Slack message link (e.g.
- Reply content: What to say. If not provided, fetch the thread context (Step 3) and draft a reply based on it.
If $SLACK_BOT_TOKEN is not set, ask the user for it before proceeding.
Step 2: Resolve channel ID (if needed)
If you only have the channel name:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
"https://slack.com/api/conversations.list?types=public_channel,private_channel&limit=200" | \
jq -r '.channels[] | select(.name == "<channel_name>") | .id'
If the list is paginated, follow the response_metadata.next_cursor value.
Step 3: Fetch thread context
Read the existing thread to understand the conversation before composing a reply:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
"https://slack.com/api/conversations.replies?channel=<CHANNEL_ID>&ts=<THREAD_TS>" | \
jq '.messages[] | {user, ts, text, attachments}'
Review all messages to understand what has already been said before drafting your response.
Step 4: Resolve user info (if needed)
To @mention someone by email:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
"https://slack.com/api/users.lookupByEmail?email=<email>" | \
jq -r '.user.id'
Use the resulting ID as <@USER_ID> in the message text.
Step 5: Post the reply
curl -s -X POST \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
--data "{
\"channel\": \"<CHANNEL_ID>\",
\"thread_ts\": \"<THREAD_TS>\",
\"text\": \"<MESSAGE_TEXT>\"
}" \
"https://slack.com/api/chat.postMessage" | jq '{ok, ts, error}'
For multi-line messages, use $'...' ANSI-C quoting so \n is interpreted as real newlines:
MESSAGE=$'First line\n\nSecond line'
curl -s -X POST \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
--data "$(jq -n --arg channel "<CHANNEL_ID>" --arg thread_ts "<THREAD_TS>" --arg text "$MESSAGE" \
'{channel: $channel, thread_ts: $thread_ts, text: $text}')" \
"https://slack.com/api/chat.postMessage" | jq '{ok, ts, error}'
Slack mrkdwn formatting
Slack uses its own mrkdwn syntax — do NOT use standard Markdown:
| Intent | Slack mrkdwn |
|---|---|
| @mention user | <@USER_ID> |
| Hyperlink | <https://example.com|link text> |
| Bold | *bold* |
| Italic | _italic_ |
| Strikethrough | ~strikethrough~ |
| Code (inline) | `code` |
| Code block | ```code block``` |
Step 6: Confirm
After posting, share the reply's permalink with the user:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
"https://slack.com/api/chat.getPermalink?channel=<CHANNEL_ID>&message_ts=<REPLY_TS>" | \
jq -r '.permalink'
Notes
- If the API returns
ok: false, check theerrorfield and handle it — common errors includenot_in_channel(bot must be invited to the channel) andmissing_scope(token lacks required permissions). - To post as the bot's configured name/icon rather than a user, ensure the token is a bot token (starts with
xoxb-). - If
thread_tsis omitted, the message posts as a new top-level message rather than a reply.