[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-5371":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":41,"readmeContent":42,"aiSummary":43,"trendingCount":16,"starSnapshotCount":16,"syncStatus":44,"lastSyncTime":45,"discoverSource":46},5371,"cli","googleworkspace\u002Fcli","googleworkspace","Google Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.","https:\u002F\u002Fdevelopers.google.com\u002Fworkspace",null,"Rust",26993,1422,86,102,0,18,152,905,110,44.46,"Apache License 2.0",false,"main",[26,27,28,5,29,30,31,32,33,34,35,36,37,38,39,40],"agent-skills","ai-agent","automation","discovery-api","gemini-cli-extension","google-admin","google-api","google-calendar","google-chat","google-docs","google-drive","google-sheets","google-workspace","oauth2","rust","2026-06-12 02:01:09","\u003Ch1 align=\"center\">gws\u003C\u002Fh1>\n\n**One CLI for all of Google Workspace — built for humans and AI agents.**\u003Cbr>\nDrive, Gmail, Calendar, and every Workspace API. Zero boilerplate. Structured JSON output. 40+ agent skills included.\n\n> [!NOTE]\n> This is **not** an officially supported Google product.\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@googleworkspace\u002Fcli\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002F@googleworkspace\u002Fcli\" alt=\"npm version\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fgoogleworkspace\u002Fcli\" alt=\"license\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fgoogleworkspace\u002Fcli\u002Fci.yml?branch=main&label=CI\" alt=\"CI status\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@googleworkspace\u002Fcli\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Funpacked-size\u002F@googleworkspace\u002Fcli\" alt=\"install size\">\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cbr>\n\n⬇️ **[Download the latest release for your OS](https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Freleases)**\n\n`gws` doesn't ship a static list of commands. It reads Google's own [Discovery Service](https:\u002F\u002Fdevelopers.google.com\u002Fdiscovery) at runtime and builds its entire command surface dynamically. When Google Workspace adds an API endpoint or method, `gws` picks it up automatically.\n\n> [!IMPORTANT]\n> This project is under active development. Expect breaking changes as we march toward v1.0.\n\n## Contents\n\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Why gws?](#why-gws)\n- [Authentication](#authentication)\n- [AI Agent Skills](#ai-agent-skills)\n- [Advanced Usage](#advanced-usage)\n- [Environment Variables](#environment-variables)\n- [Exit Codes](#exit-codes)\n- [Architecture](#architecture)\n- [Troubleshooting](#troubleshooting)\n- [Development](#development)\n\n## Prerequisites\n\n- **Node.js 18+** — for `npm install` (or download a pre-built binary from [GitHub Releases](https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Freleases))\n- **A Google Cloud project** — required for OAuth credentials. You can create one via the [Google Cloud Console](https:\u002F\u002Fconsole.cloud.google.com\u002F) or with the [`gcloud` CLI](https:\u002F\u002Fcloud.google.com\u002Fsdk\u002Fdocs\u002Finstall) or with the `gws auth setup` command.\n- **A Google account** with access to Google Workspace\n\n## Installation\n\nThe recommended way to install `gws` is to download the pre-built binary for your OS and architecture from the **[GitHub Releases](https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Freleases)** page. Extract the archive and place the `gws` binary in your `$PATH`.\n\nFor convenience, you can also use `npm` to automate downloading the appropriate binary from GitHub Releases:\n\n```bash\nnpm install -g @googleworkspace\u002Fcli\n```\n\nOr build from source:\n\n```bash\ncargo install --git https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli --locked\n```\n\nA Nix flake is also available at `github:googleworkspace\u002Fcli`\n\n```bash\nnix run github:googleworkspace\u002Fcli\n```\n\nOn macOS and Linux, you can also install via [Homebrew](https:\u002F\u002Fbrew.sh\u002F):\n\n```bash\nbrew install googleworkspace-cli\n```\n\n## Quick Start\n\n```bash\ngws auth setup     # walks you through Google Cloud project config\ngws auth login     # subsequent OAuth login\ngws drive files list --params '{\"pageSize\": 5}'\n```\n\n## Why gws?\n\n**For humans** — stop writing `curl` calls against REST docs. `gws` gives you `--help` on every resource, `--dry-run` to preview requests, and auto‑pagination.\n\n**For AI agents** — every response is structured JSON. Pair it with the included agent skills and your LLM can manage Workspace without custom tooling.\n\n```bash\n# List the 10 most recent files\ngws drive files list --params '{\"pageSize\": 10}'\n\n# Create a spreadsheet\ngws sheets spreadsheets create --json '{\"properties\": {\"title\": \"Q1 Budget\"}}'\n\n# Send a Chat message\ngws chat spaces messages create \\\n  --params '{\"parent\": \"spaces\u002Fxyz\"}' \\\n  --json '{\"text\": \"Deploy complete.\"}' \\\n  --dry-run\n\n# Introspect any method's request\u002Fresponse schema\ngws schema drive.files.list\n\n# Stream paginated results as NDJSON\ngws drive files list --params '{\"pageSize\": 100}' --page-all | jq -r '.files[].name'\n```\n\n## Authentication\n\nThe CLI supports multiple auth workflows so it works on your laptop, in CI, and on a server.\n\n### Which setup should I use?\n\n| I have… | Use |\n|---|---|\n| `gcloud` installed and authenticated | [`gws auth setup`](#interactive-local-desktop) (fastest) |\n| A GCP project but no `gcloud` | [Manual OAuth setup](#manual-oauth-setup-google-cloud-console) |\n| An existing OAuth access token | [`GOOGLE_WORKSPACE_CLI_TOKEN`](#pre-obtained-access-token) |\n| Existing Credentials | [`GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE`](#service-account-server-to-server) |\n\n### Interactive (local desktop)\n\nCredentials are encrypted at rest (AES-256-GCM) with the key stored in your OS keyring (or `~\u002F.config\u002Fgws\u002F.encryption_key` when `GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=file`).\n\n```bash\ngws auth setup       # one-time: creates a Cloud project, enables APIs, logs you in\ngws auth login       # subsequent scope selection and login\n```\n\n> `gws auth setup` requires the [`gcloud` CLI](https:\u002F\u002Fcloud.google.com\u002Fsdk\u002Fdocs\u002Finstall). If you don't have `gcloud`, use the [manual setup](#manual-oauth-setup-google-cloud-console) below instead.\n\n> [!WARNING]\n> **Scope limits in testing mode:** If your OAuth app is unverified (testing mode),\n> Google limits consent to ~25 scopes. The `recommended` scope preset includes 85+\n> scopes and **will fail** for unverified apps (especially for `@gmail.com` accounts).\n> Choose individual services instead to filter the scope picker:\n> ```bash\n> gws auth login -s drive,gmail,sheets\n> ```\n\n\n### Manual OAuth setup (Google Cloud Console)\n\nUse this when `gws auth setup` cannot automate project\u002Fclient creation, or when you want explicit control.\n\n1. Open Google Cloud Console in the target project:\n   - OAuth consent screen: `https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials\u002Fconsent?project=\u003CPROJECT_ID>`\n   - Credentials: `https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials?project=\u003CPROJECT_ID>`\n2. Configure OAuth branding\u002Faudience if prompted:\n   - App type: **External** (testing mode is fine)\n3. Add your account under **Test users**\n4. Create an OAuth client:\n   - Type: **Desktop app**\n5. Download the client JSON and save it to:\n   - `~\u002F.config\u002Fgws\u002Fclient_secret.json`\n\n> [!IMPORTANT]\n> **You must add yourself as a test user.** In the OAuth consent screen, click\n> **Test users → Add users** and enter your Google account email. Without this,\n> login will fail with a generic \"Access blocked\" error.\n\nThen run:\n\n```bash\ngws auth login\n```\n\n### Browser-assisted auth (human or agent)\n\nYou can complete OAuth either manually or with browser automation.\n\n- **Human flow**: run `gws auth login`, open the printed URL, approve scopes.\n- **Agent-assisted flow**: the agent opens the URL, selects account, handles consent prompts, and returns control once the localhost callback succeeds.\n\nIf consent shows **\"Google hasn't verified this app\"** (testing mode), click **Continue**.\nIf scope checkboxes appear, select required scopes (or **Select all**) before continuing.\n\n### Headless \u002F CI (export flow)\n\n1. Complete interactive auth on a machine with a browser.\n2. Export credentials:\n   ```bash\n   gws auth export --unmasked > credentials.json\n   ```\n3. On the headless machine:\n   ```bash\n   export GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE=\u002Fpath\u002Fto\u002Fcredentials.json\n   gws drive files list   # just works\n   ```\n\n### Service Account (server-to-server)\n\nPoint to your key file; no login needed.\n\n```bash\nexport GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE=\u002Fpath\u002Fto\u002Fservice-account.json\ngws drive files list\n```\n\n### Pre-obtained Access Token\n\nUseful when another tool (e.g. `gcloud`) already mints tokens for your environment.\n\n```bash\nexport GOOGLE_WORKSPACE_CLI_TOKEN=$(gcloud auth print-access-token)\n```\n\n### Precedence\n\n| Priority | Source                 | Set via                                 |\n| -------- | ---------------------- | --------------------------------------- |\n| 1        | Access token           | `GOOGLE_WORKSPACE_CLI_TOKEN`            |\n| 2        | Credentials file       | `GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE` |\n| 3        | Encrypted credentials  | `gws auth login`                        |\n| 4        | Plaintext credentials  | `~\u002F.config\u002Fgws\u002Fcredentials.json`        |\n\nEnvironment variables can also live in a `.env` file.\n\n## AI Agent Skills\n\nThe repo ships 100+ Agent Skills (`SKILL.md` files) — one for every supported API, plus higher-level helpers for common workflows and 50 curated recipes for Gmail, Drive, Docs, Calendar, and Sheets. See the full [Skills Index](docs\u002Fskills.md) for the complete list.\n\n```bash\n# Install all skills at once\nnpx skills add https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\n\n# Or pick only what you need\nnpx skills add https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Ftree\u002Fmain\u002Fskills\u002Fgws-drive\nnpx skills add https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\u002Ftree\u002Fmain\u002Fskills\u002Fgws-gmail\n```\n\n\u003Cdetails>\n\u003Csummary>OpenClaw setup\u003C\u002Fsummary>\n\n```bash\n# Symlink all skills (stays in sync with repo)\nln -s $(pwd)\u002Fskills\u002Fgws-* ~\u002F.openclaw\u002Fskills\u002F\n\n# Or copy specific skills\ncp -r skills\u002Fgws-drive skills\u002Fgws-gmail ~\u002F.openclaw\u002Fskills\u002F\n```\n\nThe `gws-shared` skill includes an `install` block so OpenClaw auto-installs the CLI via `npm` if `gws` isn't on PATH.\n\n\u003C\u002Fdetails>\n\n## Gemini CLI Extension\n\n1. Authenticate the CLI first:\n\n   ```bash\n   gws auth setup\n   ```\n\n2. Install the extension into the Gemini CLI:\n   ```bash\n   gemini extensions install https:\u002F\u002Fgithub.com\u002Fgoogleworkspace\u002Fcli\n   ```\n\nInstalling this extension gives your Gemini CLI agent direct access to all `gws` commands and Google Workspace agent skills. Because `gws` handles its own authentication securely, you simply need to authenticate your terminal once prior to using the agent, and the extension will automatically inherit your credentials.\n\n## Advanced Usage\n\n### Multipart Uploads\n\n```bash\ngws drive files create --json '{\"name\": \"report.pdf\"}' --upload .\u002Freport.pdf\n```\n\n### Pagination\n\n| Flag                | Description                                    | Default |\n| ------------------- | ---------------------------------------------- | ------- |\n| `--page-all`        | Auto-paginate, one JSON line per page (NDJSON) | off     |\n| `--page-limit \u003CN>`  | Max pages to fetch                             | 10      |\n| `--page-delay \u003CMS>` | Delay between pages                            | 100 ms  |\n\n### Google Sheets — Shell Escaping\n\nSheets ranges use `!` which bash interprets as history expansion. Always wrap values in **single quotes**:\n\n```bash\n# Read cells A1:C10 from \"Sheet1\"\ngws sheets spreadsheets values get \\\n  --params '{\"spreadsheetId\": \"SPREADSHEET_ID\", \"range\": \"Sheet1!A1:C10\"}'\n\n# Append rows\ngws sheets spreadsheets values append \\\n  --params '{\"spreadsheetId\": \"ID\", \"range\": \"Sheet1!A1\", \"valueInputOption\": \"USER_ENTERED\"}' \\\n  --json '{\"values\": [[\"Name\", \"Score\"], [\"Alice\", 95]]}'\n```\n\n### Helper Commands\n\nSome services ship hand-crafted helper commands alongside the auto-generated Discovery surface. Helper commands are prefixed with `+` so they are visually distinct and never collide with Discovery-generated method names.\n\nTime-aware helpers (`+agenda`, `+standup-report`, `+weekly-digest`, `+meeting-prep`) automatically use your **Google account timezone** (fetched from Calendar Settings API and cached for 24 hours). Override with `--timezone`\u002F`--tz` on `+agenda`, or set the `--timezone` flag for explicit control.\n\nRun `gws \u003Cservice> --help` to see both Discovery methods and helper commands together.\n\n```bash\ngws gmail --help      # shows +send, +reply, +reply-all, +forward, +triage, +watch …\ngws calendar --help   # shows +insert, +agenda …\ngws drive --help      # shows +upload …\n```\n\n**Full helper reference:**\n\n| Service | Command | Description |\n|---------|---------|-------------|\n| `gmail` | `+send` | Send an email |\n| `gmail` | `+reply` | Reply to a message (handles threading automatically) |\n| `gmail` | `+reply-all` | Reply-all to a message |\n| `gmail` | `+forward` | Forward a message to new recipients |\n| `gmail` | `+triage` | Show unread inbox summary (sender, subject, date) |\n| `gmail` | `+watch` | Watch for new emails and stream them as NDJSON |\n| `sheets` | `+append` | Append a row to a spreadsheet |\n| `sheets` | `+read` | Read values from a spreadsheet |\n| `docs` | `+write` | Append text to a document |\n| `chat` | `+send` | Send a message to a space |\n| `drive` | `+upload` | Upload a file with automatic metadata |\n| `calendar` | `+insert` | Create a new event |\n| `calendar` | `+agenda` | Show upcoming events (uses Google account timezone; override with `--timezone`) |\n| `script` | `+push` | Replace all files in an Apps Script project with local files |\n| `workflow` | `+standup-report` | Today's meetings + open tasks as a standup summary |\n| `workflow` | `+meeting-prep` | Prepare for your next meeting: agenda, attendees, and linked docs |\n| `workflow` | `+email-to-task` | Convert a Gmail message into a Google Tasks entry |\n| `workflow` | `+weekly-digest` | Weekly summary: this week's meetings + unread email count |\n| `workflow` | `+file-announce` | Announce a Drive file in a Chat space |\n| `events` | `+subscribe` | Subscribe to Workspace events and stream them as NDJSON |\n| `events` | `+renew` | Renew\u002Freactivate Workspace Events subscriptions |\n| `modelarmor` | `+sanitize-prompt` | Sanitize a user prompt through a Model Armor template |\n| `modelarmor` | `+sanitize-response` | Sanitize a model response through a Model Armor template |\n| `modelarmor` | `+create-template` | Create a new Model Armor template |\n\n**Examples:**\n\n```bash\n# Send an email\ngws gmail +send --to alice@example.com --subject \"Hello\" --body \"Hi there\"\n\n# Reply to a message\ngws gmail +reply --message-id MESSAGE_ID --body \"Thanks!\"\n\n# Append a row to a spreadsheet\ngws sheets +append --spreadsheet SPREADSHEET_ID --values \"Alice,95\"\n\n# Show today's calendar agenda\ngws calendar +agenda\n\n# Upload a file to Drive\ngws drive +upload .\u002Freport.pdf --name \"Q1 Report\"\n\n# Morning standup summary\ngws workflow +standup-report\n\n# Show today's agenda in a specific timezone\ngws calendar +agenda --today --timezone America\u002FNew_York\n```\n\n### Model Armor (Response Sanitization)\n\nIntegrate [Google Cloud Model Armor](https:\u002F\u002Fcloud.google.com\u002Fsecurity\u002Fproducts\u002Fmodel-armor) to scan API responses for prompt injection before they reach your agent.\n\n```bash\ngws gmail users messages get --params '...' \\\n  --sanitize \"projects\u002FP\u002Flocations\u002FL\u002Ftemplates\u002FT\"\n```\n\n| Variable                                 | Description                  |\n| ---------------------------------------- | ---------------------------- |\n| `GOOGLE_WORKSPACE_CLI_SANITIZE_TEMPLATE` | Default Model Armor template |\n| `GOOGLE_WORKSPACE_CLI_SANITIZE_MODE`     | `warn` (default) or `block`  |\n\n## Environment Variables\n\nAll variables are optional. See [`.env.example`](.env.example) for a copy-paste template.\n\n| Variable | Description |\n|---|---|\n| `GOOGLE_WORKSPACE_CLI_TOKEN` | Pre-obtained OAuth2 access token (highest priority) |\n| `GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE` | Path to OAuth credentials JSON (user or service account) |\n| `GOOGLE_WORKSPACE_CLI_CLIENT_ID` | OAuth client ID (alternative to `client_secret.json`) |\n| `GOOGLE_WORKSPACE_CLI_CLIENT_SECRET` | OAuth client secret (paired with `CLIENT_ID`) |\n| `GOOGLE_WORKSPACE_CLI_CONFIG_DIR` | Override config directory (default: `~\u002F.config\u002Fgws`) |\n| `GOOGLE_WORKSPACE_CLI_SANITIZE_TEMPLATE` | Default Model Armor template |\n| `GOOGLE_WORKSPACE_CLI_SANITIZE_MODE` | `warn` (default) or `block` |\n| `GOOGLE_WORKSPACE_CLI_LOG` | Log level for stderr (e.g., `gws=debug`). Off by default. |\n| `GOOGLE_WORKSPACE_CLI_LOG_FILE` | Directory for JSON log files with daily rotation. Off by default. |\n| `GOOGLE_WORKSPACE_PROJECT_ID` | GCP project ID override for quota\u002Fbilling and fallback for helper commands |\n\nEnvironment variables can also be set in a `.env` file (loaded via [dotenvy](https:\u002F\u002Fcrates.io\u002Fcrates\u002Fdotenvy)).\n\n## Exit Codes\n\n`gws` uses structured exit codes so scripts can branch on the failure type without parsing error output.\n\n| Code | Meaning | Example cause |\n|------|---------|---------------|\n| `0` | Success | Command completed normally |\n| `1` | API error | Google returned a 4xx\u002F5xx response |\n| `2` | Auth error | Credentials missing, expired, or invalid |\n| `3` | Validation error | Bad arguments, unknown service, invalid flag |\n| `4` | Discovery error | Could not fetch the API schema document |\n| `5` | Internal error | Unexpected failure |\n\n```bash\ngws drive files list --params '{\"fileId\": \"bad\"}'\necho $?   # 1 — API error\n\ngws unknown-service files list\necho $?   # 3 — validation error (unknown service)\n```\n\n## Architecture\n\n`gws` uses a **two-phase parsing** strategy:\n\n1. Read `argv[1]` to identify the service (e.g. `drive`)\n2. Fetch the service's Discovery Document (cached 24 h)\n3. Build a `clap::Command` tree from the document's resources and methods\n4. Re-parse the remaining arguments\n5. Authenticate, build the HTTP request, execute\n\nAll output — success, errors, download metadata — is structured JSON.\n\n## Troubleshooting\n\n### \"Access blocked\" or 403 during login\n\nYour OAuth app is in **testing mode** and your account is not listed as a test user.\n\n**Fix:** Open the [OAuth consent screen](https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials\u002Fconsent) in your GCP project → **Test users** → **Add users** → enter your Google account email. Then retry `gws auth login`.\n\n### \"Google hasn't verified this app\"\n\nExpected when your app is in testing mode. Click **Advanced** → **Go to \\\u003Capp name\\> (unsafe)** to proceed. This is safe for personal use; verification is only required to publish the app to other users.\n\n### Too many scopes \u002F consent screen error\n\nUnverified (testing mode) apps are limited to ~25 OAuth scopes. The `recommended` scope preset includes many scopes and will exceed this limit.\n\n**Fix:** Select only the scopes you need:\n\n```bash\ngws auth login --scopes drive,gmail,calendar\n```\n\n### `gcloud` CLI not found\n\n`gws auth setup` requires the `gcloud` CLI to automate project creation. You have three options:\n\n1. [Install gcloud](https:\u002F\u002Fcloud.google.com\u002Fsdk\u002Fdocs\u002Finstall) and use `gcloud` directly.\n2. Re-run `gws auth setup` which wraps `gcloud` calls.\n3. Skip `gcloud` entirely — set up OAuth credentials manually in the [Cloud Console](#manual-oauth-setup-google-cloud-console)\n\n### `redirect_uri_mismatch`\n\nThe OAuth client was not created as a **Desktop app** type. In the [Credentials](https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials) page, delete the existing client, create a new one with type **Desktop app**, and download the new JSON.\n\n### API not enabled — `accessNotConfigured`\n\nIf a required Google API is not enabled for your GCP project, you will see a\n403 error with reason `accessNotConfigured`:\n\n```json\n{\n  \"error\": {\n    \"code\": 403,\n    \"message\": \"Gmail API has not been used in project 549352339482 ...\",\n    \"reason\": \"accessNotConfigured\",\n    \"enable_url\": \"https:\u002F\u002Fconsole.developers.google.com\u002Fapis\u002Fapi\u002Fgmail.googleapis.com\u002Foverview?project=549352339482\"\n  }\n}\n```\n\n`gws` also prints an actionable hint to **stderr**:\n\n```\n💡 API not enabled for your GCP project.\n   Enable it at: https:\u002F\u002Fconsole.developers.google.com\u002Fapis\u002Fapi\u002Fgmail.googleapis.com\u002Foverview?project=549352339482\n   After enabling, wait a few seconds and retry your command.\n```\n\n**Steps to fix:**\n\n1. Click the `enable_url` link (or copy it from the `enable_url` JSON field).\n2. In the GCP Console, click **Enable**.\n3. Wait ~10 seconds, then retry your `gws` command.\n\n> [!TIP]\n> You can also run `gws auth setup` which walks you through enabling all required\n> APIs for your project automatically.\n\n## Development\n\n```bash\ncargo build                       # dev build\ncargo clippy -- -D warnings       # lint\ncargo test                        # unit tests\n.\u002Fscripts\u002Fcoverage.sh             # HTML coverage report → target\u002Fllvm-cov\u002Fhtml\u002F\n```\n\n## License\n\nApache-2.0\n\n## Disclaimer\n\n> [!CAUTION]\n> This is **not** an officially supported Google product.\n","googleworkspace\u002Fcli 是一个命令行工具，用于管理 Google Workspace 的各项服务，包括 Drive、Gmail、Calendar、Sheets、Docs、Chat 和 Admin 等。该工具基于 Rust 语言开发，能够通过 Google Discovery Service 动态构建命令，支持结构化的 JSON 输出，并且集成了 40 多种 AI 代理技能，适用于需要自动化处理 Google Workspace 相关任务的场景，如批量文件操作、日历事件管理等。其零样板代码的设计理念使得用户可以更高效地进行开发和维护工作。",2,"2026-06-11 03:02:56","top_language"]