Added
-
Added three remote backends alongside CardDAV: JMAP contacts, Microsoft Graph and Google People, each behind its own cargo feature (
jmap,msgraph,people).None of the three exposes a vCard, so cardamum synthesizes the document of record and re-projects it on write. JMAP converts through JSContact; Graph and People project field by field and stash server-side the properties that have no slot, so nothing is lost round-trip.
-
Added the
pimdirbackend: cardamum over a local pimdir store, the offline cache a sync engine fills.A card the sync listed but has not downloaded still lists, and reading it reports "body not fetched" rather than failing. Writes are staged for the next sync to push, and addressbooks come from the sync, so the collection verbs refuse here.
-
Added one protocol-specific command family per backend:
carddav,jmap,msgraph,peopleandvdir item.Each mirrors its protocol's own vocabulary and exposes what the shared API hides: ETags and preconditions, sync tokens,
changesanddeltaincremental sync, multiget, discovery, and the raw native payloads under--json. Each also carries an escape hatch for a request the commands do not model,carddav report raw,jmap request, andrequest <METHOD> <PATH>on Graph and People. -
Added the
configurecommand (aliaswizard), the-b/--backendflag selecting between the backends an account declares, and theaccount listandaccount checkreports.
Changed
-
Reworked the first run around automatic discovery, aligning it with Himalaya, Ortie, Comodoro and Carillon. Behaviour change.
One prompt takes an email address, a server URL or a local folder path, and its shape orients the setup. Discovery runs in parallel under an 8-second deadline and offers one entry per reachable service, picking one prompting only how to authenticate. The wizard tests the account, then writes it into the configuration file, appending an
[accounts.<name>]block when one is already there. It configures only what it can discover, and points at config.sample.toml otherwise.A missing configuration raises an offer rather than a gate, so the command carries on either way. A bare
cardamumshows the help when a configuration exists, and nothing prompts when stdin is not a terminal or--jsonis set. -
Renamed the remote backend from
webdavtocarddavacross the public surface: the cargo feature, the subcommand and the config block. Breaking. -
Renamed the shared commands to the singular
addressbookandcard, the plural forms staying as hidden aliases. Breaking. -
Replaced the positional addressbook id with a
-k/--addressbookflag across the shared API, falling back toaddressbook.defaulteverywhere exceptaddressbook delete, which stays explicit. Breaking. -
Changed
card createandcard updateto take their vCard as a trailing positional argument, a path, raw contents, or-for stdin, instead of the--fileflag. Breaking. -
Relicensed from AGPL-3.0-only to dual MIT OR Apache-2.0.
-
Replaced the io-addressbook aggregator with a product-owned cross-backend layer, and upgraded the whole Pimalaya dependency stack.
-
Bumped comfy-table to v8. The
table.presetoption keeps accepting the v7 spelling, and truncated cells now end with…rather than.... -
Replaced the docs/ folder with cairn/, following the Cairn convention.
Removed
- Removed
account configureand itseditalias: the wizard is the single way to generate an account, andaccount listandaccount checkcover inspection. Breaking.
Fixed
- Fixed a 404 against a CardDAV server whose discovery hands back a bare origin rather than the context root, as Fastmail does by serving contacts under
/dav/. The client now probes.well-known/carddavand follows its redirect before the principal walk. - Fixed the shared commands inventing collections and cards on the vdir backend:
card updateon an unknown id created the file,card createon an unknown addressbook created the collection, and an unknown addressbook listed as an empty table. Each fails by name now. - Fixed
card updatecreating a card on CardDAV when the given id does not exist, a WebDAVPUTbeing create-or-replace. The update now reads the card first and guards the write with its ETag; passing your own--if-matchskips that read. - Fixed
addressbook updatereporting success when the server changed nothing, and--description ""/--color ""doing nothing although the help documents""as the way to clear a property. - Fixed the Nix package shipping no manual pages and no shell completions, its install step passing the output directory where a command name was expected.