skills/gws/SKILL.md
Google Workspace CLI for email, docs, drive, and sheets
npx skillsauth add athal7/dotfiles gwsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
gws CLI — call directly via Bash; read gws --help on demand.
For inserting real tables into Google Docs (not text-based approximations), see tables.md — the index-shifting across phases is non-obvious.
Helper commands use --id flag: gws gmail +read --id <messageId>. List messages: gws gmail users messages list --params '{"userId":"me","q":"search query"}'.
+read output warns about unknown format but works — the body text/html is in the JSON response.
Service name is calendar, not cal. Events: gws calendar events list --params '{"calendarId":"primary","timeMin":"...","timeMax":"...","singleEvents":true,"orderBy":"startTime"}'.
Search files: gws drive files list --params '{"q":"name contains '\''keyword'\''","pageSize":20,"fields":"files(id,name,mimeType,modifiedTime)"}'.
Comments on Google Docs (and other Drive files) are a Drive resource, not a Docs resource: gws drive comments list/create/delete, not gws docs comments.
Both list and create require an explicit fields param or you get empty/minimal responses. Example fields: "comments(id,content,author(displayName),createdTime,resolved,quotedFileContent,replies(content,author(displayName),createdTime)),nextPageToken".
Google Docs comment anchoring does NOT work via the Drive API. Every comment created through the REST API on a Google Doc displays "Original content deleted" in the UI — regardless of whether you set anchor, quotedFileContent, both, or neither. The anchor field accepts arbitrary JSON but Google Docs ignores it (per Google's own docs: "Google Workspace editor apps treat these comments as un-anchored comments"). The kix.xxx IDs on browser-created comments are internal paragraph IDs only the Docs web editor can generate. Do not attempt to re-anchor comments programmatically — distribute the feedback through Slack or another channel instead.
The anchor field on browser-created comments (e.g. "kix.dilskyhp9rug") is readable but the format is undocumented and not reproducible via API.
Replying to existing comments works fine:
gws drive replies create --params '{"fileId":"<docId>","commentId":"<commentId>","fields":"id,content"}' \
--json '{"content":"Reply text"}'
Extract text from a Google Doc: gws docs documents get --params '{"documentId":"<id>"}' --format json then jq -r '.. | objects | select(.textRun?) | .textRun.content'.
development
Zoom meeting captions — file locations and format
tools
macOS dictation custom vocabulary — sync knowledge base names and terms to the system spelling dictionary
testing
Look up people, projects, products, and decisions locally first: contact info (email, Slack ID, GitHub handle), titles and teams, project/product status, who works on what, and past decisions. Check before searching Slack, email, calendar, or GitHub — this is the first stop for any contact detail, project context, or decision-history question.
testing
Communication style, audience awareness, and AI-authorship markers for human-facing prose — load when composing chat messages, review comments, merge request descriptions, emails, doc bodies, or ticket descriptions