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.