Mail, files, calendar and contacts for the ordner suite, from the shell — each protocol is a plugin

notes, tasks, photos and chat: four new protocol plugins #18

Merged emma.ordner.fyi
targeting main from feature/new-apps
Merged opened by and assigned to emma.ordner.fyi
targeting main from feature/new-apps

Adds the new apps to the CLI, per Philipp's 2026-10-22 request (chat first, plus photos, notes, tasks; meet/forms/booking noted below).

New protocols (same command shape as the four existing ones):

  • ordner notes — folders, list, get, create (--body-stdin), update, rm. Note/* under the vendor notes capability; live-verified create/read/update/destroy round trip on srv.ordner.fyi.
  • ordner tasks — lists, list (--all/--open, --due today|tomorrow|+Nd), add, done, reopen, rm, get. Task/set needs a taskListId, so the default list is resolved client-side (named Tasks, else the first); live-verified full round trip on srv.
  • ordner photos — albums, list (the library: Pictures minus Upload minus Albums, photoTaken sort), get, render (Photo/render JPEG, --size/--quality, --out or stdout), original (raw bytes). check tolerates an account that has never opened Photos (no library yet — that is what kept account add from accepting the account).
  • ordner chat — conversations, read, send (--reply-to), login, check. Chat is bearer-only by design (an app password reaches none, a delegated token opens none), so the account's secret is a token: a device-flow refresh token (RFC 8628 via chat login, auth rotates it on every use and a replay kills the family — the CLI stores each rotation as it happens, into the keychain or a 0600 tokenFile for headless machines) or a JWT access token minted elsewhere. The same device token reaches meet and forms; their verbs are a natural follow-up once this lands.

Tests: battery 122/122 on node 26; typecheck clean. Live on srv.ordner.fyi: notes and tasks full round trips (scratch data, cleaned up), photos/photos check canaries, chat refusal paths (bad JWT 401, bad refresh token, env-indirection refusal). NOT live-tested: the chat success path — the device flow needs a person to approve in a browser (ordner chat login prints the URL); booking is the forms-backed /book app, so it follows forms.

Generated SKILL.md regenerated and pinned (the shipped copy matches ordner skill --stdout).

Commits 0