소스 정보
- 저장소
- vellum-ai/vellum-assistant
- 최근 소스 활동
- 2026년 6월 12일 18:05
- 감지된 SKILL.md 언어
- 영어
- 스타
- 1,091
- 포크
- 160
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SOC 직업 분류 기준
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/vellum-ai/vellum-assistant --skill slack명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
Use when the user wants to build, scaffold, ship, or edit a Vellum plugin that bundles multiple surfaces (hooks, tools, skills, and more) into one installable package.
Perform a one-time migration from memory v1, to memory v2, which was introduced in 0.8.0.
Migrate from ChatGPT, Claude, OpenClaw, Hermes, Manus, and other AI assistants into Vellum by inspecting their data exports, conversation archives, files, prompts, custom instructions, memory, saved memories, tools, GPTs, workflows, integrations, and relationships, then mapping as much as safely possible into Vellum primitives. Handles single-source and multi-source migrations with a unified, deduplicated inventory.
| name | slack |
| description | Read, send, and manage Slack messages via the Web API |
| compatibility | Designed for Vellum personal assistants |
| metadata | {"icon":"assets/icon.svg","emoji":"💬","vellum":{"category":"messaging","display-name":"Slack"}} |
You help users interact with their Slack workspace. All Slack operations use the Slack Web API directly via assistant oauth request --provider slack_channel -- there are no dedicated Slack tools. Use relative Slack API method paths such as /chat.postMessage; the provider supplies the Slack host.
Use these scripts to resolve Slack channel and user names to IDs. Results are cached locally so repeated lookups are free (no API calls).
| Command | Description |
|---|---|
bun skills/slack/scripts/slack-resolve.ts channel <name> | Resolve a channel name to its ID |
bun skills/slack/scripts/slack-resolve.ts user <name-or-email> | Resolve a user display name or email to their ID |
bun skills/slack/scripts/slack-resolve.ts channels [--refresh] | List all cached channels, or refresh the cache |
All scripts return JSON:
{ "ok": true, "data": { "id": "C...", "name": "general", ... } }{ "ok": false, "error": "..." }The cache is stored locally under $VELLUM_WORKSPACE_DIR/data/slack-skill/. On first use the script fetches all channels/users from Slack and caches them. Subsequent lookups read from the cache with no API calls. Pass --refresh to force a refresh.
Use assistant oauth request --provider slack_channel to call any Slack Web API method. Auth is handled transparently -- the provider injects the bot token automatically. Pass relative method paths; do not include a host.
General pattern:
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C123","text":"Hello world"}' \
/chat.postMessage --json
The model knows the full Slack API from training data. Refer to https://api.slack.com/methods for the complete list of available endpoints.
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C0123456789","text":"Hello from the assistant!"}' \
/chat.postMessage --json
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C0123456789","limit":20}' \
/conversations.history --json
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C0123456789","ts":"1716000000.000001"}' \
/conversations.replies --json
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C0123456789","timestamp":"1716000000.000001","name":"thumbsup"}' \
/reactions.add --json
assistant oauth request --provider slack_channel \
-X POST \
-d '{
"channel":"C0123456789",
"text":"Fallback text",
"blocks":[
{"type":"header","text":{"type":"plain_text","text":"Weekly Update"}},
{"type":"section","text":{"type":"mrkdwn","text":"*Project Alpha*: on track\n*Project Beta*: needs review"}}
]
}' \
/chat.postMessage --json
File uploads use a multi-step flow: get an upload URL, upload the file, then complete the upload.
# Step 1: Get an upload URL
assistant oauth request --provider slack_channel \
-X POST \
-d '{"filename":"notes.txt","length":42}' \
/files.getUploadURLExternal --json
# Step 2: Upload file content to the returned upload_url (use curl directly)
# Step 3: Complete the upload
assistant oauth request --provider slack_channel \
-X POST \
-d '{"files":[{"id":"FILE_ID","title":"Meeting Notes"}],"channel_id":"C0123456789"}' \
/files.completeUploadExternal --json
assistant oauth request --provider slack_channel \
"/search.messages?query=project+launch+in%3A%23general" --json
assistant oauth request --provider slack_channel \
-X POST \
-d '{"users":"U0123456789"}' \
/conversations.open --json
bun skills/slack/scripts/slack-resolve.ts channel general to get the channel ID.assistant oauth request --provider slack_channel with that ID for the actual operation (send, read, react, etc.).bun skills/slack/scripts/slack-resolve.ts user <name> to get the user ID, then conversations.open to get the DM channel ID, then chat.postMessage to send the message.When you need to send a DM or look up a Slack user by name, check contacts first to avoid redundant API calls:
Before calling the resolve script: Use contact_search with query: "<name>" and channel_type: "slack". If a matching contact has externalUserId (Slack user ID) and externalChatId (DM channel ID), skip the API lookups and use those IDs directly with chat.postMessage via assistant oauth request --provider slack_channel.
When contact_search returns notes for the recipient, use them to inform the message's tone, formality, and content. Contact notes capture relationship context and communication preferences that should shape how you write to this person.
After resolving via script: When you had to use slack-resolve.ts user or conversations.open to resolve a user, save the contact with contact_upsert so you can find them by name next time. External Slack IDs (user ID, DM channel ID) are cached automatically by the messaging layer and should not be passed through contact_upsert.
Channel privacy must be respected at all times:
is_private on each channel before sharing content elsewhereWhen responding to messages from Slack channels, replies should be threaded. Pass thread_ts to chat.postMessage to reply in a thread rather than posting a new top-level message:
assistant oauth request --provider slack_channel \
-X POST \
-d '{"channel":"C0123456789","text":"Replying in thread","thread_ts":"1716000000.000001"}' \
/chat.postMessage --json
Before making any Slack API calls, verify that Slack is connected. If not connected, load the slack-app-setup skill (skill_load with skill: "slack-app-setup") and follow its guided flow. Do NOT improvise setup instructions -- the slack-app-setup skill is the single source of truth. Slack uses Socket Mode and does not require redirect URLs or any OAuth flow.
If a Slack API call fails due to missing or invalid credentials -- for example, an error indicating that the token is missing or invalid -- do NOT attempt to fix the credentials manually. Instead, load the slack-app-setup skill (skill_load with skill: "slack-app-setup") and follow its guided flow to set up or reconnect Slack. Tell the user something like "Slack needs to be reconnected" and start the setup skill.
chat.postMessage with blocks via assistant oauth request --provider slack_channelassistant notifications send via bash is fine -- it lets the notification router pick the best channel