Releases: openclaw/gogcli
Releases · openclaw/gogcli
v0.19.0
0.19.0
Added
- Auth: store Google OAuth
client_secretvalues in the keyring by default while leaving only client metadata on disk; legacy plaintext credentials still read andauth credentials set --insecurepreserves the old write shape. (#596) - Auth: add
auth credentials set --expand-envfor strict environment placeholder expansion in OAuth client JSON. (#599) - Auth: let
auth importseed an initial access token and expiry, and round-trip cached access tokens through token export/import. (#598) - CLI: add XDG kind-aware config/data/state/cache paths with
GOG_HOME, per-kindGOG_*_DIRoverrides, and--homewhile preserving legacy auth/keyring/service-account reads. (#621, #622) — thanks @alexminza. - Docs: add explicit
--page-width,--page-height, and page margin flags todocs writeanddocs page-layout, keeping--pagelesswidth unchanged unless requested. (#629, #630) — thanks @sebsnyk.
Fixed
- People: fall back to token identity when
gog me/gog whoamihit a disabled People API on the OAuth client project. (#460, #461) - Docs: drop all-whitespace Markdown table header rows during Docs markdown writes, and rewrite same-document
#heading-sluglinks to native Google Docs heading links after Drive markdown import. (#632, #633) — thanks @sebsnyk. - Gmail: include attachment metadata in
gmail messages search --include-body --jsonresults. (#620) - Auth: let
auth service-account setread service account keys from stdin (--key=-or--key-stdin) or an environment variable (--key-env). (#600) - Auth: serialize file-keyring reads and writes with a shared lock so concurrent
gogprocesses cannot observe partial keyring entries or clobber multi-key token updates. (#597) - Release: verify the OpenClaw Homebrew tap checkout when checking
gogcliformula assets.
v0.18.0
0.18.0
Added
- Docs: add
VISION.mdwith project fit, discussion, and live-test merge guidance. - Calendar: add --with-zoom / --regenerate-zoom / --remove-zoom that create, regenerate, and remove Zoom meetings and attach the join URL + meeting ID + passcode to the Calendar event description. Google's Calendar API rejects conferenceData writes asserting
conferenceSolution.key.type="addOn"from non-Workspace-Marketplace OAuth clients, so the description-mode integration is the path that round-trips through Google's storage; trade-off is no native "Join with Zoom" conference card. (#589, #590) — thanks @alexisperumal and @mvanhorn. - Auth: add gog zoom auth setup / doctor for Zoom S2S OAuth credential storage. (#590) — thanks @mvanhorn.
- Drive: add
--action=resolve|reopentodrive comments replyand siblingdrive comments resolve|reopenverbs (alsodocs comments reopen) to post a reply that atomically flips the parent comment's resolved state via the Drive API'sReply.actionfield. Avoids the previous workaround ofdrive comments delete(which destroys review-thread context) for batch-resolving inline doc-review feedback. (#623) — thanks @sebsnyk. - Sheets: add
gog sheets batch-update <spreadsheetId> --data-json ...for updating multiple value ranges in one Sheets API request. Alias:batch. (#601) — thanks @Tsopic. - Docs: add
gog docs insert-page-break <docId> [--index N | --at-end] [--tab=STRING]to insert a Google Docs page break directly viaInsertPageBreakRequest— markdown has no native page-break construct, so this is the only path for multi-page deliverables. Aliases:page-break,pb. (#604) - Docs: add
gog docs page-layout <docId> [--layout=pageless|pages]to toggle the page layout of an existing Google Doc viaupdateDocumentStyleondocumentFormat.documentMode. Sibling to the existing--pagelessflag ondocs create/write/updatefor the case where the doc was created upstream (e.g. by Drive markdown conversion) without the desired layout. Defaults topageless. Aliases:set-page-layout,page-setup. (#593) - Docs: add
--heading-level N(1..6 shortcut) and--named-style NAME(full enum) togog docs formatso existing paragraphs can be promoted toHEADING_1..HEADING_6,TITLE,SUBTITLE, orNORMAL_TEXT. Both setparagraphStyle.namedStyleTypeon the existing UpdateParagraphStyle request and compose cleanly with--alignment/--line-spacing. (#605) - Sheets: add
gog sheets reorder-tab <spreadsheetId> --tab=<name|sheetId> --to=Nto move a tab to a specific 0-based position viaupdateSheetPropertieswith field maskindex.--tabaccepts a title or a numeric sheet ID;--to=0is force-sent so the leftmost target reaches the wire as"index":0. Aliases:move-tab,reorder-sheet,move-sheet. (#603) - Docs: add
gog docs insert-table <docId> --rows N --cols M [--index N | --at-end] [--values-json [[...]]] [--tab=STRING]to insert a native Google Docs table directly viaInsertTableRequest, bypassing the markdown writer.--values-jsontakes a JSON 2D string array whose dimensions must match--rowsx--cols. Empty--values-jsonproduces an empty table structure. (#602) - Docs:
gog docs write --replace --markdown --tab=<tab>now performs a whole-tab re-render — the targeted tab's existing body is wiped viaDeleteContentRangeand the markdown is re-rendered locally via the same DocsbatchUpdatepath used by--append --markdown, so other tabs are untouched. Previously this combination errored because Drive's markdown converter operates on entire documents only. (#595)
Fixed
- Docs: make generated command references ignore local keyring config so
make cistays clean across developer machines. - CLI: harden backup writes, config/credentials atomic saves, keyring write verification, line input buffering, disabled-API hints, JSON transform number handling, and untrusted-content wrapping after ClawPatch review.
- CLI: bound retry request replay buffering, recover failed async backup pushes, ignore global git commit signing in backup snapshots, and protect account manager OAuth redirects with CSRF checks.
- Release: update the Homebrew handoff to publish through
openclaw/tap. - Version:
gog --versionnow reports an informative fallback (for example,v0.17.0-dev) when built from source with plaingo buildinstead of returningdev. - Docs:
gog docs insertnow defaults to end-of-doc when--indexis omitted, instead of always inserting at position 1 (which silently reversed iterative inserts across multiple calls). Pass--index 1explicitly to keep the previous behaviour. (#606) - Docs:
docs write --append --markdownwith three or more markdown tables in a single render no longer drifts the per-table insertion offset by one character per table — the trailing punctuation of the paragraph immediately before the third (and any subsequent) table is preserved instead of being split into a standalone paragraph after the table. (#607) - Docs:
docs write --append --markdownnow expands inline markdown markers (**bold**,*italic*,`code`,[link](url)) inside table cells into character runs, matching the behaviour outside of tables — previously the markers rendered as literal characters because the table inserter bypassed the inline-formatting pass. (#608) - Docs: markdown empty-header table rows (e.g.
| | |) no longer collide with the separator detection — previouslydocs write --append --markdownswallowed both the empty header and the real|---|---|separator, leaving the last data row re-parsed as a literal pipe paragraph after the table. (#609) - Docs:
docs write --append --markdownno longer silently drops tables withinsert native table: table not found near index N. The native-table inserter's post-write search used a ±2 code-unit window, but the Docs API's actual table StartIndex can drift further (auto-newline + placeholder paragraph combine to a several-unit shift); the search now picks the closest forward Table element with matching dimensions and a small backward tolerance instead. Thedocs create --file --markdownpath was unaffected because it uses Drive's native markdown import end-to-end. (#592) — thanks @sebsnyk. - Docs:
docs write --append --markdownnow renders bullet lists as nativeBULLETparagraphs (viaCreateParagraphBullets) and fenced code blocks as a single contiguous shaded paragraph (joining lines with vertical-tab soft breaks). Previously bullets came through asNORMAL_TEXTparagraphs with a literal•glyph in the text run, and each code-block line became its own one-lineCourier Newparagraph with no paragraph-level background. (#594) — thanks @sebsnyk.
v0.17.0
0.17.0
Added
slides create-from-markdown: import slidey-flavored decks with per-slide YAML frontmatter (layout:,content:),## Notesspeaker notes, Font Awesome icon shortcodes, mermaid diagrams,::cols::/::col2::/::col3::/::right::columns, and::boxes::/::arrows::icon-row blocks. New flags:--fa-style,--mmdc,--strict,--keep-temp-images,--no-notes— thanks @njreid.- Calendar: add
calendar events --sort=start|end|summary|calendarand--order=asc|descso--alloutput can be returned chronologically across calendars instead of per-calendar API iteration order. Also documentsnowin the--from/--tohelp strings (already accepted bytimeparse) — the relative form agents need when planning "from now on" — thanks @gado-ships-it. - Calendar: add
calendar events --locationto include event locations in table output. Embedded newlines in the location string are collapsed so multi-line addresses still render on one row — thanks @gado-ships-it. - Auth: add
gog auth import --client --emailwith--refresh-token-stdin,--refresh-token-file, or--refresh-token-envfor non-interactive token import without exposing secrets in argv — thanks @jcarnegie. - Drive: add
drive share --notifyfor invite targets that require a Drive notification email. - Calendar: keep
calendar appointmentsas an explicit diagnostic because the Calendar API still rejectseventTypes=appointmentSchedule. (#329) - CLI: add nested
docs tabs ...andforms questions ...aliases for consistent sub-item command patterns while preserving existing flat commands. (#433) - Drive: add
drive audit sharing|userplus guardeddrive bulk remove-public|update-rolepermission operations with dry-run and confirmation support. (#336) - Drive: add
drive labels file list|apply|removealongside Drive Labels API v2 discovery. (#339) - Maps: add directions, distance matrix, geocode, and reverse-geocode commands alongside Places search/details. (#571)
- Photos: add read-only
photos list|search|get|downloadfor app-created Google Photos media. (#381)
Fixed
- CLI: make mutating dry-runs for contacts, Docs, Drive, Meet, and Slides stop before auth/API calls while still validating local inputs; harden live smoke tests for self-sharing, disabled Meet, Gmail filter labels, and forced batch deletes.
- CLI: make
drive upload,drive bulk remove-public/update-role,calendar subscribe,docs clear,slides create-from-markdown,slides insert-text,slides replace-text,auth tokens import, and Gmail tracking key rotation dry-runs use the standard parseable dry-run envelope without auth/API access. - CLI: keep additional Docs write/update/delete/format/find-replace, Drive mkdir/changes, Gmail label create/modify, and Slides add/delete/replace/update-notes dry-runs offline before auth/API calls.
- CLI: give destructive Classroom, Gmail, Keep, and Tasks dry-runs stable JSON operation names and structured request payloads instead of prose
opvalues with null requests. - CLI: keep Docs tab edits, Sheets tab deletes, Drive deletes, comment deletes, auth removals, Gmail delegate/watch removals, Classroom guardian deletes, and other-contact deletes dry-run parseable without auth/API access.
- CLI: make dry-runs for Gmail label edits, Sheets table deletes, Sheets banding/conditional clears, and Forms deletes stop before auth/API calls, and make Forms dry-runs validate choice, scale, quiz, and empty update inputs locally.
- CLI: make dry-runs for Calendar secondary calendars, Forms create/publish/watch/move, Gmail label delete, Sheets table append/clear, Sheets named-range edits, Apps Script create, and Slides template creation stay offline before auth/API calls.
- Calendar: keep
calendar create/update --dry-runwith--location-searchor--place-idoffline before Places API lookup while still validating the requested lookup. - CLI: make dry-runs for Admin group/user/org-unit edits, Contacts delete, Docs tab export, Drive tab download/share/unshare, and Gmail watch renew stay offline before auth/API calls; redact Admin user create passwords in dry-run output.
- Auth: keep fresh OAuth saves working even when old file-keyring token entries are unreadable, and clarify that
--services allmeans all user OAuth services while Workspace-only services use service accounts. - Auth: include Chat reaction scopes in
--services chatand keep the generated auth scope table freshness-tested. - Auth: keep the accounts manager bound to loopback addresses, generate callback URLs from the actual listener host, and avoid deleting renamed-account tokens before replacements are stored.
- Gmail: reject off-palette
gmail labels stylecolors locally instead of forwarding an opaque Gmail API error. - Drive: make
drive share --dry-runstop before permission creation for user and domain shares, including--notify. - Forms: make
forms create --descriptionapply the description with a follow-up batch update, and preserve zero-valued indexes informs move-question. - Analytics: show Analytics Admin/Data API enablement hints instead of an Admin SDK hint for GA API-disabled errors.
- Docs: make
docs find-replace --format markdownstrip inline and block Markdown markers while preserving nested bold/italic/code/link formatting in the inserted Google Doc content. (#586) — thanks @sebsnyk. - YouTube: preserve API-key authentication when wrapping requests with the retry transport, so public
youtube/ytreads no longer fail as unregistered callers. (#578) — thanks @adityarya24. - Docs: update OAuth success/accounts GitHub links to the
openclaw/gogclirepository. (#561)
v0.16.0
0.16.0
Added
- Admin: expand
admin users createwith GAM-style aliases, generated passwords, suspended/archived creation, recovery contact fields, and password hash metadata; addadmin users deletefor cleanup. - Admin: add
admin orgunitscommands to list, inspect, create, update, and delete Workspace organizational units. - Sites: add Drive-backed
sitescommands to list, search, inspect, and open New Google Sites. (#574) — thanks @thewilloftheshadow. - Analytics/Search Console: add GA4
analytics accounts|reportplus Search Console site, search analytics, and sitemap commands. (#402) — thanks @haresh-seenivasagan. - Gmail: add
gmail send --body-html-filefor sending HTML email bodies from files without shell command substitution. (#575) — thanks @toruvieI. - YouTube: add
youtube(aliasyt) command group for YouTube Data API v3 — list activities, videos, playlists, comment threads, and channels; API key via configyoutube_api_keyorGOG_YOUTUBE_API_KEY; OAuth for--minewithgog auth add ... --services youtube. (#313) — thanks @satputekuldip. - Forms: add quiz grading flags to
forms add-questionso choice and short-answer questions can set answer keys and point values when created. (#570) — thanks @dbernaltbn. - Calendar: resolve event locations through Places API with
--location-search/--place-id, storing the resolved Place ID in private extended properties. (#140 / #138) — thanks @salmonumbrella. - Drive: add
drive changesstart-token/list/watch/stop commands for incremental sync and webhook automation. (#335) - Drive: add
drive activity queryfor Drive Activity API v2 audit trails with item, folder, time, and action filters. (#337) - Meet: add
meet create/get/update/end/history/participantscommands for Google Meet meeting spaces and conference records. (#468) — thanks @regaw-leinad. - Forms: add
forms publishto publish/unpublish existing forms and return the responder URL for automated form creation flows. (#565 / #564) — thanks @bogdanovich.
Fixed
- Auth: make
auth service-account statusshowstored, a clear missing-key message, and the exact setup hint when no service-account key is configured. - Admin: retry the post-create state update so
admin users create --suspendedand--archivedremain reliable while the Admin SDK finishes provisioning the new user. - Calendar: make
calendar update --with-meetidempotent when an event already has conference data, add explicit--regenerate-meet, and showrecurringEventIdin plain event output. (#576 / #573) — thanks @alexisperumal and @NodeJSmith. - Release: fail closed when macOS signing secrets are missing and verify Darwin release assets are not ad-hoc signed, so Homebrew upgrades keep stable Keychain trust. (#569) — thanks @aaroneden.
- Auth: list one row per OAuth client when the same account is authorized under multiple clients, and let
auth list --clientfilter that token bucket. (#563) — thanks @UnPractical91. - Docs: clarify how to pass file-keyring environment into headless OpenClaw/systemd agent processes. (#566) — thanks @chsbusch-dot.
- Docs: avoid infinite loops when local Markdown parsing ends on Thai, CJK, emoji, or other multi-byte runes. (#560 / #559) — thanks @ninyawee.
- Agent skill: replace stale bundled
gogskill paths with the current docs and auth package locations. (#558 / #557) — thanks @WadydX. - CI: run the docs validation gate in GitHub Actions and the local
make citarget. (#562 / #561) — thanks @WadydX.
v0.15.0
0.15.0
Added
- Export exact Google API JSON when the normal CLI view is too lossy:
docs raw,sheets raw,slides raw,drive raw,gmail raw,calendar raw,people raw,contacts raw,tasks raw, andforms raw, with--pretty, safer Drive defaults, Sheets grid-data warnings, and a raw-output security audit. (#495, #496) — thanks @karbassi. - Audit Drive storage without changing files:
drive tree,drive du, anddrive inventorynow report folder contents, sizes, and inventory data for cleanup/review workflows. (#116) — thanks @rohan-patnaik. - Find duplicate contacts safely:
contacts dedupeis preview-only, matches by email/phone by default, supports opt-in name matching, and emits JSON/table merge plans without applying changes. (#116) — thanks @rohan-patnaik. - Read Gmail messages in agent-safe form:
gmail get --sanitize-content/--safeandgmail thread get --sanitize-contentreturn sanitized content without exposing raw Gmail payloads in JSON. (#238, #220) — thanks @urasmutlu. - Ship official container images: release tags now publish a non-root GHCR Docker image, with file-keyring docs for container automation. (#539, #444) — thanks @HuckOps and @rdehuyss.
- Request custom Drive fields:
drive ls --fieldsanddrive get --fieldspass Drive API field masks for data beyond the default JSON set. (#495) — thanks @karbassi. - Format Google Docs from the CLI:
docs formatand plain-textdocs writeformatting flags cover fonts, colors, bold/italic/underline/strikethrough, alignment, and line spacing. (#479) — thanks @mmaghsoodnia. - Manage Google Docs tabs:
docs add-tab,docs rename-tab,docs delete-tab, plus tab-scoped Markdown append and find-replace flows. (#547, #541) — thanks @chopenhauer and @donbowman. - Work with structured Google Sheets tables:
sheets tablelist/get/create/delete,sheets table append, and header-safesheets table clear. (#470) — thanks @Pedrohgv. - Format Sheets visually:
sheets conditional-formatandsheets bandingadd rule-based formatting and alternating color banded ranges. (#378) — thanks @codBang. - Add Meet links to existing calendar events with
calendar update --with-meet. (#538) — thanks @alexisperumal. - Move calendar events between calendars with
calendar move/calendar transfer, including organizer changes. (#448) — thanks @markusbkoch. - Export Gmail filters as Gmail WebUI-importable Atom XML, while keeping API JSON export via
--format json. (#174) — thanks @gwpl. - Build safer agent binaries with baked
agent-safe,readonly, andfullsafety profiles, fail-closed command filtering, filtered help/schema output, docs, and build tooling. (#366, #239) — thanks @drewburchfield. - Use gog from coding agents more safely with the bundled
gogskill for JSON-first Google Workspace automation. (#353, #451) — thanks @TimPietrusky and @sluramod.
Fixed
- Make full-mailbox backups survive large Gmail exports by promoting completed checkpoint shards into the final manifest and byte-splitting fallback message shards before GitHub rejects oversized blobs.
- Make backup exports more resumable and fault-tolerant by streaming decrypted shards, preserving Gmail Markdown mirrors, handling very large JSONL rows, and writing Markdown fallbacks for malformed MIME messages instead of aborting.
- Keep agent safety profiles harder to patch by compiling baked policies into generated hash switches instead of embedding raw allow/deny YAML strings. (#540) — thanks @drewburchfield.
- Show correct versions for
go install ...@tagbinaries by inferring module versions from Go build info when linker metadata is absent. (#545, #544) — thanks @joshavant. - Accept the documented
calendar events list/lsselector forms, including positional calendar IDs,--cal,--calendars, and--all. (#546) — thanks @BCudeOpenClaw. - Keep
docs find-replace --dry-runread-only while still reporting match counts, and allow empty replacement strings to delete matches safely. (#542) — thanks @chrismdp.
v0.14.0
0.14.0
Added
- Backup: add
gog backupwith age-encrypted Git shards, Gmail labels/raw message export, Calendar/Contacts/Tasks/Drive metadata adapters, manifest status, full decrypt-and-verify, shardcat, local plaintext export, docs, and security-focused regression coverage. - Backup: expand
gog backup push --services allwith Drive content export/download, Gmail settings, native Workspace Docs/Sheets/Slides/Form data, Apps Script projects, Chat, Classroom, best-effort optional service error shards, and plaintext Drive file export. - Backup: extend
--services allwith Drive permissions/comments/revisions, Calendar ACL/settings/colors, contact groups, Cloud Identity groups, Workspace Admin Directory users/groups/members, Keep notes, and local Gmail message caching for resumable full-mailbox fetches. - Backup: add
gog backup export --gmail-format markdownfor local readable Gmail mirrors with Markdown notes and extracted attachment files. - Gmail: add
gmail messages search --body-format htmlfor returning HTML message bodies when--include-bodyis used. (#520) — thanks @alexknowshtml. - Contacts: add
contacts exportfor vCard 4.0.vcfexports by resource, email/name search, or all contacts, including best-effort label categories. (#519, #500) — thanks @dinakars777. - Docs: add experimental
docs export --tab/drive download --tabto export a single Google Docs tab as PDF, DOCX, text, Markdown, or HTML. (#535) — thanks @johnbenjaminlewis. - Slides: add
slides insert-textandslides replace-textfor editing existing slide text elements and replacing template tokens. (#521) — thanks @chrissanchez-iops. - Drive: add
drive search --driveand--parentfor scoping search to a shared drive or folder. (#525) — thanks @LeanSheng. - Calendar: add
--start-timezone/--end-timezonetocalendar createandcalendar updatefor preserving named IANA event timezones when RFC3339 inputs only carry numeric offsets. (#422) - Contacts: include birthdays in
contacts listandcontacts searchtext and JSON output. (#441) - Auth: add
gog auth doctorto diagnose keyring backend/password drift, unreadable file-keyring tokens, and refresh-token failures such as Workspaceinvalid_rapt. (#377, #338) - Backup: bound individual Drive content exports with
--drive-content-timeoutso one stuck Google export records an encrypted error row instead of blocking the full backup. - Backup: add Gmail message-list checkpoints, streaming shard construction, and stderr progress counters so full-mailbox backups can resume cleanly after interruption without keeping every raw message in RAM.
- Backup: push encrypted incomplete Gmail checkpoint commits during long cached fetches so day-scale mailbox backups have offsite progress before the final manifest is committed.
- Backup: push Gmail checkpoint commits through a single ordered background queue so cached fetches continue while GitHub uploads run.
- Slides docs: document the Markdown structure accepted by
slides create-from-markdown. (#497) - Google API: expose a reusable authenticated HTTP client for commands that need custom HTTP policies. (#534) — thanks @johnbenjaminlewis.
Fixed
- Auth: keep
gog auth listandgog auth tokens listuseful when one file-keyring token cannot be decrypted; unreadable entries are now reported instead of aborting the whole listing. (#377) - Auth: time out Linux D-Bus keyring write operations and report when OAuth completed but saving the refresh token failed, so manual auth no longer looks like a stuck paste when token persistence is blocked. (#130)
- Auth: store Google OIDC
subclaims with OAuth tokens and migrate matching subject-keyed accounts when a Google email rename is reauthorized. (#504) - Gmail: build outbound
Dateheaders with the configured timezone so replies do not inherit a wrong host-local offset. (#514, #472) — thanks @dinakars777. - Gmail: auto-fill draft reply subjects from the original message when
gmail drafts create --reply-to-message-idomits--subject. (#488) — thanks @jbowerbir. - Gmail: fall back to the People profile name for primary-account
Fromheaders when Gmail send-as settings omit a display name. (#431) — thanks @moeedahmed. - Gmail: expose reply threading headers in default
gmail get --format metadataoutput and fail explicit reply targets that cannot provide aMessage-ID. (#528, #512) — thanks @solomonneas. - Gmail: apply Gmail system-label filters for searches like
in:spam is:unreadso thread, message, and batch message searches do not return read spam. (#449) - Gmail: preserve renewed watch expiration fields when a long-running
gmail watch serveprocess records push delivery state aftergmail watch renewruns separately. (#526) - Gmail: reuse the shared paginated list runner for thread and message search so
--all,--page, text, and JSON output stay consistent. - Gmail: clarify that
gmail batch deleteis permanent and point default-scope workflows atgmail trash. (#151) - Drive/Docs/Sheets/Slides: treat
--out -as stdout for downloads and exports instead of creating-/-.extfiles; reject--json --out -to keep byte streams parseable. (#286) - Docs: deprecate editing-command
--tab-idin favor of--tab, and resolve tab titles to canonical tab IDs before mutations. (#533) — thanks @johnbenjaminlewis. - Docs: convert Markdown formatting for
docs write --append --markdowninstead of appending raw Markdown syntax. (#530, #272) — thanks @eric-x-liu. - Docs: include available tab names when
docs cat --tab/ structure lookup cannot find the requested tab. (#532) — thanks @johnbenjaminlewis. - Docs: size remote Markdown images consistently for
docs write --replace --markdownby reusing the Docs image insertion path after Drive conversion, and return a clear error for local image paths that the Docs API cannot fetch directly. (#518) — thanks @vinothd-oai. - Drive: print large upload progress to stderr while keeping JSON output parseable. (#529)
- Drive: include
hasThumbnailandthumbnailLinkindrive ls,drive search, anddrive getJSON responses. (#486) — thanks @gtapps. - Drive: include
driveIdindrive ls,drive search, anddrive getfield masks so Shared Drive files can be identified in JSON output. (#524) — thanks @LeanSheng. - Calendar: display
calendar eventstimes and JSON local fields in the calendar timezone instead of preserving arbitrary event offsets. (#493) - Email tracking: add versioned tracking-key rotation so new pixels use the current key while old tracking ids keep decrypting through prior keys. (#293)
- Email tracking: deduplicate repeated pixel opens and cap recorded opens per IP per hour to reduce D1 abuse from replay or high-volume requests. (#294)
- Email tracking: add daily Worker retention cleanup for open rows older than 90 days and cap admin
/opensresponses at 500 rows. (#292) - Email tracking: make
gmail track setup --deployreusable with existing D1 databases and valid temporary Wrangler configs. - Backup: split Gmail checkpoint commits by row count and plaintext byte size so large messages stay below GitHub's blob limit.
- Secrets: time out macOS Keychain read/write/list operations with a clear recovery hint instead of hanging indefinitely when a permission prompt cannot surface. (#515, #513) — thanks @sardoru.
- Secrets: encode file-backend key names so stored tokens work on Windows, while still reading/removing legacy raw entries. (#527, #502) — thanks @solomonneas.
- CLI: show direct Google Cloud API enablement links and matching
auth add --services ...hints when Google returns API-not-enabled errors. - Install docs: document Windows release ZIP/PATH setup and clarify that source builds require the Go version declared in
go.mod, not Ubuntu 24.04's Go 1.22 package. (#157, #135) - Auth docs: clarify that consumer Gmail refresh tokens expire after 7 days when the OAuth app remains External + Testing, and that publishing the personal OAuth app is the long-lived-token path. (#121)
- CI: pin GitHub Actions workflow dependencies to immutable commit SHAs. (#288)
v0.13.0
0.13.0
Highlights
- Gmail: safer sending and richer message workflows, with no-send guardrails, forwarding, autoreplies, full-body search output, label styling, and better MIME/body handling. (#454, #482, #447, #457, #476, #477, #511) — thanks @veteranbv, @spencer-c-reed, @GodsBoy, @iskw9973, @shashankkr9, @yeager, and @dinakars777.
- Drive/Docs/Slides: smoother content round-trips with Markdown-to-Docs upload conversion, restored Markdown replace writes, rendered slide thumbnails, commenter sharing, and better Docs sed formatting. (#487, #501, #498, #443, #483) — thanks @johnbenjaminlewis, @twilsher, @gianpaj, @pavelzak, and @bill492.
- Sheets: chart management lands, including list/inspect/create/update/delete and a chart-range fix for sheet ID 0. (#434) — thanks @andybergon.
- Calendar: create secondary calendars and get more predictable timezone/day-bound behavior. (#455, #492, #509, #510) — thanks @alexknowshtml, @RaphaelRUzan, and @dinakars777.
- Auth and agent safety: credential cleanup, Google Ads auth, keyring namespace overrides, command denylists, and safer send-operation controls. (#473, #264, #463, #218, #173, #454) — thanks @yamagucci, @ufkhan97, @mkurz, @EricYangTL, @spookyuser, and @veteranbv.
Added
- Gmail: add
--gmail-no-send,GOG_GMAIL_NO_SEND,gmail_no_send, and per-accountconfig no-sendguards for blocking send operations. (#454) — thanks @veteranbv. - Gmail: add
gmail forward/gmail fwdto forward a message with optional note, verified send-as alias, and original attachments. (#482) — thanks @spencer-c-reed. - Gmail: add
gmail autoreplyto reply once to matching messages, label the thread for dedupe, and optionally archive/mark read. - Gmail: add
gmail messages search --fullto print complete message bodies instead of truncating text output. (#447) — thanks @GodsBoy. - Gmail: add
gmail labels styleto update user label colors and list/message visibility. (#457) — thanks @iskw9973. - Drive: convert Markdown uploads to Google Docs and strip leading YAML frontmatter by default, with
--keep-frontmatterto opt out. (#487) — thanks @johnbenjaminlewis. - Drive: allow
drive share --role commenterfor comment-only sharing. (#443) — thanks @pavelzak. - Drive: show owner email in
drive lsanddrive searchtable output. (#458) — thanks @laihenyi. - Slides: add
slides thumbnail/slides thumbto fetch rendered slide thumbnail URLs or download PNG/JPEG images. (#498) — thanks @gianpaj. - Sheets: add
sheets chartto list, inspect, create, update, and delete embedded charts. (#434) — thanks @andybergon. - Sheets: add
add-sheet,rename-sheet, anddelete-sheettab aliases plussheets add-tab --index. (#442) — thanks @alexknowshtml. - Calendar: add
calendar create-calendar/new-calendarto create secondary calendars with description, timezone, and location. (#455) — thanks @alexknowshtml. - Auth: add
auth credentials removeto delete stored OAuth client credentials and associated refresh tokens. (#473) — thanks @yamagucci. - Auth: add
adsas an auth service for Google Ads API tokens. (#264) — thanks @ufkhan97. - Secrets: allow
GOG_KEYRING_SERVICE_NAMEto override the keyring namespace. (#463) — thanks @mkurz. - Agent safety: allow dotted command paths in
--enable-commandsand add--disable-commands/GOG_DISABLE_COMMANDSdenylist support. (#218, #173) — thanks @EricYangTL and @spookyuser. - Contacts: add
--gendertocontacts createandcontacts update, and include gender incontacts gettext output. (#438) — thanks @klodr. - Chat: make
chat spaces finduse case-insensitive substring matching by default, with--exactfor legacy exact lookup. (#506) — thanks @mvanhorn.
Fixed
- Calendar: avoid ambiguous timezone guessing from offset-only event times, preserve timezones for focus-time events, and use exclusive next-midnight bounds for full-day ranges. (#492, #509, #510) — thanks @RaphaelRUzan and @dinakars777.
- Gmail: preserve sent and received body content by using quoted-printable plain text, non-
7bitnon-ASCII HTML, and safer UTF-8 charset handling. (#476, #477, #511) — thanks @shashankkr9, @yeager, and @dinakars777. - Docs: restore
docs write --replace --markdownconversion and preserve sed formatting ranges, UTF-16 offsets, and&whole-match replacements. (#501, #483) — thanks @twilsher and @bill492. - Sheets: preserve valid chart ranges that target sheet ID 0 while still remapping sample-style zero IDs when the spreadsheet has no zero-ID sheet. (#434) — thanks @andybergon.
- Auth: remove stale aliases and account-client mappings from config when
auth removedeletes an account. (#467) — thanks @mvanhorn. - Contacts: reject all individual update flags when
contacts update --from-fileis used. (#439) — thanks @klodr. - Tasks: clear task due dates when
tasks update --due=is provided. (#507) — thanks @dinakars777. - CLI: generate native zsh completions without relying on
bashcompinit. (#481) — thanks @piiq. - Windows: expand
~\...paths and run the integration live-test wrapper through PowerShell. (#452) — thanks @gagradebnath. - Tracking: prefer file-stored tracking secrets over stale keyring values unless keyring storage is configured. (#469) — thanks @alexuser.
- Time parsing: accept
tues,thur, andthursas weekday expressions. (#440) — thanks @sjhddh.
v0.12.0
0.12.0
Highlights
- Admin: full Workspace Admin users/groups coverage for common directory operations. (#403) — thanks @dl-alexandre.
- Auth: new headless/cloud auth paths with ADC, direct access tokens, custom callbacks, proxy-safe loopback settings, and extra-scope controls. (#357, #419, #227, #398, #421) — thanks @tengis617, @mmkal, @cyberfox, @salmonumbrella, and @peteradams2026.
- Docs: much stronger document editing and export flow with tab targeting, richer find-replace, pageless mode, and native Markdown/HTML export. (#330, #305, #300, #282, #141) — thanks @ignacioreyna, @chparsons, @shohei-majima, @fprochazka, and @in-liberty420.
- Sheets: spreadsheet editing/formatting expands significantly with named ranges, tab management, notes, find-replace, formatting controls, inserts, links, and format inspection. (#278, #309, #430, #341, #320, #203, #374, #284) — thanks @TheCrazyLex, @JulienMalige, @andybergon, @Shehryar, @omothm, and @nilzzzzzz.
- Calendar: aliases, subscribe, and selector parity make multi-calendar workflows much easier. (#393, #327, #319) — thanks @salmonumbrella and @cdthompson.
- Forms/Slides/Keep: forms management + watches, slides from templates, and first write/delete coverage for Keep. (#274, #273, #413) — thanks @alexknowshtml, @penguinco, and @jgwesterlund.
Added
- Admin: add Workspace Admin Directory commands for users and groups, including user list/get/create/suspend and group membership list/add/remove. (#403) — thanks @dl-alexandre.
- Auth: add Application Default Credentials mode via
GOG_AUTH_MODE=adcfor Workload Identity, Cloud Run, and localgcloudADC flows without stored OAuth refresh tokens. (#357) — thanks @tengis617. - Auth: add
--access-token/GOG_ACCESS_TOKENfor direct access-token auth in headless or CI flows, bypassing stored refresh tokens. (#419) — thanks @mmkal. - Auth: add
auth add|manage --listen-addrplus--redirect-hostfor browser OAuth behind proxies or remote loopback forwarding. (#227) — thanks @cyberfox. - Auth: add
auth add --redirect-urifor manual/remote OAuth flows, so custom callback hosts can be reused across the printed auth URL, state cache, and code exchange. (#398) — thanks @salmonumbrella. - Auth: add
--extra-scopestoauth addfor appending custom OAuth scope URIs beyond the built-in service scopes. (#421) — thanks @peteradams2026. - Docs: add
--tab-idto editing commands so write/update/insert/delete/find-replace can target a specific Google Docs tab. (#330) — thanks @ignacioreyna. - Docs: extend
docs find-replacewith--first,--content-file, Markdown replacement, inline image insertion, and image sizing syntax. (#305) — thanks @chparsons. - Docs: add
--pagelesstodocs create,docs write, anddocs updateto switch documents into pageless mode after writes. (#300) — thanks @shohei-majima. - Docs: add native Google Docs Markdown export via
docs export --format md. (#282) — thanks @fprochazka. - Docs: add native Google Docs HTML export via
docs export --format html. (#141) — thanks @in-liberty420. - Sheets: add named range management (
sheets named-ranges) and let range-based Sheets commands accept named range names where GridRange-backed operations are needed. (#278) — thanks @TheCrazyLex. - Sheets: add
add-tab,rename-tab, anddelete-tabcommands for managing spreadsheet tabs, with delete dry-run/confirmation guardrails. (#309) — thanks @JulienMalige. - Sheets: add
merge,unmerge,number-format,freeze,resize-columns, andresize-rowscommands for spreadsheet layout/format control. (#320) — thanks @Shehryar. - Sheets: add
sheets update-note/set-noteto write or clear cell notes across a range. (#430) — thanks @andybergon. - Sheets: add
sheets find-replaceto replace text across a spreadsheet or a specific tab, with exact-match, regex, and formula search options. (#341) — thanks @Shehryar. - Sheets: add
sheets insertto insert rows/columns into a sheet. (#203) — thanks @andybergon. - Sheets: add
sheets create --parentto place new spreadsheets in a Drive folder. (#424) — thanks @ManManavadaria. - Sheets: add
sheets read-formatto inspectuserEnteredFormat/effectiveFormatper cell. (#284) — thanks @nilzzzzzz. - Sheets: add
sheets links(aliashyperlinks) to list cell links from ranges, including rich-text links. (#374) — thanks @omothm. - Forms: add form update/question-management commands plus response watch create/list/delete/renew, with delete-question validation and confirmation guardrails. (#274) — thanks @alexknowshtml.
- Slides: add
create-from-templatewith--replace/--replacements, dry-run support, and template placeholder replacement stats. (#273) — thanks @penguinco. - Calendar: add
calendar alias list|set|unset, and let calendar commands resolve configured aliases before API/name lookup. (#393) — thanks @salmonumbrella. - Calendar: let
calendar freebusy/calendar conflictsaccept--cal, names, indices, and--alllikecalendar events. (#319) — thanks @salmonumbrella. - Calendar: add
calendar subscribe(aliasessub,add-calendar) to add a shared calendar to the current account’s calendar list. (#327) — thanks @cdthompson. - Gmail: add
watch serve --history-typesfiltering (messageAdded|messageDeleted|labelAdded|labelRemoved) and includedeletedMessageIdsin webhook payloads. (#168) — thanks @salmonumbrella. - Gmail: add
gmail labels renameto rename user labels by ID or exact name, with system-label guards and wrong-case ID safety. (#391) — thanks @adam-zethraeus. - Gmail: add
gmail messages modifyfor single-message label changes, complementing thread- and batch-level modify flows. (#281) — thanks @zerone0x. - Gmail: add
gmail filters exportto dump filter definitions as JSON to stdout or a file for backup/script workflows. (#119) — thanks @Jeswang. - Keep: add
keep createfor text/checklist notes andkeep deletefor note removal. (#413) — thanks @jgwesterlund. - Contacts: support
--org,--title,--url,--note, and--customon create/update; include custom fields in get output with deterministic ordering. (#199) — thanks @phuctm97. - Contacts: add
--relation type=personto contact create/update, include relations in textcontacts get, and cover relation payload updates. (#351) — thanks @karbassi. - Contacts: add
--addressto contact create/update and include addresses in textcontacts get. (#148) — thanks @beezly. - Drive: add
drive ls --all(alias--global) to list across all accessible files; make--alland--parentmutually exclusive. (#107) — thanks @struong. - Chat: add
chat messages reactions create|list|deleteto manage emoji reactions on messages;chat messages react <message> <emoji>as a shorthand for creating reactions;reactionis an alias forreactions. (#426) — thanks @fernandopps. - Tasks: add
--recur/--recur-rrulealiases for repeat materialization, including RRULEINTERVALsupport for generated occurrences. (#408) — thanks @salmonumbrella.
Fixed
- Google API: use transport-level response-header timeouts for API clients while keeping token exchanges bounded, so large downloads are not cut short by
http.Client.Timeout. (#425) — thanks @laihenyi. - Timezone: embed the IANA timezone database so Windows builds can resolve calendar timezones correctly. (#388) — thanks @visionik.
- Auth: persist rotated OAuth refresh tokens returned during API calls so later commands keep working without re-auth. (#373) — thanks @joshp123.
- Auth: allow pure service-account mode when the configured subject matches the service account itself, instead of forcing domain-wide delegation impersonation. (#399) — thanks @carrotRakko.
- Auth: keep Keep-only service-account fallback isolated to Keep commands so other Google services do not accidentally pick it up. (#414) — thanks @jgwesterlund.
- Auth: add
--gmail-scope full|readonly, and disableinclude_granted_scopesfor readonly/limited auth requests to avoid Drive/Gmail scope accumulation. (#113) — thanks @salmonumbrella. - Auth: preserve scope-shaping flags in the remote step-2 replay guidance for
auth add --remote. (#427) — thanks @doodaaatimmy-creator. - Calendar: preserve full RRULE values and recurring-event timezones during updates so recurrence edits don’t lose BYDAY lists or hit missing-timezone API errors. (#392) — thanks @salmonumbrella.
- Calendar: let recurring
calendar update --scope=futureandcalendar delete --scope=futurestart from an instance event ID by resolving the parent series first. (#319) — thanks @salmonumbrella. - Calendar: use
Calendars.Getfor timezone lookups so service-account flows don’t 404 oncalendarList/primary. (#325) — thanks @markwatson. - Calendar: hide cancelled/deleted events from
calendar eventslist output by explicitly settingshowDeleted=false. (#362) — thanks @sharukh010. - Calendar: reject ambiguous calendar-name selectors for
calendar eventsinstead of guessing. (#131) — thanks @salmonumbrella. - Calendar: respond patches only attendees to avoid custom reminders validation errors. (#265) — thanks @sebasrodriguez.
- Calendar: force-send
minutes=0for--reminder popup:0mso zero-minute popup reminders survive Google Calendar API JSON omission rules. (#316) — thanks @salmonumbrella. - Calendar: clarify that RFC3339
--from/--totimestamps must include a timezone while keeping date and relative-time help intact. (#409) — thanks @dbhurley. - Gmail: add a fetch delay in
watch serveso History API reads don't race message indexing. (#397) — thanks @salmonumbrella. - Gmail: preserve the selected
--clientduringwatch servepush handling instead of falling back to the default client. (#411) — thanks @chrysb. - Gmail: allow Workspace-managed send-as aliases with empty verification status in
sendanddrafts create. (#407) — thanks @salmonumbrella. - Gmail: fall back to
MimeTypecharset hints whenContent-Typeheaders are missing s...
v0.11.0
0.11.0
Added
- Apps Script: add
appscriptcommand group (create/get projects, fetch content, run deployed functions). - Forms: add
formscommand group (create/get forms, list/get responses). - Docs: add
docs commentsfor listing and managing Google Doc comments. (#263) — thanks @alextnetto. - Sheets: add
sheets notesto read cell notes. (#208) — thanks @andybergon. - Gmail: add
gmail send --quoteto include quoted original message in replies. (#169) — thanks @terry-li-hm. - Drive: add
drive ls|search --no-all-drivesto restrict queries to "My Drive" for faster/narrower results. (#258) - Contacts: update contacts from JSON via
contacts update --from-file(PR #200 — thanks @jrossi).
Fixed
- Drive: make
drive deletemove files to trash by default; add--permanentfor irreversible deletion. (#262) — thanks @laihenyi. - Drive/Gmail: pass through Drive API filter queries in
drive search; RFC 2047-encode non-ASCII display names in mail headers (From/To/Cc/Bcc/Reply-To). (#260) — thanks @salmonumbrella. - Calendar: allow opting into attendee notifications for updates and cancellations via
calendar update|delete --send-updates all|externalOnly|none. (#163) — thanks @tonimelisma. - Calendar: fall back to fixed-offset timezones (
Etc/GMT±N) for recurring events when given RFC3339 offset datetimes; harden Gmail attachment output paths and cache validation; honor proxy defaults for Google API transports. (#228) — thanks @salmonumbrella. - Auth: manual OAuth flow uses an ephemeral loopback redirect port (avoids unsafe/privileged ports in browsers). (#172) — thanks @spookyuser.
- Gmail: include primary display name in
gmail sendFrom header when using service account impersonation (domain-wide delegation). (#184) — thanks @salmonumbrella. - Gmail: when
gmail attachment --outpoints to a directory (or ends with a trailing slash), combine with--nameand avoid false cache hits on directories. (#248) — thanks @zerone0x. - Drive: include shared drives in
drive lsanddrive search; rejectdrive download --formatfor non-Google Workspace files. (#256) — thanks @salmonumbrella. - Drive: validate
drive download --formatvalues and error early for unknown formats. (#259)
v0.10.0
0.10.0
Added
- Docs/Slides: add
docs updatemarkdown formatting + table insertion, plus markdown-driven slides creation and template-based slide creation. (#219) — thanks @maxceem. - Slides: add add-slide/list-slides/delete-slide/read-slide/update-notes/replace-slide for image decks, including --before insertion and --notes '' clear behavior. (#214) — thanks @chrismdp.
- Docs: add tab support (
docs list-tabs,docs cat --tab,docs cat --all-tabs) and editing commands (docs write|insert|delete|find-replace). (#225) — thanks @alexknowshtml. - Docs: add
docs create --fileto import Markdown into Google Docs with inline image support and hardened temp-file cleanup. (#244) — thanks @maxceem. - Drive: add
drive upload --replaceto update files in-place (preservesfileId/shared link). (#232) — thanks @salmonumbrella. - Drive: add upload conversion flags
--convert(auto) and--convert-to(doc|sheet|slides). (#240) — thanks @Danielkweber. - Drive: share files with an entire Workspace domain via
drive share --to domain. (#192) — thanks @Danielkweber. - Gmail: add
--exclude-labelstowatch serve(defaults:SPAM,TRASH). (#194) — thanks @salmonumbrella. - Gmail: add
gmail labels delete <labelIdOrName>with confirm + system-label guardrails and case-sensitive ID handling. (#231) — thanks @Helmi. - Contacts: support
contacts update --birthdayand--notes; unify shared date parsing and docs. (#233) — thanks @rosssivertsen.
Fixed
- Live tests: make
scripts/live-test.shandscripts/live-chat-test.shCWD-safe (repo-root aware builds and sourcing). - Calendar: interpret date-only and relative day
--tovalues as inclusive end-of-day while keeping--to nowas a point-in-time bound. (#204) — thanks @mjaskolski. - Auth: improve remote/server-friendly manual OAuth flow (
auth add --remote). (#187) — thanks @salmonumbrella. - Gmail: avoid false quoted-printable detection for already-decoded URLs with uppercase hex-like tokens while still decoding unambiguous markers (
=3D, chained escapes, soft breaks). (#186) — thanks @100menotu001. - Sheets: preserve TSV tab delimiters for
sheets get --plainoutput. (#212) — thanks @salmonumbrella. - CLI: land PR #201 with conflict-resolution fixes for
--fieldsrewrite, calendar--allpaging, schema command-path parsing, and case-sensitive Gmail watch exclude-label IDs. (#201) — thanks @salmonumbrella. - Secrets: set keyring item labels to
gogcliso macOS security prompts show a clear item name. (#106) — thanks @maxceem.