Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 0 additions & 103 deletions .claude/skills/gws-sync.md

This file was deleted.

2 changes: 1 addition & 1 deletion gws/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "gws",
"version": "2.0.0",
"version": "2.1.0",
"description": "Google Workspace CLI skills for Gmail, Calendar, Drive, Docs, Sheets, Slides, Meet, and Tasks",
"author": {
"name": "cblecker"
Expand Down
42 changes: 33 additions & 9 deletions gws/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,39 @@ Multi-step productivity workflows:
- `gws-workflow-weekly-digest` - Weekly activity summary
- `gws-workflow-file-announce` - Share files with notifications

## Updating Skills

To sync with the latest upstream `gws` skills:

```text
/gws-sync
```

This runs the curation skill which compares upstream skills against your OAuth scopes and presents new, updated, or removed skills for review.
## Syncing Skills with Upstream

This plugin carries a curated subset of skills from the upstream
[gws CLI repository](https://github.com/googleworkspace/cli). The upstream
generates skills via `gws generate-skills` and publishes them under `skills/`
in the repo. We carry 28 of ~74 available skills (core services, helpers,
and workflows — no personas or recipes).

### Process

1. Check the installed CLI version (`gws --version`) against the latest
[upstream release](https://github.com/googleworkspace/cli/releases).
Update the CLI if needed.
2. For each local skill in `gws/skills/*/SKILL.md`, fetch the matching
file from `googleworkspace/cli` `skills/` on the `main` branch.
3. Overwrite the local file with the upstream content. Do not add local
customizations — take upstream wholesale.
4. Bump the plugin version in `.claude-plugin/plugin.json` (minor for
content-only updates).
Comment on lines +62 to +63

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n## Files\n'
git ls-files gws/README.md .claude/skills/gws-sync.md gws/.claude-plugin/plugin.json

printf '\n## README excerpt\n'
sed -n '50,80p' gws/README.md

printf '\n## Sync skill excerpt\n'
sed -n '1,220p' .claude/skills/gws-sync.md

printf '\n## Plugin manifest excerpt\n'
sed -n '1,120p' gws/.claude-plugin/plugin.json

Repository: cblecker/claude-plugins

Length of output: 4896


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n## Search for version-bump policy references\n'
rg -n --hidden --glob '!**/.git/**' \
  -e 'patch version' \
  -e 'minor for content-only updates' \
  -e 'bump the plugin version' \
  -e 'versioning' \
  -e 'semantic version' \
  gws .claude

printf '\n## Plugin manifest-related docs\n'
rg -n --hidden --glob '!**/.git/**' 'plugin.json|metadata.version|claude plugin validate' gws .claude

Repository: cblecker/claude-plugins

Length of output: 703


Align the version-bump rule between the README and sync skill. The README says content-only updates use a minor bump, but .claude/skills/gws-sync.md says to bump the patch version after syncing. Pick one policy and apply it consistently in both docs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@gws/README.md` around lines 62 - 63, The version-bump guidance is
inconsistent between the README and the gws sync skill. Update the policy in
both gws/README.md and .claude/skills/gws-sync.md so they match, using the same
bump rule for content-only updates and sync behavior. Refer to the plugin
version guidance around .claude-plugin/plugin.json and the sync/version
instructions in the gws-sync skill to keep the documentation consistent.

Source: Linked repositories

5. Validate: `claude plugin validate ./gws`

### Guidelines

- **Go pure upstream.** Local customizations (extra sections, modified
tips) create merge debt and tend to duplicate what the Claude Code
harness already handles (e.g., effort-level scaling via `CLAUDE_EFFORT`).
- **Frontmatter must match upstream format.** Version lives inside
`metadata.version`, not as a top-level field. YAML arrays use block
style (`- gws`), not inline (`["gws"]`).
- **New upstream skills** (chat, forms, keep, people, classroom, events,
script, admin-reports, modelarmor, personas, recipes) can be pulled in
by creating the corresponding `skills/<name>/` directory and copying
the upstream SKILL.md. No other files are needed per skill.

## Links

Expand Down
5 changes: 3 additions & 2 deletions gws/skills/gws-calendar-agenda/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-calendar-agenda
version: 1.0.0
description: "Google Calendar: Show upcoming events across all calendars."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws calendar +agenda --help"
---

Expand Down
9 changes: 6 additions & 3 deletions gws/skills/gws-calendar-insert/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-calendar-insert
version: 1.0.0
description: "Google Calendar: Create a new event."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws calendar +insert --help"
---

Expand All @@ -33,18 +34,20 @@ gws calendar +insert --summary <TEXT> --start <TIME> --end <TIME>
| `--location` | — | — | Event location |
| `--description` | — | — | Event description/body |
| `--attendee` | — | — | Attendee email (can be used multiple times) |
| `--meet` | — | — | Add a Google Meet video conference link |

## Examples

```bash
gws calendar +insert --summary 'Standup' --start '2026-06-17T09:00:00-07:00' --end '2026-06-17T09:30:00-07:00'
gws calendar +insert --summary 'Review' --start ... --end ... --attendee alice@example.com
gws calendar +insert --summary 'Meet' --start ... --end ... --meet
```

## Tips

- Use RFC3339 format for times (e.g. 2026-06-17T09:00:00-07:00).
- For recurring events or conference links, use the raw API instead.
- The --meet flag automatically adds a Google Meet link to the event.

> [!CAUTION]
> This is a **write** command — confirm with the user before executing.
Expand Down
6 changes: 3 additions & 3 deletions gws/skills/gws-calendar/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-calendar
version: 1.0.0
description: "Google Calendar: Manage calendars and events."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws calendar --help"
---

Expand Down Expand Up @@ -105,4 +106,3 @@ gws schema calendar.<resource>.<method>
```

Use `gws schema` output to build your `--params` and `--json` flags.

5 changes: 3 additions & 2 deletions gws/skills/gws-docs-write/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-docs-write
version: 1.0.0
description: "Google Docs: Append text to a document."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws docs +write --help"
---

Expand Down
6 changes: 3 additions & 3 deletions gws/skills/gws-docs/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-docs
version: 1.0.0
description: "Read and write Google Docs."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws docs --help"
---

Expand Down Expand Up @@ -45,4 +46,3 @@ gws schema docs.<resource>.<method>
```

Use `gws schema` output to build your `--params` and `--json` flags.

5 changes: 3 additions & 2 deletions gws/skills/gws-drive-upload/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-drive-upload
version: 1.0.0
description: "Google Drive: Upload a file with automatic metadata."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws drive +upload --help"
---

Expand Down
14 changes: 7 additions & 7 deletions gws/skills/gws-drive/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-drive
version: 1.0.0
description: "Google Drive: Manage files, folders, and shared drives."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws drive --help"
---

Expand Down Expand Up @@ -69,19 +70,19 @@ gws drive <resource> <method> [flags]
- `create` — Creates a shared drive. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).
- `get` — Gets a shared drive's metadata by ID. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).
- `hide` — Hides a shared drive from the default view. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).
- `list` — Lists the user's shared drives. This method accepts the `q` parameter, which is a search query combining one or more search terms. For more information, see the [Search for shared drives](/workspace/drive/api/guides/search-shareddrives) guide.
- `list` — Lists the user's shared drives. This method accepts the `q` parameter, which is a search query combining one or more search terms. For more information, see the [Search for shared drives](https://developers.google.com/workspace/drive/api/guides/search-shareddrives) guide.
- `unhide` — Restores a shared drive to the default view. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).
- `update` — Updates the metadata for a shared drive. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).

### files

- `copy` — Creates a copy of a file and applies any requested updates with patch semantics. For more information, see [Create and manage files](https://developers.google.com/workspace/drive/api/guides/create-file).
- `create` — Creates a file. For more information, see [Create and manage files](/workspace/drive/api/guides/create-file). This method supports an */upload* URI and accepts uploaded media with the following characteristics: - *Maximum file size:* 5,120 GB - *Accepted Media MIME types:* `*/*` (Specify a valid MIME type, rather than the literal `*/*` value. The literal `*/*` is only used to indicate that any valid MIME type can be uploaded.
- `create` — Creates a file. For more information, see [Create and manage files](https://developers.google.com/workspace/drive/api/guides/create-file). This method supports an */upload* URI and accepts uploaded media with the following characteristics: - *Maximum file size:* 5,120 GB - *Accepted Media MIME types:* `*/*` (Specify a valid MIME type, rather than the literal `*/*` value. The literal `*/*` is only used to indicate that any valid MIME type can be uploaded.
- `download` — Downloads the content of a file. For more information, see [Download and export files](https://developers.google.com/workspace/drive/api/guides/manage-downloads). Operations are valid for 24 hours from the time of creation.
- `export` — Exports a Google Workspace document to the requested MIME type and returns exported byte content. For more information, see [Download and export files](https://developers.google.com/workspace/drive/api/guides/manage-downloads). Note that the exported content is limited to 10 MB.
- `generateIds` — Generates a set of file IDs which can be provided in create or copy requests. For more information, see [Create and manage files](https://developers.google.com/workspace/drive/api/guides/create-file).
- `get` — Gets a file's metadata or content by ID. For more information, see [Search for files and folders](/workspace/drive/api/guides/search-files). If you provide the URL parameter `alt=media`, then the response includes the file contents in the response body. Downloading content with `alt=media` only works if the file is stored in Drive. To download Google Docs, Sheets, and Slides use [`files.export`](/workspace/drive/api/reference/rest/v3/files/export) instead.
- `list` — Lists the user's files. For more information, see [Search for files and folders](/workspace/drive/api/guides/search-files). This method accepts the `q` parameter, which is a search query combining one or more search terms. This method returns *all* files by default, including trashed files. If you don't want trashed files to appear in the list, use the `trashed=false` query parameter to remove trashed files from the results.
- `get` — Gets a file's metadata or content by ID. For more information, see [Search for files and folders](https://developers.google.com/workspace/drive/api/guides/search-files). If you provide the URL parameter `alt=media`, then the response includes the file contents in the response body. Downloading content with `alt=media` only works if the file is stored in Drive.
- `list` — Lists the user's files. For more information, see [Search for files and folders](https://developers.google.com/workspace/drive/api/guides/search-files). This method accepts the `q` parameter, which is a search query combining one or more search terms. This method returns *all* files by default, including trashed files. If you don't want trashed files to appear in the list, use the `trashed=false` query parameter to remove trashed files from the results.
- `listLabels` — Lists the labels on a file. For more information, see [List labels on a file](https://developers.google.com/workspace/drive/api/guides/list-labels).
- `modifyLabels` — Modifies the set of labels applied to a file. For more information, see [Set a label field on a file](https://developers.google.com/workspace/drive/api/guides/set-label). Returns a list of the labels that were added or modified.
- `update` — Updates a file's metadata, content, or both. When calling this method, only populate fields in the request that you want to modify. When updating fields, some fields might be changed automatically, such as `modifiedDate`. This method supports patch semantics. This method supports an */upload* URI and accepts uploaded media with the following characteristics: - *Maximum file size:* 5,120 GB - *Accepted Media MIME types:* `*/*` (Specify a valid MIME type, rather than the literal `*/*` value.
Expand Down Expand Up @@ -134,4 +135,3 @@ gws schema drive.<resource>.<method>
```

Use `gws schema` output to build your `--params` and `--json` flags.

24 changes: 19 additions & 5 deletions gws/skills/gws-gmail-forward/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
name: gws-gmail-forward
version: 1.0.0
description: "Gmail: Forward a message to new recipients."
metadata:
version: 0.22.5
openclaw:
category: "productivity"
requires:
bins: ["gws"]
bins:
- gws
cliHelp: "gws gmail +forward --help"
---

Expand All @@ -29,25 +30,38 @@ gws gmail +forward --message-id <ID> --to <EMAILS>
| `--message-id` | ✓ | — | Gmail message ID to forward |
| `--to` | ✓ | — | Recipient email address(es), comma-separated |
| `--from` | — | — | Sender address (for send-as/alias; omit to use account default) |
| `--body` | — | — | Optional note to include above the forwarded message (plain text, or HTML with --html) |
| `--no-original-attachments` | — | — | Do not include file attachments from the original message (inline images in --html mode are preserved) |
| `--attach` | — | — | Attach a file (can be specified multiple times) |
| `--cc` | — | — | CC email address(es), comma-separated |
| `--bcc` | — | — | BCC email address(es), comma-separated |
| `--body` | — | — | Optional note to include above the forwarded message (plain text, or HTML with --html) |
| `--html` | — | — | Send as HTML (formats forwarded block with Gmail styling; treat --body as HTML) |
| `--html` | — | — | Treat --body as HTML content (default is plain text) |
| `--dry-run` | — | — | Show the request that would be sent without executing it |
| `--draft` | — | — | Save as draft instead of sending |

## Examples

```bash
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --body 'FYI see below'
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --cc eve@example.com
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --bcc secret@example.com
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --body '<p>FYI</p>' --html
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com -a notes.pdf
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --no-original-attachments
gws gmail +forward --message-id 18f1a2b3c4d --to dave@example.com --draft
```

## Tips

- Includes the original message with sender, date, subject, and recipients.
- Original attachments are included by default (matching Gmail web behavior).
- With --html, inline images are also preserved via cid: references.
- In plain-text mode, inline images are not included (matching Gmail web).
- Use --no-original-attachments to forward without the original message's files.
- Use -a/--attach to add extra file attachments. Can be specified multiple times.
- Combined size of original and user attachments is limited to 25MB.
- With --html, the forwarded block uses Gmail's gmail_quote CSS classes and preserves HTML formatting. Use fragment tags (<p>, <b>, <a>, etc.) — no <html>/<body> wrapper needed.
- Use --draft to save the forward as a draft instead of sending it immediately.

## See Also

Expand Down
Loading
Loading