Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
48c7196
feat(gmail): add +reply, +reply-all, and +forward helper commands
HeroSizy Mar 5, 2026
11b0ec4
fix(gmail): encode message_id in URL path and fix auth signature
HeroSizy Mar 5, 2026
dd4eae2
refactor(gmail): extract send_raw_email and deduplicate handlers
HeroSizy Mar 5, 2026
a87f874
fix(gmail): register --dry-run flag on reply/forward commands
HeroSizy Mar 5, 2026
8c6cf3a
chore: add changeset for gmail reply/forward feature
HeroSizy Mar 5, 2026
1ea0b4a
style: apply cargo fmt formatting
HeroSizy Mar 5, 2026
72f7548
fix(gmail): register --dry-run flag on +send command
HeroSizy Mar 5, 2026
c1da3b0
fix(gmail): honor Reply-To header and use exact address matching
HeroSizy Mar 5, 2026
f50ae61
test(gmail): add comprehensive coverage for reply address handling
HeroSizy Mar 5, 2026
467eedc
Improves reply-all recipient deduplication
HeroSizy Mar 5, 2026
342f57f
style(gmail): add missing Apache 2.0 copyright headers
HeroSizy Mar 5, 2026
4338cb8
fix(gmail): use try_get_one for optional --remove arg in +reply
HeroSizy Mar 5, 2026
2d5e023
feat(gmail): support --dry-run without auth for reply/forward commands
HeroSizy Mar 5, 2026
0a9fa81
fix(gmail): use RFC-aware mailbox list parsing for recipient splitting
HeroSizy Mar 5, 2026
f34aad6
fix(gmail): handle escaped quotes in mailbox list splitting
HeroSizy Mar 5, 2026
bc77aaa
fix(gmail): address PR review feedback for reply/forward helpers
HeroSizy Mar 6, 2026
ffbea8a
fix(gmail): address review feedback for reply/forward helpers
HeroSizy Mar 6, 2026
e76b72a
fix(gmail): Gmail reply and forward helpers
HeroSizy Mar 6, 2026
b5f2988
fix(gmail): refactor shared reply-forward helpers
HeroSizy Mar 6, 2026
14b9487
Preserve repeated Gmail address headers
HeroSizy Mar 7, 2026
9b53621
chore: regenerate skills [skip ci]
github-actions[bot] Mar 7, 2026
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
10 changes: 10 additions & 0 deletions .changeset/gmail-reply-forward.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@googleworkspace/cli": minor
---

feat(gmail): add +reply, +reply-all, and +forward helpers

Adds three new Gmail helper commands:
- `+reply` -- reply to a message with automatic threading
- `+reply-all` -- reply to all recipients with --remove/--cc support
- `+forward` -- forward a message to new recipients
3 changes: 3 additions & 0 deletions docs/skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ Shortcut commands for common operations.
| [gws-sheets-read](../skills/gws-sheets-read/SKILL.md) | Google Sheets: Read values from a spreadsheet. |
| [gws-gmail-send](../skills/gws-gmail-send/SKILL.md) | Gmail: Send an email. |
| [gws-gmail-triage](../skills/gws-gmail-triage/SKILL.md) | Gmail: Show unread inbox summary (sender, subject, date). |
| [gws-gmail-reply](../skills/gws-gmail-reply/SKILL.md) | Gmail: Reply to a message (handles threading automatically). |
| [gws-gmail-reply-all](../skills/gws-gmail-reply-all/SKILL.md) | Gmail: Reply-all to a message (handles threading automatically). |
| [gws-gmail-forward](../skills/gws-gmail-forward/SKILL.md) | Gmail: Forward a message to new recipients. |
| [gws-gmail-watch](../skills/gws-gmail-watch/SKILL.md) | Gmail: Watch for new emails and stream them as NDJSON. |
| [gws-calendar-insert](../skills/gws-calendar-insert/SKILL.md) | Google Calendar: Create a new event. |
| [gws-calendar-agenda](../skills/gws-calendar-agenda/SKILL.md) | Google Calendar: Show upcoming events across all calendars. |
Expand Down
52 changes: 52 additions & 0 deletions skills/gws-gmail-forward/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
name: gws-gmail-forward
version: 1.0.0
description: "Gmail: Forward a message to new recipients."
metadata:
openclaw:
category: "productivity"
requires:
bins: ["gws"]
cliHelp: "gws gmail +forward --help"
---

# gmail +forward

> **PREREQUISITE:** Read `../gws-shared/SKILL.md` for auth, global flags, and security rules. If missing, run `gws generate-skills` to create it.
Forward a message to new recipients

## Usage

```bash
gws gmail +forward --message-id <ID> --to <EMAILS>
```

## Flags

| Flag | Required | Default | Description |
|------|----------|---------|-------------|
| `--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) |
| `--cc` ||| CC recipients (comma-separated) |
| `--body` ||| Optional note to include above the forwarded message |
| `--dry-run` ||| Show the request that would be sent without executing it |

## 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
```

## Tips

