用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/OpenRouterLabs/ori-feature-catalog --skill slack-ask命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Attach ANY file to the current Slack thread — text or binary. A log, a diff, a CSV, a long answer as a snippet, and equally a PDF, a PNG, a zip, a sqlite db, a tarball: the bytes go up unchanged. TRIGGER when the user asks you to attach, upload, or send a file, or when an answer is too long or too structured to read as a message (a full log, a wide table, hundreds of lines of output) and a file reads better than a wall of text. Also TRIGGER when the user asks for something "as a file", "as a snippet", "as an attachment", or "upload that". Write the content to a file first with Bash, then attach it. This is NOT for charts (use slack-chart) or generated images (use slack-image) — those render and upload on their own. This is NOT for ordinary replies: a short answer belongs in the message, not in an attachment.
Move THIS conversation onto a fresh Slack thread, keeping the same agent session and everything it remembers. ONLY TRIGGER when the user EXPLICITLY asks to continue the current conversation somewhere else — e.g. "continue this in a new thread", "move this to a fresh thread", "same conversation, new thread", "this thread is too long, carry on in a new one". NEVER trigger on your own initiative. Never carry because a thread looks long, cluttered, or busy — if the user did not ask, keep replying where you are. This is NOT for starting separate work: if the user wants a NEW task in its own thread with a fresh start, that is the spawn-thread skill instead. Carrying MUTES the thread you are in, so doing it unasked strands whoever is talking to you.
Read Slack from the agent — thread replies, channel history, user lookup and mention resolution, and opening a DM. Channel and thread resolve env-first ($SLACK_CHANNEL_ID / $SLACK_THREAD_TS) with a --channel fallback, so you can usually omit them. TRIGGER when asked to fetch a thread or channel history, find someone's user id, resolve a mention, or DM someone. This skill does NOT post, edit, delete or react — your answer is just the text you write, and progress goes through the slack-status skill.
正在显示 SKILL.md
| name | slack-ask |
| description | Ask the person who asked a question, and wait for their answer. |
Posts a question with buttons into the Slack thread and blocks until someone answers. The answer is printed to stdout, so it can be read straight into a variable.
answer=$(bun features/slack/skills/slack-ask/scripts/index.ts \
"The 7 conflicting PRs can be rebased or closed. Which?" \
--choice rebase="Rebase them" \
--choice close="Close them")
--choice id=Label sets what the reader sees and what comes back. A bare --choice rebase uses the word as both.
Offer every option you can act on. The buttons are the only way to answer this call, and the route refuses an ask with none.
If someone wants something you did not list, they have to @-mention the bot with it. A plain thread reply from anyone other than the person who asked is dropped as chatter and reaches nobody. A mention does get through — but it arrives as a new message, which steers the run: this ask is abandoned and you are started again with what they said. So treat an unanswered blocker as a real possibility, not an edge case.
Use it for a decision that is genuinely not yours to make: an ambiguous request, a destructive step, a fork where both paths are defensible and expensive to undo.
Do not use it to check in, to confirm something you already know, or to hand back a plan. A question costs the reader an interruption — the whole point of the surface is that one message runs to completion.
Ask the moment you hit the blocker, not at the end. An answer that arrives after you have finished the wrong work is worth nothing.
id you offered.unanswered prints to stdout and exits 0 if nobody answers within fifteen minutes. Decide for yourself, carry on, and say in your reply what you assumed.Ask one question at a time. A second ask while one is open posts a second message, and the reader has no way to tell which one you are waiting on.