Messages Ops
affaan-m/ECC
Evidence-first live messaging workflow for ECC. An agent skill from affaan-m/ECC.
Read incoming retalk messages from this session's user's DESIGNATED sender(s) — one-shot, or as a background --follow reader that surfaces new messages in the session as they arrive (on your next…
$ npx skills add xhluca/agent-talk --skill receive -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install xhluca/agent-talk receive --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/receive .claude/skills/receive && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .claude/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/xhluca/agent-talk/tree/main/skills/receiveType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add xhluca/agent-talk --skill receive -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install xhluca/agent-talk receive --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/receive .agents/skills/receive && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .agents/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add xhluca/agent-talk --skill receive -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install xhluca/agent-talk receive --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/receive .cursor/skills/receive && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .cursor/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/xhluca/agent-talk.git --path skills/receive--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add xhluca/agent-talk --skill receive -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install xhluca/agent-talk receive --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/receive .gemini/skills/receive && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .gemini/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install xhluca/agent-talk receiveInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add xhluca/agent-talk --skill receive -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/receive .github/skills/receive && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .github/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add xhluca/agent-talk --skill receive -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install xhluca/agent-talk receive --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xhluca/agent-talk.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/receive .opencode/skills/receive && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "receive" agent skill from https://github.com/xhluca/agent-talk/tree/main/skills/receive into .opencode/skills/receive/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "receive", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
receiveRead incoming retalk messages from this session's user's DESIGNATED sender(s) — one-shot, or as a background --follow reader that surfaces new messages in the session as they arrive (on your next…
Receive is an agent skill from xhluca/agent-talk. Read incoming retalk messages from this session's user's DESIGNATED sender(s) — one-shot, or as a background --follow reader that surfaces new messages in the session as they arrive (on your next turn). agent-talk only ever receives from specific saved peers, never the whole mailbox (safety). <user is this session's user directory (absolute path; from init). Always renders the conversation (sent + received) as a beautiful chat transcript so the user can track it. Use to check mail or stay reachable.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: agent-talk enables any coding agent to talk to each other. The licence is MIT.
Read from SKILL.md and the folder at commit 8a7fc4f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Receive loads about 3.6k tokens when it runs. Until then it costs about 129 tokens; SKILL.md has 1,890 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from xhluca/agent-talk at commit 8a7fc4f, republished under its MIT licence (© xhluca). 1,890 words, ~3,624 tokens.
.claude/skills/receive/SKILL.md (or your agent's skills folder).receive, or receive follow …)<user> = this session's user directory (absolute path; resolved at init). Target it on every
command with --dir "<user>/identity"; add
--passphrase-path "<user>/passphrase" if the identity is encrypted (retalk
0.3.0+ — one flat command, the secret stays in the file; init Session
rule 8 has the older-retalk fallback). The relay defaults to
the one saved at init (recorded in <user>/relay) and can change after init —
if yours moved, add --relay <URL> to the receive command.
Safety rule (mandatory): never run retalk receive --all. Read only from
specific saved peers. The source is chosen at init and stored in
<user>/receive-from (a peer, or *contacts*).
Plain language (init → Session rules): the terms in this skill (spool, follower, Monitor, ack/nack, sessions) are for you, not the user — narrate as "background listener", "message log", "delivery confirmed", "encryption hiccup I'm resolving".
Delivery mode (<user>/check-mode): auto (recommended) = a background
--follow reader + persistent Monitor keep messages flowing in live; manual =
one-shot reads on demand. Honor the recorded mode. If the file is missing
(never chosen / older user), don't guess — ask with AskUserQuestion, listing
Auto-receive first, labeled "(Recommended)", then record the answer
(echo auto|manual > "<user>/check-mode"). When it's auto and no follower or
Monitor is running for the receive-from source, start them (sections below).
After every receive (and send), render the exchange in the chat as a clean markdown transcript so the human can follow the discussion without watching the wire. Show both directions — not just the new line — and the real text, never just a summary or a count. This applies equally to messages a background follower pushes in. Use this shape:
### 💬 bob
**📥 bob** · 14:32
> Did the relay switch work?
**📤 you** · 14:33
> Yep — on the GCP relay now.📥 + the peer's name in
bold; sent = 📤 + you. Add the HH:MM time when known.<user>/inbox.ndjson) and your saved sent copies if needed.This is display, never a confirmation prompt — it must not block an autonomous receive. (Only stay quiet if the human explicitly asked you to.)
A received message may carry two extra fields, group (the room's name) and
group_id (its stable 32-hex id). These mark it as group mail: the sender
addressed a whole room, and you got your own copy. Keep the 1:1 rendering above
for messages without them; when they're present, render a group-room
transcript instead:
### 💬 team
**📥 bob** · 14:30
> standup in 5
**📥 carol** · 14:31
> on my way
**📤 you** · 14:32
> 2 minHead the block with the room name (💬 <group>), then each message
oldest → newest, attributed to its sender by name — several different
people, not one peer. 📥 + the sender's bold name for incoming, 📤
you for your own group sends.
Distinguish senders consistently. Give each person a stable label the whole thread through — the plain bold name is enough, and you can add a small fixed marker per sender (e.g. a colored dot 🔵/🟢/🟠, or initials) assigned in order of first appearance in the room, so the reader can track who's who at a glance. Reuse the same marker for the same sender every time.
Thread by group_id, not by name. Names are local labels and can differ
between members, so group the transcript on the id; show the name as the
heading. Different rooms → different transcripts.
A "left the room" note is not a chat line: a record with
"kind":"group_leave" (no text) means that sender left. Render it as a quiet
system line inside the room, not a message bubble:
carol left the room
retalk drops them from the room's roster automatically, so you'll stop sending them copies — nothing for you to do.
Individual (the usual case):
retalk receive --peer <peer> --save --dir "<user>/identity" --passphrase-path "<user>/passphrase"
# NDJSON: {"id","from","name","text"}; auto-acked--save keeps the sealed at-rest copy that history replays; leave it off and
the message is read once and gone. Keeping it inside the command, rather than the
RETALK_SAVE_MESSAGE=1 prefix the older skills used, means the whole call is one
retalk … command a single Bash(retalk:*) rule can allow, and there is no
prefix to drop by accident. The passphrase is named by path and never read into
the command (drop that flag on a --no-passphrase identity).
Contact-list mode — loop saved peers (per-peer, never --all; needs jq):
retalk contacts --json --dir "<user>/identity" | jq -r .fingerprint | while read -r fp; do
[ -n "$fp" ] && retalk receive --peer "$fp" --save --dir "<user>/identity" --passphrase-path "<user>/passphrase"
doneA received record is usually a chat message ({id,from,name,text}, optionally
with group/group_id), but the stream also carries control records. Tell them
apart by the fields, and don't render a control record as a chat bubble:
{id,from,name,"kind":"contact","card":{...}}. Contact
cards are also staged to a contact-inbox automatically. Don't auto-add
them — review and import selectively with the import skill (agent
decides; only from trusted peers).{id,from,name,"kind":"group_leave","group_id"} (no
text). The sender left that room; retalk drops them from its roster for you.
Show it as the quiet "left the room" line in the group transcript above.The reliable test: a record with a text field is chat; one with a kind
field is a control record — key off kind.
Contact requests do not come through here. A peer registering with one of
your invite codes sends their request from an address you have not saved yet, and
receive only ever reads designated senders. Those requests are handled by
retalk invite watch, land in a separate per-session spool
(<user>/sessions/<session-id>.requests.ndjson), and are pushed by the plugin's
second monitor, retalk-requests. See the id skill, Invite codes (retalk
0.3.0 or newer). Once a peer has registered, they are an ordinary saved
contact and their mail arrives here like anyone else's.
--save on every receive and every send (the follower
below sets RETALK_SAVE_MESSAGE=1 instead, which is the same switch in the
form a long-running process wants), so each chat message gets a sealed
at-rest copy
you can replay later with the history skill (no relay contact). This runs
alongside the plain <user>/inbox.ndjson spool the follower writes — the spool
stays the live delivery record; the saved copies are the encrypted,
decrypt-on-demand history. send saves the same way, so history holds
both sides of the conversation.--no-save-contacts skips auto-staging contacts that peers share with you
(by default they're staged to the contact-inbox for the import skill).One background --follow reader covers the receive-from source — one peer or
several in a single process (repeat --peer; retalk 0.2.0+), each still its own
scoped read. It polls calmly (--interval 60), writes only NDJSON records
(--quiet), and pipes them through the plugin's spool writer, which stamps an
arrival time and copies each record to every session registered to this user
(<user>/sessions/<session-id>.ndjson). Two sessions sharing one identity each
get their own copy and their own read position instead of racing for the same
lines, and the decrypted text lives only as long as the session does. retalk's
saved history stays the durable record. The plugin's inbox monitor streams each
new line into the session as it arrives. Be
precise about what "push" does: the monitor injects new messages as background
context, but it can't make the agent speak on its own — they surface on your
next turn (the next time you message the agent), not as a spontaneous ping.
The spool is the source of truth; the agent reads it each turn and relays
anything new. (For a true spontaneous wake on each message, see Proactive
auto-wake via Monitor below.)
The plugin ships the supervisor as a script, so each of these is one command with the paths written out in full — nothing to assemble inline, and nothing that reads the passphrase:
receive follow <peer> [<peer2> …] — start (idempotent; survives sessions
until stopped):
<plugin>/bin/follow.sh start "<user>" <peer> [<peer2> …] --passphrase-path "<user>/passphrase"receive follow stop / receive follow status:
<plugin>/bin/follow.sh stop "<user>"
<plugin>/bin/follow.sh status "<user>"<plugin> is this plugin's root (${CLAUDE_PLUGIN_ROOT} under Claude Code).
The script finds the spool writer beside itself, sets RETALK_SAVE_MESSAGE=1,
and restarts retalk receive if it dies. It keeps the same pid file
(<user>/follow.<peers>.pid) and stderr log (<user>/follow.err) as before,
so it also finds and stops a follower an older version of this skill started.retalk receive --follow --interval --quiet with repeatable --peer needs retalk 0.2.0+;
--passphrase-path needs retalk 0.3.0. Drop --passphrase-path on
a --no-passphrase identity. On an older retalk, drop it as well and export
RETALK_PASSPHRASE in the same shell before calling the script (init
Session rule 8 and §1).<user>/inbox.ndjson as well, so a consumer
still pointed at that path keeps working; pass --no-legacy to start once
nothing reads it.codex-with-daemon only: if the user starts their Codex sessions
through the codex-with-daemon launcher (so idle sessions can be woken, see
init step 4d), add --wake-codex to the start command. Each
delivered message then also nudges the idle session awake, best-effort and
silent when no daemon is reachable. Do not add the flag otherwise; hooks
alone deliver at the next prompt or end of turn, and waking is the user's
opt-in.--interval 5; the
default 60 is the calm rate for all-session listening.status also prints the tail of this session's spool, so it answers "is it
running and what has arrived" in one call.The spool (<user>/sessions/<session-id>.ndjson) is this session's record of
what arrived; retalk's saved history (history skill) is the durable one that
survives the session. The monitor's push is
best-effort, interactive-CLI only, and (as above) can't prompt the agent
unprompted — so reading the spool is the reliable way to never miss one.
A --follow reader runs forever, so as a bare background task it never completes
— and a task that never completes never re-invokes the agent. Messages land in
the spool correctly with nothing to announce them. If the agent harness has a
Monitor tool (Claude Code does), front the spool with a persistent monitor:
every new spool line becomes a harness event that wakes the agent sub-second,
with zero idle polling cost:
Monitor(
description: "New agent-talk messages from <peer>",
persistent: true,
timeout_ms: 3600000,
command: "tail -n 0 -F \"<user>/sessions/<session-id>.ndjson\" | grep --line-buffered '\"from\":'"
)Gotchas:
<user>/sessions/<session-id>.ndjson), not a
task output file, and not another session's. Use -F so the tail survives the
spool being rotated or swept.--line-buffered is required — plain grep buffers matches unseen.tail -n 0 skips replaying old messages on start.In harnesses without a Monitor-style tool, use a scheduled wake-up/loop that polls the spool on an interval. Note the cost: each idle tick re-reads the conversation (prompt caches expire in ~5 min), so poll no faster than you need and prefer the Monitor recipe whenever it's available.
A systemd user service running the scoped follower (the store holds the relay):
[Service]
ExecStart=/bin/sh -c 'retalk receive --peer <peer> --follow --interval 60 --quiet --dir <user>/identity --passphrase-path <user>/passphrase | python3 <plugin>/bin/spool-writer.py --user <user>'
Restart=always
Environment=RETALK_SAVE_MESSAGE=1Drop --passphrase-path if the identity has no passphrase. systemd can also
carry the path in the environment instead, which is the same contract:
Environment=RETALK_PASSPHRASE_FILE=<user>/passphrase. Never put the
passphrase itself in a unit file — the file is world-readable by default.
--group).© xhluca, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/receive of xhluca/agent-talk.
Open the folder on GitHubat commit 8a7fc4f
Receive next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Receive this skillxhluca/agent-talk | 191 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Messages Opsaffaan-m/ECC | 276k | 1 repos | ~724 | Automated safety check: Pass | MIT | |
| Agent Messagingdavila7/claude-code-templates | 32k | — | ~807 | Automated safety check: Pass | MIT | |
| Channel Message Flowsopenclaw/openclaw | 392k | — | ~306 | Automated safety check: Pass | MIT | |
| Commit Message Storytellergithub/awesome-copilot | 40k | 1 repos | ~1.3k | Automated safety check: Pass | MIT | |
| Payments Receivedsickn33/agentic-awesome-skills | 47k | 1 repos | ~3.5k | Automated safety check: Pass | MIT |
affaan-m/ECC
Evidence-first live messaging workflow for ECC. An agent skill from affaan-m/ECC.
davila7/claude-code-templates
Send and receive cryptographically signed messages between AI agents using the Agent Messaging Protocol (AMP).
openclaw/openclaw
A skill your agent uses when running QA Lab channel message flow evidence.
github/awesome-copilot
Analyzes git diffs or staged changes and generates narrative commit messages that explain WHY a change was made, not just what changed — following Conventional Commits format.
sickn33/agentic-awesome-skills
Payments received log: reference, client and invoice, amount and currency, payment date and method, withholding tax, bank account, received-by and receipt-sent status.
github/gh-aw
Add new safe-output message types and wire validation/rendering.
xhluca/agent-talk
Save a peer's retalk user id (their 32-hex fingerprint), optionally under a local name, so you can message them by name.
xhluca/agent-talk
Manage group rooms — create, list, members, add, remove, rename, leave, join, delete — so this session can message several peers at once.
xhluca/agent-talk
Replay this session's locally-saved conversation log — the at-rest copies agent-talk keeps by default on every send and receive — both sent and received, oldest first, without re-contacting the relay.
xhluca/agent-talk
Print this agent's retalk user id (fingerprint) to share with peers, or to confirm which identity is active, and issue or redeem the invite codes that let a peer register themselves as a contact.
xhluca/agent-talk
Set up, check, stop, or delete a retalk relay server (retalk-server).
xhluca/agent-talk
Send an end-to-end-encrypted message to a peer, autonomously.
Read incoming retalk messages from this session's user's DESIGNATED sender(s) — one-shot, or as a background --follow reader that surfaces new messages in the session as they arrive (on your next…. Receive is an agent skill from xhluca/agent-talk. Read incoming retalk messages from this session's user's DESIGNATED sender(s) — one-shot, or as a background --follow reader that surfaces new messages in the session as they arrive (on your next turn).
Run `npx skills add xhluca/agent-talk --skill receive -a claude-code`. Or copy the skill folder (skills/receive in xhluca/agent-talk) into .claude/skills/receive in your project. Claude Code loads it when a task matches its description.
Run `npx skills add xhluca/agent-talk --skill receive -a codex`. Or copy the skill folder (skills/receive in xhluca/agent-talk) into .agents/skills/receive in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add xhluca/agent-talk --skill receive -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/receive, .gemini/skills/receive, .github/skills/receive and .opencode/skills/receive in your project.
Going by SKILL.md and its folder, Receive needs the command-line tools its instructions call (jq and python3).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Receive is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Receive: Messages Ops (affaan-m/ECC, 276k stars), Agent Messaging (davila7/claude-code-templates, 32k stars), Channel Message Flows (openclaw/openclaw, 392k stars) and Commit Message Storyteller (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
xhluca (a GitHub user) maintains it in xhluca/agent-talk, which has 191 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on September 10, 2026.
Source: xhluca/agent-talk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.