Skills now ship with the app under /apps/skills/ (sibling of /apps/x).
Forge bundles the directory into Resources/skills/; main resolves it via
process.resourcesPath in production and a workspace-relative path in dev,
then registers it in the DI container. The runtime reads SKILL.md files
directly from the bundle — no copy to ~/.rowboat/skills/, no GitHub
tarball sync.
Drop the override layer (FSSkillsRepo, SkillOverride, edit/diff UI,
skill-update notification) since skills are now read-only and only ship
with app updates. Resolver simplifies to a single source.
Add a placeholder substitution layer so skills that need live data
(currently `tracks`, with {{TRACK_BLOCK_SCHEMA}}) keep dynamic content
without depending on TS-module evaluation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.6 KiB
| name | description | license | compatibility | metadata | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| slack | Send Slack messages, view channel history, search conversations, find users, and manage team communication. Use when the user wants to interact with Slack. | MIT | Designed for Rowboat desktop app |
|
Slack Integration Skill (agent-slack CLI)
You interact with Slack by running agent-slack commands through `executeCommand`.
1. Check Connection
Before any Slack operation, read `~/.rowboat/config/slack.json`. If `enabled` is `false` or the `workspaces` array is empty, simply tell the user: "Slack is not enabled. You can enable it in the Connectors settings." Do not attempt any agent-slack commands.
If enabled, use the workspace URLs from the config for all commands.
2. Core Commands
Messages
| Action | Command |
|---|---|
| List recent messages | `agent-slack message list "#channel-name" --limit 25` |
| List thread replies | `agent-slack message list "#channel" --thread-ts 1234567890.123456` |
| Get a single message | `agent-slack message get "https://team.slack.com/archives/C.../p..."` |
| Send a message | `agent-slack message send "#channel-name" "Hello team!"` |
| Reply in thread | `agent-slack message send "#channel-name" "Reply text" --thread-ts 1234567890.123456` |
| Edit a message | `agent-slack message edit "#channel-name" --ts 1234567890.123456 "Updated text"` |
| Delete a message | `agent-slack message delete "#channel-name" --ts 1234567890.123456` |
Targets can be:
- A full Slack URL: `https://team.slack.com/archives/C01234567/p1234567890123456`
- A channel name: `"#general"` or `"general"`
- A channel ID: `C01234567`
Reactions
``` agent-slack message react add "" --ts agent-slack message react remove "" --ts ```
Search
``` agent-slack search messages "query text" --limit 20 agent-slack search messages "query" --channel "#channel-name" --user "@username" agent-slack search messages "query" --after 2025-01-01 --before 2025-02-01 agent-slack search files "query" --limit 10 ```
Channels
``` agent-slack channel new --name "project-x" --workspace https://team.slack.com agent-slack channel new --name "secret-project" --private agent-slack channel invite --channel "#project-x" --users "@alice,@bob" ```
Users
``` agent-slack user list --limit 200 agent-slack user get "@username" agent-slack user get U01234567 ```
Canvases
``` agent-slack canvas get "https://team.slack.com/docs/F01234567" agent-slack canvas get F01234567 --workspace https://team.slack.com ```
3. Multi-Workspace
Important: The user has chosen which workspaces to use. Before your first Slack operation, read `~/.rowboat/config/slack.json` to see the selected workspaces. Only interact with workspaces listed in that config — ignore any other authenticated workspaces.
If the selected workspace list contains multiple entries, use `--workspace ` to disambiguate:
``` agent-slack message list "#general" --workspace https://team.slack.com ```
If only one workspace is selected, always use `--workspace` with its URL to avoid ambiguity with other authenticated workspaces.
4. Token Budget Control
Use `--limit` to control how many messages/results are returned. Use `--max-body-chars` or `--max-content-chars` to truncate long message bodies:
``` agent-slack message list "#channel" --limit 10 agent-slack search messages "query" --limit 5 --max-content-chars 2000 ```
5. Discovering More Commands
For any command you're unsure about:
``` agent-slack --help agent-slack message --help agent-slack search --help agent-slack channel --help ```
Best Practices
- Always show drafts before sending — Never send Slack messages without user confirmation
- Summarize, don't dump — When showing channel history, summarize the key points rather than pasting everything
- Prefer Slack URLs — When referring to messages, use Slack URLs over raw channel names when available
- Use --limit — Always set reasonable limits to keep output concise and token-efficient
- Resolve user IDs — Messages contain raw user IDs like `U078AHJP341`. Resolve them to real names before presenting to the user. Batch all lookups into a single `executeCommand` call using `;` separators, e.g. `agent-slack user get U078AHJP341 --workspace ... ; agent-slack user get U090UEZCEQ0 --workspace ...`
- Cross-reference with knowledge base — Check if mentioned people have notes in the knowledge base