apple-notes
Manage Apple Notes via the memo CLI on macOS (create, view, search, edit).
Google OAuth2 client credentials (downloaded from Google Cloud Console)
$ npx -y skills add braxtonROSE4/zorro-agent --skill google-workspace --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/google-workspaceContext preview
The summary Claude sees to decide when to auto-load this skill.
Google OAuth2 client credentials (downloaded from Google Cloud Console)
name: google-workspace
description: Gmail, Calendar, Drive, Contacts, Sheets, and Docs integration via gws CLI (googleworkspace/cli). Uses OAuth2 with automatic token refresh via bridge script. Requires gws binary.
version: 2.0.0
author: Brax
license: MIT
required_credential_files:
- path: google_token.json
description: Google OAuth2 token (created by setup script)
- path: google_client_secret.json
description: Google OAuth2 client credentials (downloaded from Google Cloud Console)
metadata:
zorro:
tags: [Google, Gmail, Calendar, Drive, Sheets, Docs, Contacts, Email, OAuth, gws]
homepage: https://github.com/NousResearch/zorro-agent
related_skills: [himalaya]Gmail, Calendar, Drive, Contacts, Sheets, and Docs — powered by `gws` (Google's official Rust CLI). The skill provides a backward-compatible Python wrapper that handles OAuth token refresh and delegates to `gws`.
google_api.py → gws_bridge.py → gws CLI (argparse compat) (token refresh) (Google APIs)
Install `gws`:
cargo install google-workspace-cli # or via npm (recommended, downloads prebuilt binary): npm install -g @googleworkspace/cli # or via Homebrew: brew install googleworkspace-cli
Verify: `gws --version`
The setup is fully non-interactive — you drive it step by step so it works on CLI, Telegram, Discord, or any platform.
Define a shorthand first:
ZORRO_HOME="${ZORRO_HOME:-$HOME/.zorro}"
GWORKSPACE_SKILL_DIR="$ZORRO_HOME/skills/productivity/google-workspace"
PYTHON_BIN="${ZORRO_PYTHON:-python3}"
if [ -x "$ZORRO_HOME/zorro-agent/venv/bin/python" ]; then
PYTHON_BIN="$ZORRO_HOME/zorro-agent/venv/bin/python"
fi
GSETUP="$PYTHON_BIN $GWORKSPACE_SKILL_DIR/scripts/setup.py"$GSETUP --check
If it prints `AUTHENTICATED`, skip to Usage — setup is already done.
**Question 1: "What Google services do you need? Just email, or also Calendar/Drive/Sheets/Docs?"**
**Partial scopes**: Users can authorize only a subset of services. The setup script accepts partial scopes and warns about missing ones.
**Question 2: "Does your Google account use Advanced Protection?"**
Tell the user:
> 1. Go to https://console.cloud.google.com/apis/credentials > 2. Create a project (or use an existing one) > 3. Enable the APIs you need (Gmail, Calendar, Drive, Sheets, Docs, People) > 4. Credentials → Create Credentials → OAuth 2.0 Client ID → Desktop app > 5. Download JSON and tell me the file path
$GSETUP --client-secret /path/to/client_secret.json
$GSETUP --auth-url
Send the URL to the user. After authorizing, they paste back the redirect URL or code.
$GSETUP --auth-code "THE_URL_OR_CODE_THE_USER_PASTED"
$GSETUP --check
Should print `AUTHENTICATED`. Token refreshes automatically from now on.
All commands go through the API script:
ZORRO_HOME="${ZORRO_HOME:-$HOME/.zorro}"
GWORKSPACE_SKILL_DIR="$ZORRO_HOME/skills/productivity/google-workspace"
PYTHON_BIN="${ZORRO_PYTHON:-python3}"
if [ -x "$ZORRO_HOME/zorro-agent/venv/bin/python" ]; then
PYTHON_BIN="$ZORRO_HOME/zorro-agent/venv/bin/python"
fi
GAPI="$PYTHON_BIN $GWORKSPACE_SKILL_DIR/scripts/google_api.py"$GAPI gmail search "is:unread" --max 10 $GAPI gmail get MESSAGE_ID $GAPI gmail send --to user@example.com --subject "Hello" --body "Message text" $GAPI gmail send --to user@example.com --subject "Report" --body "<h1>Q4</h1>" --html $GAPI gmail reply MESSAGE_ID --body "Thanks, that works for me." $GAPI gmail labels $GAPI gmail modify MESSAGE_ID --add-labels LABEL_ID
$GAPI calendar list $GAPI calendar create --summary "Standup" --start 2026-03-01T10:00:00+01:00 --end 2026-03-01T10:30:00+01:00 $GAPI calendar create --summary "Review" --start ... --end ... --attendees "alice@co.com,bob@co.com" $GAPI calendar delete EVENT_ID
$GAPI drive search "quarterly report" --max 10 $GAPI drive search "mimeType='application/pdf'" --raw-query --max 5
$GAPI contacts list --max 20
$GAPI sheets get SHEET_ID "Sheet1!A1:D10" $GAPI sheets update SHEET_ID "Sheet1!A1:B2" --values '[["Name","Score"],["Alice","95"]]' $GAPI sheets append SHEET_ID "Sheet1!A:C" --values '[["new","row","data"]]'
$GAPI docs get DOC_ID
For operations not covered by the wrapper, use `gws_bridge.py` directly:
GBRIDGE="$PYTHON_BIN $GWORKSPACE_SKILL_DIR/scripts/gws_bridge.py" $GBRIDGE calendar +agenda --today --format table $GBRIDGE gmail +triage --labels --format json $GBRIDGE drive +upload ./report.pdf $GBRIDGE sheets +read --spreadsheet SHEET_ID --range "Sheet1!A1:D10"
All commands return JSON via `gws --format json`. Key output sha
A self-evolving CLI agent. Most agents treat memory as an afterthought — a flat text file that grows until it's useless.
Manage Apple Notes via the memo CLI on macOS (create, view, search, edit).
Manage Apple Reminders via remindctl CLI (list, add, complete, delete).
Track Apple devices and AirTags via FindMy.app on macOS using AppleScript and screen capture.
Delegate coding tasks to Claude Code (Anthropic's CLI agent). Use for building features, refactoring, PR reviews, and iterative coding. Requires the claude CLI…
Delegate coding tasks to OpenAI Codex CLI agent. Use for building features, refactoring, PR reviews, and batch issue fixing. Requires the codex CLI and a git…