agent-team-mail is the retained ATM CLI and daemon-backed runtime for local
ATM mailbox workflows.
Website: https://randlee.github.io/atm-core/
This repository is now the source of truth for publishing:
agent-team-mailagent-team-mail-core
The current Phase AI branch candidate is 1.4.0-beta-ai; its CLI and
daemon must be switched and run as a matching pair for branch smoke evidence.
Run that evidence only through the canonical just smoke command surface.
The installed command remains atm.
The retained release scope is the atm CLI plus the accepted same-host
daemon/SQLite runtime it bootstraps and talks to:
agent-team-mail— theatmCLI entrypointagent-team-mail-core— shared semantic and boundary codeatm-daemon— the retained same-host daemon runtime used bysend,read,ack, anddoctor
This release line continues to consume the published sc-observability family
for retained logging and health reporting:
sc-observabilitysc-observability-typessc-observability-otlp
This repo does not publish the retired Claude-compatibility runtime, MCP, TUI, or CI-monitor artifacts as part of the retained ATM surface.
Download the latest release from GitHub Releases.
Published archives:
| Platform | Archive |
|---|---|
| Linux (x86_64) | atm_<version>_x86_64-unknown-linux-gnu.tar.gz |
| Linux (arm64) | atm_<version>_aarch64-unknown-linux-gnu.tar.gz |
| macOS (Intel) | atm_<version>_x86_64-apple-darwin.tar.gz |
| macOS (Apple Silicon) | atm_<version>_aarch64-apple-darwin.tar.gz |
| Windows (x86_64) | atm_<version>_x86_64-pc-windows-msvc.zip |
Each archive contains a top-level directory named
atm_<version>_<target-triple>/, rather than placing binaries at the archive
root. For example, the arm64 Linux CLI is at
atm_1.4.6_aarch64-unknown-linux-gnu/bin/atm after extraction.
Extract the archive and place atm or atm.exe somewhere on your PATH.
brew tap randlee/tap
brew install randlee/tap/agent-team-mailcargo install agent-team-mailThe library crate is also published as:
cargo add agent-team-mail-corehermes-atm and atm-graft 1.4.2 are live on TestPyPI; publishing to
production PyPI is pending.
python -m pip install --upgrade \
--index-url https://test.pypi.org/simple \
--extra-index-url https://pypi.org/simple \
"hermes-atm==1.4.2" "atm-graft==1.4.2"For Hermes setup and verification, see the hermes-atm guide.
winget install randlee.agent-team-mailwinget is a new required 1.0 Windows channel rather than a historical
parity channel from the old repo. Public winget installability may lag by
1-2 days after release because Microsoft reviews new submissions and updates
before they become broadly visible.
git clone https://github.com/randlee/atm-core.git
cd atm-core
cargo install --path crates/atm --bin atmOn a Mac that builds or switches the local daemon, configure the Apple Development
certificate once: in Xcode open Settings → Accounts, add apple@randlee.com,
choose Manage Certificates, then create Apple Development. Install the
Apple WWDR G3 intermediate
and verify the identity is valid:
security find-identity -v -p codesigningjust build signs both atm and atm-daemon using that identity. The signer
selects the Apple Development certificate by its certificate team identifier,
not by any Mac hostname.
ATM runs against the accepted ATM home/runtime layout and persists retained mail state through the same-host daemon plus durable SQLite storage. Typical flows:
atm send teammate "Hello from ATM"
atm send teammate@other-team "Cross-team message"
atm send teammate "Please confirm" --requires-ackatm read
atm peek --all
atm read --pending-ack-onlyatm ack <message-id> "Acknowledged"
atm clearatm doctor
atm log snapshot --level warnatm teams
atm members my-team
atm teams add-member my-team teammate
atm teams backup my-team
atm teams restore my-team --from backup.tar.gz --dry-runRun atm --help or atm <command> --help for the full command surface.
The retained CLI includes:
sendreadackclearlogdoctorteamsmembers
The teams command also contains retained team-administration subcommands:
add-memberbackuprestore
ATM resolves runtime identity and team context from the current CLI/config surface and uses the accepted daemon/SQLite runtime for retained mail state.
ATM ships one default post-send path for successful atm send and atm ack:
the built-in atm internal-nudge command. Most teams do not need any
.atm.toml hook configuration.
Use [[atm.post_send_hooks]] only for an explicit local override or
compatibility helper:
[[atm.post_send_hooks]]
recipient = "team-lead"
command = ["scripts/atm-nudge.sh", "team-lead"]
[[atm.post_send_hooks]]
recipient = "arch-ctm"
command = ["scripts/atm-nudge.sh", "arch-ctm"]Behavior:
- If no matching external rule is configured, ATM falls back to the shipped
built-in
atm internal-nudgepath. - Each
[[atm.post_send_hooks]]rule binds onerecipientand onecommand. recipientmatches either one exact member name or*for all recipients.- Multiple matching rules all run, in config order.
- If
command[0]is path-like, ATM resolves it relative to the directory containing.atm.toml. - Bare executables like
bash,python3, ortmuxuse normalPATHresolution. - Recipient non-match is silent.
- ATM rejects retired
post_send_hook,post_send_hook_senders,post_send_hook_recipients, andpost_send_hook_memberskeys with migration guidance. - ATM sets
ATM_POST_SENDto a JSON payload with{from, to, sender, recipient, team, message_id, requires_ack}plus optionaltask_idwhen present. - The hook gets 5 seconds to complete.
- Hook stderr is suppressed. Hook stdout may optionally return one JSON object with
level,message, and optionalfieldsfor ATM to log. - For troubleshooting hook diagnostics, combine
--stderr-logswithATM_LOG=debugto surface debug-level hook results on stderr. - If the hook exits non-zero, fails to start, or times out,
atm sendstill succeeds and prints a warning.
Repo-local scripts/atm-nudge.sh / scripts/atm-nudge.py remain
compatibility-only helpers. They are not the shipped default.
Example ATM_POST_SEND payload:
{
"from": "team-lead@atm-dev",
"to": "arch-ctm@atm-dev",
"sender": "team-lead",
"recipient": "arch-ctm",
"team": "atm-dev",
"message_id": "01KWTMCQ418Q96BFRDTKGZMEAS",
"requires_ack": true
}Example tmux auto-nudge hook for a Codex pane:
#!/usr/bin/env bash
set -euo pipefail
readarray -t fields < <(python3 - <<'PY'
import json, os
payload = json.loads(os.environ["ATM_POST_SEND"])
print(payload["to"].split("@", 1)[0])
print(payload["to"].split("@", 1)[1])
PY
)
recipient="${fields[0]}"
team="${fields[1]}"
tmux send-keys -t "$recipient" "You have unread ATM messages. Run: atm read --team $team" EnterOptional structured hook result on stdout:
{"level":"debug","message":"arch-ctm nudged on pane %42","fields":{"pane_id":"%42"}}Useful docs in this repo:
Windows first-run prerequisites on a new machine:
- install Rust
1.94.1with the MSVC toolchain - install Visual Studio C++ build tools
- install
just(winget install Casey.Just) - ensure
pythonresolves onPATHfor repo scripts and helpers
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspaceWindows CI parity command:
$env:ATM_TEST_RECV_TIMEOUT_SECS="60"
cargo test --workspace --verbose