From release
File-based messaging between agents across any harness. Invoke this skill when you see "📬 unread in .agents/inbox", need to send or read agent messages, or set up an inbox. Triggers on "📬", ".agents/inbox", "agent inbox", "send message to agent", "check inbox", "agent message".
How this skill is triggered — by the user, by Claude, or both
Slash command
/release:agent-inboxThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
File-based messaging for agents across harnesses (Claude Code, Codex, Cursor, Gemini CLI, Warp, etc.). Just filesystem operations — `mkdir`, `cat`, `mv`.
File-based messaging for agents across harnesses (Claude Code, Codex, Cursor, Gemini CLI, Warp, etc.). Just filesystem operations — mkdir, cat, mv.
Pick a goal-oriented slug for yourself (see Self-naming), resolve the shared inbox root, then create your inbox:
if common_dir=$(git rev-parse --git-common-dir 2>/dev/null); then
case "$common_dir" in
/*) ;;
*) common_dir="$(git rev-parse --show-toplevel)/$common_dir" ;;
esac
inbox_root="$(dirname "$common_dir")/.agents/inbox"
else
inbox_root="$PWD/.agents/inbox"
fi
mkdir -p "$inbox_root/<your-slug>"/{new,tmp,archive}
Inside a git repo, this stores mail beside the repo's common git directory so every worktree in the clone sees the same inbox. Outside git, it falls back to the current directory's .agents/inbox/.
Write to tmp/, then mv to new/ (atomic — prevents partial reads). If the directory doesn't exist yet, create it with mkdir -p first.
mkdir -p "$inbox_root/recipient"/{new,tmp,archive}
cat > "$inbox_root/recipient/tmp/20260315T101500-auth-ready.md" << 'EOF'
---
from: my-agent
to: recipient
reply_to: ../my-agent/tmp/
timestamp: 2026-03-15T10:15:00Z
thread: auth-v2
---
Auth middleware rewrite is ready on `feat/auth-v2`.
EOF
mv "$inbox_root/recipient/tmp/20260315T101500-auth-ready.md" "$inbox_root/recipient/new/"
ls "$inbox_root/my-agent/new/"
cat "$inbox_root/my-agent/new/20260315T101500-auth-ready.md"
mv "$inbox_root/my-agent/new/20260315T101500-auth-ready.md" "$inbox_root/my-agent/archive/"
Read reply_to from the message frontmatter — it points to the sender's tmp/ directory. Write there, then mv to new/.
Old .agents/inbox/ trees use the same message format. Resolve the new inbox_root, then move each agent directory into it:
old_root=/path/to/worktree/.agents/inbox
mkdir -p "$inbox_root"
mv "$old_root"/* "$inbox_root"/
Leave the old .agents/ directory in place if that worktree still needs the non-git fallback; otherwise it can be removed after verifying the shared inbox has the expected agent directories.
When you first need an inbox and don't already have one, name yourself:
auth-rewrite, sidebar-focus, lume-validationinbox_root as shown in Setupmkdir -p "$inbox_root/<your-slug>"/{new,tmp,archive}from in all messagesGood names are goal-oriented, not role-oriented. Prefer fix-split-focus over agent-1 or debugger. If the conversation pivots significantly, keep your original name — identity stability matters more than perfect accuracy.
Tell each agent the other's inbox path, or let agents discover peers by listing $inbox_root/. Every message carries reply_to so the recipient can reply without prior setup.
Markdown with YAML frontmatter. Filename: <YYYYMMDDTHHMMSS>-<slug>.md
| Field | Required | Description |
|---|---|---|
from | yes | Sender's agent name |
to | yes | Recipient's agent name |
reply_to | yes | Sender's tmp/ dir, relative to recipient's inbox (e.g. ../sender/tmp/) |
timestamp | yes | ISO 8601 |
thread | no | Topic grouping (e.g. auth-v2) |
auth-update, review-needed, api-readytmp/ then mv to new/: atomic writes prevent partial readsnew/ to archive/scripts/check-inbox-hook.sh scans the repo-shared inbox root ($inbox_root/*/new/). Silent when empty — no configuration needed.
scripts/inbox-startup.sh prints a summary of unread messages when a session starts. Agent name comes from $CLAUDE_SESSION_NAME (falls back to orchestrator). Silent when empty, fast (<200ms).
Configure in settings.json:
{
"hooks": {
"SessionStart": [
{
"type": "command",
"command": "bash ~/.claude/skills/agent-inbox/scripts/inbox-startup.sh"
}
]
}
}
scripts/wake-parent.sh bridges async inbox messages to session lifecycle. After writing a reply to a parent's inbox, call it to wake the parent:
wake-parent.sh --surface <cmux-surface-ref> [--inbox-path <path>] [--agent <name>]
Behavior based on surface state:
claude -p session that reads the inboxNote: The spawned headless session uses
--dangerously-skip-permissionsbecause there is no human at the terminal to approve tool calls. This is the pragmatic approach for now — a future permissions profile or allowlist flag would be preferable.
Requires cmux. See cmux-orchestrator skill for the full Wake-on-Reply pattern.
npx claudepluginhub fairchild/dotclaude --plugin brainstorm-to-briefGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Dispatches multiple subagents concurrently for independent tasks without shared state. Use when facing 2+ unrelated failures or subsystems that can be investigated in parallel.