All notable changes to the extrasuite client library will be documented in this file.
- Markdown-first Google Docs workflow —
extrasuite doc pullnow defaults to the markdown format (tabs/ layout). The XML workflow is preserved aspull-xml/push-xml. tabs/folder layout — each tab in a pulled document is a separatetabs/<tab-name>.mdfile.index.mdat the root provides the document outline with line numbers and authoring hints.- YAML frontmatter — each tab file carries
idandtitlefrontmatter so the push step has unambiguous tab identity without requiring a separate index. - Safety guard on pull overwrite —
doc pullnow refuses to delete the output directory unless it is empty or was previously created byextrasuite(detected by anindex.mdorindex.xmlmarker). Prevents accidental data loss when the output dir is.or a parent directory.
doc pullre-pull no longer overwrites the existing folder wholesale; uses a safe atomic swap.- 3-way markdown merge now used for
diff; fixes a class of spurious edit detections on re-pull. - Same-position insertion group ordering when a table is mixed with surrounding paragraphs.
extradocdependency bumped to>=0.4.2.- Debug commands (
diff,create-empty,download-raw,verify-table-indices) are now hidden behindEXTRASUITE_DEV=1.
trust_alloption for Gmail — power users can settrust_all = truein[trusted_contacts]of~/.config/extrasuite/settings.tomlto allow reading email from any sender. Preserves security model (agent cannot modify the file).
- Keyring-based session storage now correctly supports multiple profiles.
- Headless auth displays the auth code on the page instead of redirecting to localhost.
- Fixed stale keyring install hint in auth docs.
- Corrected whitelist setup help doc (was referencing old
gmail_whitelist.jsonformat; now correctly documentssettings.toml).
- Reduced duplication in pull/push command help files.
- Updated minimum dependency versions:
extrasheet>=0.3.1,extraslide>=0.2.3,extraform>=0.3.1,extradoc>=0.4.1.
- Session-token auth (v2 protocol): One browser login per 30 days, then fully headless. The CLI no longer opens the browser mid-task.
extrasuite auth login [--headless]— explicitly log in and obtain a 30-day session token.--headlessprints the URL and prompts for a code on stdin instead of opening a browser.extrasuite auth logout— revokes session server-side and clears all cached credential files.extrasuite auth status— shows session validity, access token cache status, and OAuth token cache status.SessionTokendataclass — long-lived token stored at~/.config/extrasuite/session.json.- Device fingerprint collection — MAC address, hostname, OS, and platform captured at session issuance for server-side audit.
- Programmatic credential requests now require a
reasonkeyword argument. - DWD credential cache reduced to 10 minutes.
- All
extrasuite <module> pull/pushcommands now use the headless session-token flow when a server URL is configured.
extrasuite contacts sync— syncs Google Contacts (people + other contacts) to a local SQLite DB at~/.config/extrasuite/contacts.db; supports full and incremental sync with automatic token-expiry fallbackextrasuite contacts search <query>— multi-query fuzzy search ranked by source, touch frequency, recency, and domain clustering from touch sessionsextrasuite contacts touch <email>— records interactions and groups emails into sessions for future ranking
- Help text for
diffcommands simplified to one-liner "Debugging tool only" to discourage casual use SKILL.mdrewritten for concision: shorter intro,@latestonly on first command, added contacts/create examples
extrasuite gmail compose <file>— save a Gmail draft from a markdown file with YAML front matter; body is converted from markdown to HTML (headings, bold, lists, tables all render correctly in Gmail); plain-text fallback included for clients that don't render HTMLextrasuite gmail edit-draft <draft_id> <file>— update an existing Gmail draft in place; draft ID is printed bycomposeextrasuite calendar view— list calendar events for a time range (today,tomorrow,this-week,next-week,YYYY-MM-DD)extrasuite <sheet|slide|doc|form> create <title>— create a new Google Workspace file and automatically share it with the service account- Bundled help system — all
--helptext is now loaded from markdown files inclient/help/, making it easy to update documentation without rebuilding
- Bump
extradocdependency to>=0.3.0(paragraph styling reconciliation, Pydantic models) gmail.composeandgmail.edit-draftuse OAuth delegation scopegmail.composecalendar.viewuses OAuth delegation scopecalendar- File
createcommands use OAuthdrive.filescope
markdown>=3.0for markdown-to-HTML conversion in gmail commands
- Bump extradoc dependency to
>=0.2.2(inline comment-ref support) - Wire pull/diff/push with comment-ref flow for Google Docs comments
- Removed
login/logoutcommands. Authentication is now stateless via per-command flags.
- Unified CLI with
extrasuite sheet/slide/form/doc/script pull/diff/pushsubcommands. --gatewayand--service-accountflags on pull/push/create commands for per-command auth.- Rich help text with folder layouts per module.
extrasuiteconsole script entry point.- Now depends on all 5 modules (extrasheet, extraslide, extraform, extrascript, extradoc) at
>=0.2.0.
-
Removed older convenience helpers. Use
CredentialsManagerdirectly instead:# Preferred from extrasuite.client import CredentialsManager manager = CredentialsManager() credential = manager.get_credential( command={"type": "sheet.pull"}, reason="User requested spreadsheet access", )
-
Removed CLI entry point (
extrasuite login/extrasuite logout). The CLI was an internal testing tool. UseCredentialsManagerprogrammatically instead. -
Exports narrowed -
__all__now contains onlyCredentialsManager,Token, andOAuthToken.
- Domain-wide delegation support - New
get_oauth_token()method onCredentialsManagerfor obtaining user-level OAuth tokens via domain-wide delegation. This enables access to user-scoped Google APIs like Gmail and Calendar. - New
OAuthTokendataclass returned byget_oauth_token(), withaccess_token,scopes, andexpires_atfields. - Separate OAuth token cache at
~/.config/extrasuite/oauth_token.jsonwith scope-aware cache invalidation.
-
Token storage reverted to file-based caching - Tokens are now stored in
~/.config/extrasuite/token.jsoninstead of the OS keyring.The keyring implementation caused repeated authentication prompts on some systems, disrupting the user experience. File-based storage is a well-established pattern used by major CLI tools:
gcloudstores credentials in~/.config/gcloud/aws-clistores credentials in~/.aws/credentialsgh(GitHub CLI) stores tokens in~/.config/gh/
Additionally, ExtraSuite tokens are short-lived (typically 1 hour), making the security trade-off acceptable. Long-lived credentials would warrant more secure storage, but short-lived tokens expire before they can be meaningfully exploited.
Token files are created with secure permissions (0600 - owner read/write only).
keyringdependency removed - the library now has zero required dependenciescertifiis now optional (in[ssl]extras) for macOS SSL certificate handling
- Initial release
- ExtraSuite protocol authentication via OAuth flow
- Service account file authentication
- Token caching via OS keyring (macOS Keychain, Windows Credential Locker, Linux Secret Service)
- CLI commands:
extrasuite loginandextrasuite logout - Programmatic API:
CredentialsManager