• v0.14.0 3aad57d0f6

    v0.14.0 — verb-first tool names for mail
    All checks were successful
    CI / gate (push) Successful in 1m17s
    CI / image (push) Successful in 49s
    Stable

    joeyr released this 2026-08-12 12:12:28 -05:00 | 56 commits to main since this release

    Mail's tool names now follow the same verb-first convention the calendar settled on in
    0.10.1.
    Three renames, no behaviour change:

    Was Now
    mark_read update_message_read
    mark_unread update_message_unread
    flag_message update_message_flag

    Breaking in the one way that matters day to day: Claude's per-tool permission toggles
    are keyed to tool names, so the three reset to defaults and have to be set back to ask.
    That cost is why this shipped as its own release rather than riding along with the next
    change — and why the remaining names were left alone rather than churned again later.

    Changed

    • mark_ and flag_ were the strays. The connector lists tools alphabetically, so the
      prefix is the only lever on how they group for the reader. Mail's eleven now sort into
      delete_, get_ ×3, list_ ×2, move_, search_, update_ ×3, and the three write
      tools that change a message's state sit together instead of scattering across the list.

    • The client methods were renamed to matchICloudMailClient.update_message_read and
      .update_message_flag. Deliberate: grepping a tool name off a connector screenshot should
      land on the implementation, and it did not before.

    • A test now pins the convention rather than leaving it to review. mark_read was named
      in a release that also renamed the calendar's strays for exactly this reason, which is
      what a convention with no test looks like.

    Notes

    • mark_read/mark_unread stayed two tools rather than collapsing into one
      update_message(read=…).
      Uniformity argued for the collapse; the split survives because
      a boolean is what a model passes backwards, and update_message(read=false) reads correct
      while doing the opposite. The uniformity was available without paying that.

    • move_message and search_messages keep their own verbs. Folding the move into
      update_message would give one tool two return contracts — passing a destination returns
      a new message_id and the flag arguments do not — and folding search into list_messages
      would erase the distinction that tells a model it forgot a search term. Both were
      considered and rejected on those grounds rather than on taste.

    Downloads