ai/skills/gog/SKILL.md
Google Workspace CLI — Gmail, Calendar, Drive, Docs, Sheets, Slides, Tasks, Forms, Chat, People, Groups, Keep, Apps Script. TRIGGER when: user provides a Google Sheets/Docs/Drive/Slides URL, or needs to read/write/search any Google Workspace data. Use gog instead of WebFetch for all Google URLs (WebFetch will 401 on authenticated Google content). DEFAULT for spreadsheets: when a task involves reading or writing Google Sheets, use `gog sheets get` / `gog sheets update` / `gog sheets append` directly.
npx skillsauth add kurko/dotfiles gogInstall 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.
Use gog for Google Workspace operations. Requires OAuth setup.
Default for Google URLs. Never use WebFetch for Google Sheets, Docs, Drive, or Slides URLs.
Use gog commands instead (WebFetch will fail with 401 on authenticated Google content).
gog auth credentials /path/to/client_secret.jsongog auth add [email protected] --services gmail,calendar,drive,contacts,docs,sheets,tasks,slides,forms,chat,people,groups,keep,appscriptgog auth listSet [email protected] to avoid repeating --account.
gog ls — list Drive files (alias for drive ls)gog search "query" — search Drive (alias for drive search)gog open <target> — print web URL for a Google URL/ID (offline)gog download <fileId> — download a Drive filegog upload <localPath> — upload a file to Drivegog send — send email (alias for gmail send)gog me / gog whoami — show your profilegog status — show auth/config statusgog gmail search 'newer_than:7d' --max 10gog gmail messages search "in:inbox from:ryanair.com" --max 20gog gmail thread get <threadId>gog gmail thread get <threadId> --fullgog gmail get <messageId>gog gmail attachment <messageId> <attachmentId> --out /tmp/file.pdfgog gmail thread attachments <threadId> --download --out-dir /tmp/gog gmail url <threadId>Important:
gog gmail read is an alias for gog gmail thread. Both work.--full to get complete message bodies.--max, not --max-results or --limit.gog gmail send --to [email protected] --subject "Hi" --body "Hello"gog gmail send --to [email protected] --subject "Hi" --body-file ./message.txtgog gmail send --to [email protected] --subject "Hi" --body-file -gog gmail send --to [email protected] --subject "Hi" --body-html "<p>Hello</p>"gog gmail send --to [email protected] --subject "Re: Hi" --body "Reply" --reply-to-message-id <msgId>gog gmail drafts listgog gmail drafts create --to [email protected] --subject "Hi" --body-file ./message.txtgog gmail drafts send <draftId>gog gmail drafts update <draftId> --body "Updated"gog gmail drafts delete <draftId>gog gmail archive <messageId>gog gmail mark-read <messageId>gog gmail unread <messageId>gog gmail trash <messageId>gog gmail batch delete <msgId1> <msgId2> ...gog gmail batch modify <msgId1> <msgId2> --add-labels LABEL_ID --remove-labels INBOXgog gmail labels listgog gmail labels get <labelIdOrName>gog gmail labels create "My Label"gog gmail labels rename <labelIdOrName> "New Name"gog gmail labels modify <threadId> --add-labels LABEL_IDgog gmail labels delete <labelIdOrName>--body-file for multi-paragraph messages (or --body-file - for stdin).--body does not unescape \n. Use a heredoc or $'Line 1\n\nLine 2' for inline newlines.--body-html only when you need rich formatting.<p> paragraphs, <br> line breaks, <strong> bold, <em> italic, <a href="url"> links, <ul>/<li> lists.Example (plain text via stdin):
gog gmail send --to [email protected] \
--subject "Meeting Follow-up" \
--body-file - <<'EOF'
Hi Name,
Thanks for meeting today. Next steps:
- Item one
- Item two
Best regards,
Your Name
EOF
gog calendar events <calendarId> --from <iso> --to <iso>gog calendar events --from <iso> --to <iso>gog calendar event <calendarId> <eventId>gog calendar create <calendarId> --summary "Title" --from <iso> --to <iso>gog calendar create <calendarId> --summary "Title" --from <iso> --to <iso> --event-color 7gog calendar update <calendarId> <eventId> --summary "New Title" --event-color 4gog calendar delete <calendarId> <eventId>gog calendar search "query"gog calendar freebusy --from <iso> --to <iso>gog calendar conflicts --from <iso> --to <iso>gog calendar respond <calendarId> <eventId> --status accepted (accepted|declined|tentative)gog calendar propose-time <calendarId> <eventId>gog calendar calendarsgog calendar subscribe <calendarId>gog calendar acl <calendarId>gog calendar colorsgog calendar team <group-email> --from <iso> --to <iso>gog calendar focus-time --from <iso> --to <iso>gog calendar out-of-office --from <iso> --to <iso>gog calendar working-location --from <iso> --to <iso> --type home (home|office|custom)Event color IDs (from gog calendar colors):
gog drive ls / gog drive ls --folder <folderId>gog drive search "query" --max 10gog drive get <fileId>gog drive download <fileId> --out /tmp/file.pdfgog drive upload ./file.pdf --folder <folderId>gog drive mkdir "Folder Name" --folder <parentId>gog drive copy <fileId> "New Name"gog drive move <fileId> --folder <targetFolderId>gog drive rename <fileId> "New Name"gog drive delete <fileId> / --permanent for forevergog drive share <fileId> --email [email protected] --role writer (reader|writer|commenter)gog drive unshare <fileId> <permissionId>gog drive permissions <fileId>gog drive url <fileId>gog drive drivesgog docs cat <docId>gog docs export <docId> --format txt --out /tmp/doc.txt (txt|md|pdf|docx)gog docs info <docId>gog docs structure <docId>gog docs list-tabs <docId>gog docs write <docId> --text "New content"gog docs write <docId> --file ./content.txtgog docs write <docId> --file -gog docs write <docId> --text "More content" --appendgog docs write <docId> --text "Content" --tab-id <tabId>gog docs find-replace <docId> "old text" "new text"gog docs find-replace <docId> "old" "new" --firstgog docs find-replace <docId> "placeholder" --content-file ./content.md --format markdowngog docs edit <docId> "find" "replace"gog docs sed <docId> 's/pattern/replacement/g'gog docs insert <docId> "text" --index 1gog docs delete <docId> --start 10 --end 50gog docs clear <docId>gog docs create "Title"gog docs copy <docId> "New Title"gog sheets get <sheetId> "Tab!A1:D10" --jsongog sheets metadata <sheetId>gog sheets read-format <sheetId> "Tab!A1:D10"gog sheets notes <sheetId> "Tab!A1:D10"gog sheets links <sheetId> "Tab!A1:D10"gog sheets update <sheetId> "Tab!A1:B2" --values-json '[["A","B"],["1","2"]]' --input USER_ENTEREDgog sheets append <sheetId> "Tab!A:C" --values-json '[["x","y","z"]]' --insert INSERT_ROWSgog sheets clear <sheetId> "Tab!A2:Z"gog sheets update-note <sheetId> "Tab!A1" --note "My note"gog sheets insert <sheetId> "Tab" ROWS 5 --count 3gog sheets insert <sheetId> "Tab" COLUMNS 2 --count 1gog sheets find-replace <sheetId> "old" "new"gog sheets format <sheetId> "Tab!A1:D1" --bold --background-color "#f0f0f0"gog sheets number-format <sheetId> "Tab!A:A" --type CURRENCYgog sheets freeze <sheetId> --rows 1 --cols 1gog sheets merge <sheetId> "Tab!A1:B1"gog sheets unmerge <sheetId> "Tab!A1:B1"gog sheets resize-columns <sheetId> "A:C" --width 200gog sheets resize-rows <sheetId> "1:5" --height 40gog sheets add-tab <sheetId> "New Tab"gog sheets rename-tab <sheetId> "Old Name" "New Name"gog sheets delete-tab <sheetId> "Tab Name" (use --force to skip confirmation)gog sheets create "Title"gog sheets copy <sheetId> "New Title"gog sheets export <sheetId> --format csv --out /tmp/data.csv (csv|xlsx|pdf)gog slides export <presentationId> --format pdf --out /tmp/deck.pdf (pdf|pptx)gog slides info <presentationId>gog slides create "Title"gog slides create-from-markdown "Title" --content-file ./slides.mdgog slides create-from-template <templateId> "Title"gog slides copy <presentationId> "New Title"gog slides list-slides <presentationId>gog slides read-slide <presentationId> <slideId>gog slides add-slide <presentationId> ./image.pnggog slides replace-slide <presentationId> <slideId> ./new-image.pnggog slides update-notes <presentationId> <slideId> --notes "Notes text"gog slides delete-slide <presentationId> <slideId>gog tasks lists listgog tasks lists create "My List"gog tasks list <tasklistId>gog tasks get <tasklistId> <taskId>gog tasks add <tasklistId> --title "Buy groceries" --notes "Milk, eggs"gog tasks update <tasklistId> <taskId> --title "Updated title"gog tasks done <tasklistId> <taskId>gog tasks undo <tasklistId> <taskId>gog tasks delete <tasklistId> <taskId>gog tasks clear <tasklistId>gog forms get <formId>gog forms create --title "Survey"gog forms update <formId> --title "New Title"gog forms add-question <formId> --title "Your name?"gog forms delete-question <formId> <index>gog forms move-question <formId> <oldIndex> <newIndex>gog forms responses list <formId>gog forms responses get <formId> <responseId>gog people megog people get <userId>gog people search "query"gog people relationsgog chat spaces listgog chat spaces find "space name"gog chat spaces create "Space Name"gog chat messages list <space>gog chat messages send <space> --text "Hello"gog chat messages react <message> "👍"gog chat dm send <email> --text "Hello"gog chat dm space <email>gog groups listgog groups members <groupEmail>gog keep listgog keep get <noteId>gog keep search "query"gog keep create --title "Note" --text "Content"gog keep delete <noteId>gog keep attachment <attachmentName>gog appscript get <scriptId>gog appscript content <scriptId>gog appscript run <scriptId> <function>gog appscript create --title "My Script"gog contacts list --max 20--json — JSON output (all commands)--plain — stable TSV output, no colors--results-only — in JSON mode, emit only the primary result (drops envelope/pagination)--select "field1,field2" — in JSON mode, select specific fields (supports dot paths)--no-input — never prompt, fail instead (useful for CI)--dry-run — print intended actions without making changes--force — skip confirmations for destructive commands# Get all event IDs for today
gog calendar events primary --from 2024-01-15 --to 2024-01-16 --json --results-only | jq '.[].id'
# Download all attachments from a message
gog gmail get <msgId> --json | jq -r '.payload.parts[] | select(.filename != "") | .body.attachmentId' | \
xargs -I{} gog gmail attachment <msgId> {}
# Export a sheet tab to CSV
gog sheets export <sheetId> --format csv --out /tmp/data.csv
Gmail web URLs (e.g. https://mail.google.com/mail/u/0/#inbox/FMfcg...) use a UI thread ID that doesn't match the API thread/message ID. To find the email:
gog gmail messages search "from:[email protected]" --max 10gog gmail get <messageId>Do not try to use the Gmail URL's FMfcg... ID directly — it won't work with the API.
gog gmail search returns one row per thread; use gog gmail messages search for individual emails.--values-json (recommended) or as inline rows.find-replace supports --format markdown for rich replacements including inline images.gog open <url-or-id> to quickly get a web URL for any Google resource.tools
Create a GitHub pull request from the current branch. Use when user asks to create a PR, open a PR, submit a PR, push and create PR, or similar pull request workflows. Activates for phrases like "create a PR", "open a pull request", "submit PR", "push and PR", "make a PR for this", "open a draft PR".
data-ai
Merge the current worktree branch into main and sync main back. Use when the user says "merge to main", "ship it", "merge and continue", or after completing a task in a worktree and wanting to continue with the next one.
tools
Synchronize AI agent skills, commands, configs, permissions, hooks, and instructions across Claude Code, Codex CLI, and other Agent Skills-compatible tools. Use when the user asks to pull skills from Claude into Codex, sync Codex work back to Claude, migrate agent commands, reconcile frontmatter, update permissions, or keep agent setup files in parity.
testing
Write or update UI-independent use cases for QA. Use when the user says "write use cases", "add use cases", "QA use cases", "update use cases", "compose use cases", or when starting implementation of a new feature (after plan approval). Also activates for "what should we test", "regression cases", or "use cases for QA".