Skip to main content

Portable Google Workspace CLI for humans and agents

Project description

suitewright

A portable Google Workspace CLI and workflow toolkit for humans and agents.

Early development (pre-0.1.0). Commands and APIs may have breaking changes between minor versions. Pin your version if stability matters.

suitewright is a Python command-line tool for working with Google Workspace from a local machine, automation script, or AI agent runtime. It is framework-neutral and built around a cache-first workflow that both humans and agents can inspect.

Installation

With uv:

uv tool install suitewright

With pip:

python3 -m pip install suitewright

From a checkout:

git clone https://github.com/glenkusuma/suitewright.git
cd suitewright
uv sync
uv run suitewright --help

Agent Skill

Install the suitewright skill for your AI coding agent via skills.sh:

npx skills add glenkusuma/suitewright

Authentication

suitewright uses local OAuth credentials. Provide your Google OAuth client secret, complete browser-based consent once, and the resulting token is stored locally.

suitewright auth init --client-secret /path/to/client_secret.json
suitewright auth login
suitewright auth check

For the full auth setup guide (headless flows, Advanced Protection, troubleshooting), see the skill reference.

Command surface

suitewright auth          init | login | check | revoke | install-deps
suitewright gmail         search | get | send | reply | labels | modify | trash
suitewright calendar      list | create | delete
suitewright drive         search | get | upload | download | create-folder | share | delete
suitewright contacts      list
suitewright sheets        get | update | append
suitewright docs          cache fetch | show | validate | update
                          query structure | get | list-headings | find-heading | section
                                find-text | get-range | word-count | find-citations | check-headings
                          mutate append | replace | replace-all | insert-table | insert-image
                                 style-range | table-update-cell | table-append-row | raw
                          table get
                          plan | request-template <kind> | comments list | get | reply | resolve
                          create
suitewright forms         list | get | create | update
                          fetch | show-cache | validate | cache-update
                          query locate | query after | query delete-request
                          query get-item | query neighbors | query section | query indexer

Run any subcommand with --help for full flags.

Examples

Gmail

suitewright gmail search "is:unread" --max 10
suitewright gmail get MESSAGE_ID
suitewright gmail send --to user@example.com --subject "Hello" --body "Message text"

Calendar

suitewright calendar list --calendar primary
suitewright calendar create --calendar primary --summary "Standup" \
  --start 2026-03-01T10:00:00-06:00 --end 2026-03-01T10:30:00-06:00

Drive

suitewright drive search "quarterly report" --max 10
suitewright drive upload report.pdf --parent FOLDER_ID
suitewright drive delete FILE_ID                # moves to trash
suitewright drive delete FILE_ID --permanent    # irreversible

Docs - cache-first workflow

suitewright docs cache fetch DOC_ID
suitewright docs query structure DOC_ID --full-text
suitewright docs query find-text DOC_ID --pattern "typo"
suitewright docs mutate replace-all DOC_ID --find "typo" --replace "fixed" --dry-run
suitewright docs mutate replace-all DOC_ID --find "typo" --replace "fixed"
suitewright docs cache validate DOC_ID

Forms - cache-first workflow

suitewright forms fetch FORM_ID
suitewright forms query locate FORM_ID --title "Question 1"
suitewright forms cache-update FORM_ID /path/to/changes.json

Sheets

suitewright sheets get SHEET_ID "Sheet1!A1:D10"
suitewright sheets update SHEET_ID "Sheet1!A1:B2" --values '[["Name","Score"],["Alice","95"]]'
suitewright sheets append SHEET_ID "Sheet1!A:C" --values '[["new","row","data"]]'

Cache-first philosophy

suitewright is designed around a cache-first pattern: fetch remote state once, inspect and plan locally, then apply a guarded mutation and refresh. This pattern is implemented for both Forms (forms fetch -> forms query -> forms cache-update) and Docs (docs cache fetch -> docs query -> docs mutate -> docs cache validate). Local artifacts can be opened in an editor, read by an agent, committed to a branch, diffed, or fed into a repeatable script.

Contributing

See docs/ for developer documentation:

License

Apache-2.0. See LICENSE and NOTICE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

suitewright-0.0.2.tar.gz (42.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

suitewright-0.0.2-py3-none-any.whl (56.1 kB view details)

Uploaded Python 3

File details

Details for the file suitewright-0.0.2.tar.gz.

File metadata

  • Download URL: suitewright-0.0.2.tar.gz
  • Upload date:
  • Size: 42.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for suitewright-0.0.2.tar.gz
Algorithm Hash digest
SHA256 9ab299a59e8e84c44cdb2431e6b0437b53841f1d153fc1f371bc1d3a6847f130
MD5 439829ebf207da5fd1b2cc5824174e30
BLAKE2b-256 72f6a96c53e5a92109300896868c6ca158e05ca0aa748bb90c82019d7b94bfd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for suitewright-0.0.2.tar.gz:

Publisher: release.yml on glenkusuma/suitewright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file suitewright-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: suitewright-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 56.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for suitewright-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ea8a1efd94fb486d73782ad4c2dbc3a9e4d34424f16dbdcd20a09fd44c42bfba
MD5 a48ae38d9cbc144536209a15a10e41a2
BLAKE2b-256 c0f622e856e91194f4e6b2c657c45867f7471a91ab4b83637d930392ae9e9fa0

See more details on using hashes here.

Provenance

The following attestation bundles were made for suitewright-0.0.2-py3-none-any.whl:

Publisher: release.yml on glenkusuma/suitewright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page