0.26.0
Added
- YouTube: add subscription listing and management plus playlist create, add, remove, and delete commands with least-privilege OAuth, dry-run support, structured output, and destructive-operation confirmation. (#767) — thanks @beezly.
- Calendar: add
unsubscribefor removing calendar-list entries anddelete-calendarfor deleting owned secondary calendars, with dry-run, confirmation, and structured output.
Fixed
- Contacts: remove the nonfunctional
contacts other deletecommand; the public People API has no delete operation for Other Contacts, and its copy-then-delete workaround reported success without removing the source. Existing invocations now return unknown-command usage. - Meet: return empty history and participant collections as JSON arrays, and make
participants --fail-emptycontrol the no-conference exit instead of misclassifying it as invalid usage. - MCP: validate typed tool calls against their closed schemas before command execution, rejecting unknown fields, wrong types, and missing required fields.
- CLI: classify malformed OAuth token imports as usage errors and missing Gmail tracking setup as configuration errors.
- CLI: classify invalid Docs batch IDs and incomplete Gmail filter definitions as usage errors with exit code 2.
- Docs: keep batch list/show, batch target validation, and batch end dry-runs read-only without creating state directories or lock files.
- Docs: persist successful split and individual batch submissions before reporting a missing response revision, preventing retries from submitting already-applied requests again.
- Gmail: make
watch statusread atomic watch state without creating state directories or lock files. - Gmail: make
watch serve --dry-runreturn a secret-free daemon plan without creating/locking/updating watch state, saving hook settings, creating clients, or opening a socket. - Backup: make status, verify, cat, and export use read-only repository setup and file-free dry-run plans, support pre-created empty repository directories, keep failed clones clean, disable Git credential prompts under
--no-input, redact credentials from Git errors, preserve clone failures instead of initializing a new repository, and give status/verify the existing--no-pullflags while retaining hidden compatibility for legacy write-only options. - Auth: make
auth manage --dry-runpreview the browser flow without touching the keyring or server, and fail fast when real execution uses--no-input. - Docs: make
docs cell-styletable, row, and column coordinates one-based like adjacent table commands, with negative table indexes counting from the end. - Docs: make positional
docs sedimage selectors deterministic by ordering anchored positioned images with document content and unanchored positioned images by object ID. - Docs: make addressed
docs sedsubstitutions honor nth-match flags, use UTF-16 document indices, and ignore table or table-of-contents preview text instead of producing invalid mutation ranges. - Docs: keep
docs sedformatting, footnote, break, and structural targets aligned when earlier image or text replacements change document length. - Docs: avoid overlapping deletes when a
docs sedaddressed range includes the final paragraph. - Docs: make
docs sedtable-cell substitutions use UTF-16 indices, honor nth-match flags, expand captures independently per wildcard cell, refetch before repeated same-cell expressions, and report the exact replacement count. - Docs: make
docs sedtable-creation placeholders use UTF-16 indices and share cell-fill Markdown range planning with table-cell replacement. - Docs: validate unaddressed
docs seddelete/insert/append regexes before fetching and keep their top-level paragraph selection and reverse mutation ordering consistent with addressed commands. - Auth: clarify that
auth importalways requires a refresh-token source and only optionally accepts a current access token plus expiry. - Calendar: make alias set/unset dry-runs preview config changes without writing
config.json. - Dry-run safety: keep Drive, Contacts, Slides thumbnail, backup plaintext, OAuth token, Gmail filter, Photos, and Photos Picker downloads/exports offline and prevent local file or secret output.
- Auth: make
auth credentials set --dry-runpreview credential and domain writes without opening the keyring or changing files, and validate every domain before storing credentials. - CLI: replace the stale hard-coded
--accountservice list with concise email, alias, and auto-selection guidance that applies across authenticated Google API commands. - Calendar: remove the dead
calendar appointmentscommand, which could only report an API limitation; existing invocations now return unknown-command usage, while the limitation remains documented. - Drive: preserve repeated folder placements in tree, inventory, and size summaries; reject cyclic folder graphs instead of collapsing paths or scanning indefinitely.
- Backup: bind configuration, legacy fallback, and home expansion to the selected runtime layout instead of process-global path state.
- Backup: require the exact Gmail message selection and run identity before reusing or promoting encrypted checkpoints, preventing stale same-count mailbox checkpoints from becoming the completed snapshot.
- Classroom: require an archived course before deletion with actionable lifecycle guidance, and prevent live tests from leaving consumer-account courses behind.
- Classroom: wait for course state changes to become readable before reporting success, so immediate archive-then-delete workflows do not fail on stale state.
- Forms: validate scale question bounds locally and document the Forms API's accepted minimum and maximum values.
- Groups and Calendar team: reject consumer accounts and stored user OAuth before Cloud Identity API calls, require an explicit account for identity-based direct-token/ADC searches, keep ADC precedence consistent across services, and provide recovery guidance for service-account, direct-token, and ADC auth.
- Gmail: bind watch state to the selected runtime state directory and serialize atomic updates across concurrent watch processes.
- Gmail: bind tracking configuration to the selected runtime state directory and preserve concurrent account updates with shared atomic locking.
- Gmail: bind tracking encryption and admin keys to the active runtime secret store instead of reopening the ambient keyring.
- Auth: avoid repeated macOS Keychain prompts during token export and auth listing by keeping exports read-only and stopping fallback reads after keyring timeouts. (#772) — thanks @lox.
- Gmail: add
--body-html-fileto draft create and update, including stdin support, for parity with send. (#774, #776) — thanks @TurboTheTurtle. - Zoom: bind credential metadata and encrypted secret/token storage to the selected runtime layout, with consistent alias canonicalization.
- Auth: bind temporary manual OAuth state to the selected runtime config directory and reject unsafe redirect state values before filesystem access.
- Auth: bind renamed-account alias, client, and default-account migration to the active runtime config store.
- Auth: bind OAuth client credential commands to the active runtime secret store instead of reopening the ambient keyring.
- Auth: bind Google API and OAuth flows to the active runtime credential and token repositories instead of reopening ambient config and keyring state.
- Auth: capture keyring backend, password, service, platform, D-Bus, terminal, and lock policy once per runtime instead of rereading ambient process state.
- Auth: bind service-account lookup, storage, listing, and legacy Keep fallback to the active runtime repository; bound raw legacy paths and treat case-insensitive same-principal Keep credentials as pure service-account auth.
- Time: honor the runtime-selected
default_timezoneintime now, Gmail timestamps, watch output, Calendar time, and generated email Date headers instead of reading ambient config. - Config: bind account and calendar alias management and resolution to the active runtime config store.
- Docs: document publishing personal External OAuth apps before authorization to avoid Google's seven-day Testing refresh-token expiry.