详细分析 ▾
运行时依赖
版本
- Initial release of snail-mail: a "slow channel" inbox for non-urgent, notable, or decision-requiring operator messages. - Automatically creates and manages an inbox file for message storage. - Includes CLI for adding messages with priority, listing, marking read, archiving, and rendering in multiple formats. - Provides clear guidance on what types of events should be reported, how to prioritize, and how to write actionable entries. - Inbox integrates with heartbeat checks to surface only urgent messages proactively.
安装命令 点击复制
技能文档
A "slow channel" between you and your operator. Not every event deserves a ping. The inbox captures what matters and presents it beautifully when they're ready to look.
Setup
On first use, the inbox file is created automatically at {workspace}/inbox/messages.json.
当...时 到 写入 到 Inbox
Write an inbox entry when something is notable enough that your operator would want to know, but not urgent enough to interrupt them.
写入 当...时:
- Needs decision — something 仅 human 可以 resolve (payment, approval, policy)
- Abnormal — errors, failures, unexpected patterns, security events
- Interesting — notable engagement, media mentions, milestones, opportunities
- FYI — context might matter later 但是 needs 否 action 现在
做 不 写入 当...时:
- Routine 成功 ("cron ran fine", "heartbeat OK")
- Something 您 已经 told them 在...中 chat
- Trivial events 带有 否 lasting significance
- Duplicate 的 something 已经 在...中 inbox
Priority levels:
urgent— needs attention 在...内 hours (prefix title 带有[URGENT])important— 应该 see today (prefix title 带有[IMPORTANT])normal— whenever 它们 check (否 prefix)
Writing good entries:
- Title: Short, scannable. Include 谁 或 什么. ("@bigaccount (500K) mentioned us", 不 "Social media 事件")
- 消息: 1-3 sentences. 什么 happened, 为什么 matters, 什么 (如果 anything) needs 正在做. Include links/handles 当...时 relevant.
CLI Usage
# Add entry
node {skill}/scripts/inbox.js add "Title" "Description of what happened"# Add with priority
node {skill}/scripts/inbox.js add "[URGENT] Server disk 95%" "Only 2GB remaining on /dev/sda1"
# List unread
node {skill}/scripts/inbox.js list
# List all (including read)
node {skill}/scripts/inbox.js list all
# List archived
node {skill}/scripts/inbox.js list archived
# Mark one read
node {skill}/scripts/inbox.js read
# Mark all read
node {skill}/scripts/inbox.js read-all
# Archive one
node {skill}/scripts/inbox.js archive
# Archive all read
node {skill}/scripts/inbox.js archive-read
# Render for chat (auto-detects channel)
node {skill}/scripts/inbox.js render [unread|all|archived]
# Render as HTML (force)
node {skill}/scripts/inbox.js render --html
# Render as markdown (force)
node {skill}/scripts/inbox.js render --md
# Render as plain text (force)
node {skill}/scripts/inbox.js render --text
Presenting Inbox
When the operator asks to see their inbox (or says "inbox", "messages", "check inbox"), run:
node {skill}/scripts/inbox.js render [unread|all|archived] [--html|--md|--text]
Choose format based on channel:
- Telegram, webchat →
--html - Discord, Slack →
--md - SMS, plain →
--text
Send the output as your reply. Do not add commentary unless they ask.
Heartbeat Integration
During heartbeats, check for unread urgent/important items:
node {skill}/scripts/inbox.js list unread --json
If urgent items exist, surface them proactively. Otherwise stay quiet.
Storage
Messages stored in {workspace}/inbox/messages.json. Single-writer (the agent), so no locking needed. Writes use atomic rename (write .tmp → rename) to prevent corruption.
免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制