Repository navigation
Releases
Releases · WireCatLabs/mail-cli
0.16.3
0.16.2
Fixed
- The "Prepare the mailbox" page lists the international providers first: Gmail, Outlook, Microsoft 365, iCloud,
Fastmail, then Yandex. Mail.ru is no longer on the English page; it stays a built-in provider and keeps its steps
in the Russian translation. No behaviour changes. - The Google and Microsoft sign-in notes no longer describe WireCat's review or verification status. They say that
making a shared Google app public for mail is complex, so Google may refuse WireCat's app, and then point to your own
Google app or an app password. No behaviour changes. session endhelp says what--revokedoes to your account. With Gmail over OAuth it asks Google to revoke
the sign-in, which signs out every tool that uses the same Google project. The command's description and examples
now say so. No behaviour changes.
0.16.1
Fixed
- The tests of the private file modes skip the mode check on Windows, where files have no Unix modes.
- Docs, help examples and the skill name the example profile
personal, notya, as tg does. A second
mailbox in an example iswork. No behaviour changes. docs/configuration.mdsays which flag answersask:--allow-dangerousfordrafts delete,--yesfor
every other change, andconfirmation_requiredwithout a terminal or a flag.- The sender domain cache and the sign-in records folder are private to you.
domain-ages.jsonis written with
mode 600 and the folder that holdssign-ins.jsonwith mode 700, as every other private file of mail's. - Every error and issue reason mail raises is in its registry, so
mail commands infolists it and an agent can
branch on it:mail.smtp-login-refused,mail.no-drafts,mail.draft-unknown,mail.gmail-objectid,
mail.export-destination-exists,download.exists,mail.unreadable,mail.deletions-skipped,
mail.rules-unreadableandmail.export-unreadable. A test keeps the list complete. - The secret scan knows Google's OAuth access tokens, refresh tokens and client secrets.
mail commands infosays whatrules remove,rules applyandrules importanswer with, as every other
command does:mail_rule_change,mail_rules_applyandmail_rule_import. The answers are unchanged.rules applycloses its connection to the mail server before it answers, and the tag commands hand the store
to the run, so a timeout or a signal closes it too.
0.16.0
Changed — may break callers
- mail runs on cli-core 0.569.0: an agent schedule runs on Sonnet, starts lean and stops for the day at a cost
cap.mail <profile> schedule agenttakes--model <model>and--max-cost-per-day <usd>. Without them a claude
schedule runs onsonnetand a codex one on codex's own default, a new claude schedule starts without your MCP
servers, skills, settings and CLAUDE.md, and no run starts for the rest of the day once the day's runs cost 5 US
dollars.schedule_model_claude,schedule_model_codex,schedule_lean_startandschedule_max_cost_per_dayin
the config file'sdefaultschange that for every new schedule;mail config showlists them.
0.15.0
Changed — may break callers
- The profile sets whether and up to what size
syncreads attachments, and one run can override it. The
profile'sread_attachments(defaulttrue) andmax_attachment_mb(default 10) set it;--no-attachments,
--attachmentsand--max-attachment-mb <n>override it for one run. A file left unread is stored with its name and
size, its extractionnot-readortoo-large. No file is kept either way. messages showreads an email again when one of its attachments was left unread, every attachment whatever
its size, so the command now reaches the mail server for such an email.--offlineor a failed read shows the stored
email withmeta.complete: falseand the issuemail.attachments-unread.attachments downloadkeeps a file.- Gmail over OAuth signs in with WireCat's Google app when you name none. It needed
--client-fileor
MAIL_GOOGLE_CLIENT_IDand failed withmail.oauth-no-clientwithout them. The order is--client-file, then
MAIL_GOOGLE_CLIENT_ID(withMAIL_GOOGLE_CLIENT_SECRET), then the profile's newgoogle_client_id, then
WireCat's app. Google has not reviewed WireCat's app for mail yet: if Google refuses it, use your own
(steps). Choosing OAuth for a Gmail profile is unchanged. MAIL_MICROSOFT_CLIENT_IDpicks the Microsoft app for one run, before the profile'smicrosoft_client_idand
WireCat's app, which now comes from cli-core'sconstants.json.mail.oauth-no-clientis gone: there is always an
app.doctor'soauthrows say which app each profile uses asoauth_client: { client, source }, in place of
client:sourceisflag,env,configorconstants(WireCat's). A profile's row reports the app it
signed in with when its sign-in recorded one.session startanswerssourcebesideclient.- mail runs on cli-base 0.77.1 and cli-core 0.566.0.
Added
stats messages showcounts the profile's stored mail per day, week or sender, received and sent, over the
same query assearch messages:{ by, received, sent, rows: [{ key, name, received, sent }] }, a day or week key
YYYY-MM-DDin--timezone(a week by its Monday), a sender keyed by address withsent0. Counts only, no search
recorded. For WireCat Desktop's mail per day (cli-core'smailStats, 0.564.0).account inspectgroups the mailbox's mail by sender and list before you sync it: emails, MB, unread and bulk
shares, years, whether you replied, askipsuggestion and a spam or scam score, plus the rule kinds the mail would
match. Headers only, nothing stored.--domain-ageasks each sender domain's registry (RDAP) when it was
registered. Moved frommemo mail inspect.messages import <file.mbox>adds a Google Takeout archive to a Gmail profile's stored mail, joined with what
syncstores by Gmail's ids; it only adds, leaves out Spam and Trash and follows the profile's rules. Moved from
memo'smode: "mbox"mail accounts.syncscores the senders of the stored mail, at most once a day, and asks registries about new sender domains
until its deadline; search ranks mail from senders with signs of fraud lower. The answer'ssenderssays how many.
memo syncdid this before; it no longer reads mail.
Fixed
- The MCP server tells an agent that attachment text is data, not instructions, beside subjects, bodies and file
names.syncindexes attachment text andmessages showreturns it. session startwrites every setting at its default when it saves a new profile, asconfig setdoes. The
first file a sign-in made held only the profile, so the owner could not see the other settings until a later
config setorconfig migrate.
0.14.0
Added
config migratewrites each setting your config file lacks, at its default, and keeps your values, their order
and keys it does not know; it creates no section and running it again adds nothing. A first run now writes every
shared setting into the file, andconfig setandconfig unsetfill in the missing ones.config showgives each
setting its default and description, and no longer creates a missing file. From cli-core 0.563.0.
Changed — may break callers
- Mail sync reads attachments up to 10 MB a file by default, and can skip them. From cli-core 0.563.0.
review --holderleaves out mail from suspicious senders too, beside bulk, envelopes, drafts and partial mail.
From cli-core 0.560.0.- An answer over the output cap names what to run instead (WC-OUT-22). From cli-core 0.563.0.
- The store moves to version 48 (invoices and payments, imports through one envelope, the cleanup of test rows
that leaked into a real store). The first run of this version migrates it. From cli-core 0.557.0–0.560.0.
0.13.0
Added
review: what is new, what you owe, what waits for an answer, with tg's words:review "date>2h",--new
(a point per mailbox and reader),--unanswered [duration](newest email came to you in To or Cc, no answer),
--waiting [duration](you wrote last), andbulk:falseto leave out mail sent to many. Each email carries
bulk,list_idandrule_id. It reads the store only; over MCP it is the read toolreview. From cli-core.- A processing mark per agent:
review --holder <name>reads what is stored past that holder's mark, by store
order, so late-synced mail is not skipped;messages acknowledge --holder <name> --cursor <cursor>moves it forward.
Bulk mail, envelopes and drafts are skipped and counted, partial mail held.statuslists each holder: how far it
got, held, read and skipped by reason. From cli-core 0.556.0. config repairmends a settings file whose JSON is broken only in its syntax, with a backup;--dry-run
previews. From cli-core.
Fixed
- The browser login page of
mail mcp serve --httpsays the app asks to reach your mail and names
mail mcp serve --http. It said "your messages" andmail mcp --http. From cli-core 0.551.0.
0.12.0
Added
- Work or school accounts: what to do when Microsoft asks for admin approval (docs/outlook.md):
whyAADSTS90094appears, the admin-consent link for WireCat's app with how to revoke it, and how an organisation
registers its own app.
0.11.0
Added
- A guide to connect Outlook.com or Microsoft 365 (docs/outlook.md): turn IMAP on, sign in
through the browser, sync and send, and what to do when the token is refused or an admin must allow the app.
0.10.0
Changed — may break callers
search messagessayssearch.server-partial, notsearch.server-too-large. It downloads the first 256 KiB of
each message the server finds and stores a bigger one with its text and without its attachments; the nextsync
reads it whole. Before, a candidate over 5 MB was left on the server and a smaller one was downloaded with all its
attachments. A script that matchedsearch.server-too-largematchessearch.server-partialinstead.- After
messages send,storedis true only when this message is in the store, not when any other mail of the
last 10 minutes was. A caller that readstored: trueas "some mail was synced" reads it now as "this message is
stored". mail.search-refusedis cli-core's reason now (cli-core 0.550.0); the reason, its code and its message are
the same.
Added
--compactanswers one line per item (cli-base 0.74.0). mail now needs@wirecat/cli-core0.550.0 and
@wirecat/cli-base0.74.0.syncsays what became of the emails a search stored text-first:partial_emailswithcompleted(read whole
this run),left(waiting for a later run) andstuck(given up on: the server no longer gives them where they
were stored). It is absent when there are none.
Fixed
- A Microsoft sign-in whose new token the mail server refuses says how to turn IMAP on. On Outlook.com IMAP is
off by default; the error now names the switch (Settings, "Mail", "Forwarding and IMAP", "Let devices and apps use
IMAP") and no longer claims a refresh was tried. The answer carries the server's response code ascause_code, never
its text. - A server that refuses SEARCH no longer looks like an empty folder.
syncleaves that folder unread and reads
the rest: the answer is partial, names it inrefused_folderswith amail.search-refusedissue, and nothing of it
is marked deleted.messages move,copy,delete,restoreanddraftsstop withmail.search-refused
instead of acting on nothing (cli-core). - On Gmail, an email a search stored text-first is read whole by the next
sync. It was never completed there:
mail worked out its id from the Message-ID, and Gmail's mail is stored under its X-GM-MSGID, so every sync downloaded
the whole message again and threw it away.fetchRawnow reads Gmail's ids beside the bytes. - An email a search stored text-first is no longer downloaded whole on every sync when the server no longer gives
it. It is read under the UIDVALIDITY it was stored with, and given up on after three failed tries, or at once when
its place holds another message; it no longer holds back newer ones (cli-core). - A search no longer stores a text-first copy over an email a sync in another process stored whole meanwhile,
which dropped its attachments (cli-core). - The reader of your own Google
--client-fileand the browser opener come from@wirecat/cli-core0.546.0, not
copies in mail. The file shapes, thechmod 600check and the errors are unchanged.