- Includes the original message with sender, date, subject, and recipients.
- Sends the forward as a new message rather than forcing it into the original thread.

## See Also

- [gws-shared](../gws-shared/SKILL.md) — Global flags and auth
- [gws-gmail](../gws-gmail/SKILL.md) — All send, read, and manage email commands
54 changes: 54 additions & 0 deletions skills/gws-gmail-reply-all/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
name: gws-gmail-reply-all
version: 1.0.0
description: "Gmail: Reply-all to a message (handles threading automatically)."
metadata:
openclaw:
category: "productivity"
requires:
bins: ["gws"]
cliHelp: "gws gmail +reply-all --help"
---

# gmail +reply-all

> **PREREQUISITE:** Read `../gws-shared/SKILL.md` for auth, global flags, and security rules. If missing, run `gws generate-skills` to create it.
Reply-all to a message (handles threading automatically)

## Usage

```bash
gws gmail +reply-all --message-id <ID> --body <TEXT>
```

## Flags

| Flag | Required | Default | Description |
|------|----------|---------|-------------|
| `--message-id` ||| Gmail message ID to reply to |
| `--body` ||| Reply body (plain text) |
| `--from` ||| Sender address (for send-as/alias; omit to use account default) |
| `--cc` ||| Additional CC recipients (comma-separated) |
| `--remove` ||| Exclude recipients from the outgoing reply (comma-separated emails) |
| `--dry-run` ||| Show the request that would be sent without executing it |

## Examples

```bash
gws gmail +reply-all --message-id 18f1a2b3c4d --body 'Sounds good to me!'
gws gmail +reply-all --message-id 18f1a2b3c4d --body 'Updated' --remove bob@example.com
gws gmail +reply-all --message-id 18f1a2b3c4d --body 'Adding Eve' --cc eve@example.com
```

## Tips

- Replies to the sender and all original To/CC recipients.
- Use --remove to exclude recipients from the outgoing reply, including the sender or Reply-To target.
- The command fails if exclusions leave no reply target.
- Use --cc to add new recipients.

## See Also

- [gws-shared](../gws-shared/SKILL.md) — Global flags and auth
- [gws-gmail](../gws-gmail/SKILL.md) — All send, read, and manage email commands
51 changes: 51 additions & 0 deletions skills/gws-gmail-reply/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
name: gws-gmail-reply
version: 1.0.0
description: "Gmail: Reply to a message (handles threading automatically)."
metadata:
openclaw:
category: "productivity"
requires:
bins: ["gws"]
cliHelp: "gws gmail +reply --help"
---

# gmail +reply

> **PREREQUISITE:** Read `../gws-shared/SKILL.md` for auth, global flags, and security rules. If missing, run `gws generate-skills` to create it.

Reply to a message (handles threading automatically)

## Usage

```bash
gws gmail +reply --message-id <ID> --body <TEXT>
```

## Flags

| Flag | Required | Default | Description |
|------|----------|---------|-------------|
| `--message-id` | ✓ | — | Gmail message ID to reply to |
| `--body` | ✓ | — | Reply body (plain text) |
| `--from` | — | — | Sender address (for send-as/alias; omit to use account default) |
| `--cc` | — | — | Additional CC recipients (comma-separated) |
| `--dry-run` | — | — | Show the request that would be sent without executing it |

## Examples

```bash
gws gmail +reply --message-id 18f1a2b3c4d --body 'Thanks, got it!'
gws gmail +reply --message-id 18f1a2b3c4d --body 'Looping in Carol' --cc carol@example.com
```

## Tips

- Automatically sets In-Reply-To, References, and threadId headers.
- Quotes the original message in the reply body.
- For reply-all, use +reply-all instead.

## See Also

- [gws-shared](../gws-shared/SKILL.md) — Global flags and auth
- [gws-gmail](../gws-gmail/SKILL.md) — All send, read, and manage email commands
1 change: 1 addition & 0 deletions skills/gws-gmail-send/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ gws gmail +send --to <EMAIL> --subject <SUBJECT> --body <TEXT>
| `--to` ||| Recipient email address |
| `--subject` ||| Email subject |
| `--body` ||| Email body (plain text) |
| `--dry-run` ||| Show the request that would be sent without executing it |

## Examples

Expand Down
3 changes: 3 additions & 0 deletions skills/gws-gmail/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ gws gmail <resource> <method> [flags]
|---------|-------------|
| [`+send`](../gws-gmail-send/SKILL.md) | Send an email |
| [`+triage`](../gws-gmail-triage/SKILL.md) | Show unread inbox summary (sender, subject, date) |
| [`+reply`](../gws-gmail-reply/SKILL.md) | Reply to a message (handles threading automatically) |
| [`+reply-all`](../gws-gmail-reply-all/SKILL.md) | Reply-all to a message (handles threading automatically) |
| [`+forward`](../gws-gmail-forward/SKILL.md) | Forward a message to new recipients |
| [`+watch`](../gws-gmail-watch/SKILL.md) | Watch for new emails and stream them as NDJSON |

## API Resources
Expand Down
Loading