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:
- Development - dev setup, testing, linting
- Docker - hardened runtime, compose, dev workflow
- Configuration - auth resolution, env vars
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ab299a59e8e84c44cdb2431e6b0437b53841f1d153fc1f371bc1d3a6847f130
|
|
| MD5 |
439829ebf207da5fd1b2cc5824174e30
|
|
| BLAKE2b-256 |
72f6a96c53e5a92109300896868c6ca158e05ca0aa748bb90c82019d7b94bfd9
|
Provenance
The following attestation bundles were made for suitewright-0.0.2.tar.gz:
Publisher:
release.yml on glenkusuma/suitewright
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
suitewright-0.0.2.tar.gz -
Subject digest:
9ab299a59e8e84c44cdb2431e6b0437b53841f1d153fc1f371bc1d3a6847f130 - Sigstore transparency entry: 1615300314
- Sigstore integration time:
-
Permalink:
glenkusuma/suitewright@99623c7716988c7f4f4443d5fd000b317853ae66 -
Branch / Tag:
refs/tags/v0.0.2 - Owner: https://github.com/glenkusuma
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@99623c7716988c7f4f4443d5fd000b317853ae66 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea8a1efd94fb486d73782ad4c2dbc3a9e4d34424f16dbdcd20a09fd44c42bfba
|
|
| MD5 |
a48ae38d9cbc144536209a15a10e41a2
|
|
| BLAKE2b-256 |
c0f622e856e91194f4e6b2c657c45867f7471a91ab4b83637d930392ae9e9fa0
|
Provenance
The following attestation bundles were made for suitewright-0.0.2-py3-none-any.whl:
Publisher:
release.yml on glenkusuma/suitewright
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
suitewright-0.0.2-py3-none-any.whl -
Subject digest:
ea8a1efd94fb486d73782ad4c2dbc3a9e4d34424f16dbdcd20a09fd44c42bfba - Sigstore transparency entry: 1615300324
- Sigstore integration time:
-
Permalink:
glenkusuma/suitewright@99623c7716988c7f4f4443d5fd000b317853ae66 -
Branch / Tag:
refs/tags/v0.0.2 - Owner: https://github.com/glenkusuma
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@99623c7716988c7f4f4443d5fd000b317853ae66 -
Trigger Event:
release
-
Statement type: