From fc3a91384ac281fb87ded5ca33a51f66c372fd4f Mon Sep 17 00:00:00 2001 From: mikael-lovqvists-claude-agent Date: Wed, 18 Mar 2026 03:46:56 +0000 Subject: [PATCH] Update docs to reflect stages 1-4 complete and working email reply Co-Authored-By: Claude Sonnet 4.6 --- README.md | 9 ++++----- plan.md | 21 +++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 5d7f748..2bf178d 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ > **Experimental** — this is a work in progress and the architecture is still evolving. An IMAP bridge that forwards emails from a trusted sender as prompts to a running -[Claude Code](https://claude.ai/code) instance. Send an email, get a response in -your terminal. +[Claude Code](https://claude.ai/code) instance, and sends replies back via email. ## How it works @@ -12,16 +11,17 @@ your terminal. 2. Filters by a configured sender address 3. Formats the email as a prompt and dispatches it to Claude Code via an external paste utility -4. Claude Code reads and responds in the terminal as normal +4. Claude Code processes the message and replies via the CCC `send-email` action ## Dependencies - [imapflow](https://imapflow.com/) — IMAP client - [mailparser](https://nodemailer.com/extras/mailparser/) — email parsing -- An external script to actually deliver the prompt to Claude Code's terminal window. +- An external script to deliver the prompt to Claude Code's terminal window. This tool has been tested with [claude-code-conduit](https://gitea.efforting.tech/mikael-lovqvists-claude-agent/claude-code-conduit) and a companion paste utility that targets the correct Konsole window via xdotool. + CCC also provides the `send-email` action used for replies. ## Configuration @@ -59,6 +59,5 @@ node mail-buddy.mjs falls back to 45s polling) - The paste mechanism steals window focus on every message; a cleaner PTY-based approach is planned -- No email reply capability yet — Claude can only respond in the terminal for now - Sender filtering is substring-based, not cryptographically verified (DKIM checking is planned) diff --git a/plan.md b/plan.md index ba372fd..106267d 100644 --- a/plan.md +++ b/plan.md @@ -29,21 +29,22 @@ For now, `allowed_sender` substring match is sufficient for exploration. Worth a ## Implementation Stages -### Stage 1 — Explore the message object (current) +### ✅ Stage 1 — Explore the message object Receive a message and `inspect()` the full imapflow msg object to understand what data is available (headers, body parts, envelope, flags, etc.). -### Stage 2 — Prompt construction -Parse the message into a well-formed prompt: sender, subject, body. Prefix with -instructions telling Claude to reply via the CCC `send-email` action. +### ✅ Stage 2 — Prompt construction +Parse the message into a well-formed prompt using `mailparser`. Use HTML body for +better encoding/structure fidelity. Instruct Claude to reply via CCC per +`email_protocol.md`. -### Stage 3 — CCC send-email action -Extend `claude-code-conduit` with a `send-email` action (SMTP). Claude calls it as -a tool with recipient, subject, and body. +### ✅ Stage 3 — CCC send-email action +`send-email` action already existed in `claude-code-conduit` with full SMTP, +permission store, and topic-based access control. Tested and working end-to-end. -### Stage 4 — Wire it together -Replace the `inspect()` call with `make_prompt` + `send_to_claude`. End-to-end flow: -email in → Claude processes → email out. +### ✅ Stage 4 — Wire it together +`make_prompt` + `send_to_claude` wired up. Full flow working: +email in → Claude processes → replies via CCC send-email → email out. ### Stage 5 — Adaptive polling High/low frequency mode: switch to fast polling (e.g. 10s) when a message arrives,