Commit Graph

580 Commits

Author SHA1 Message Date
Peter Steinberger
b6c09b834e fix: land PR #158 + restore contact helper compile flow (thanks @robnew)
Some checks failed
ci / test (push) Has been cancelled
ci / worker (push) Has been cancelled
ci / darwin-cgo-build (push) Has been cancelled
2026-02-16 05:48:29 +01:00
Rob Newberry
67fe654cfe Fix invalid Go version in go.mod 2026-02-16 05:45:28 +01:00
Peter Steinberger
957603e84c refactor(contacts): simplify field updates and custom parser contract 2026-02-16 05:34:22 +01:00
Peter Steinberger
2300560505 docs(changelog): include PR #199 landing note 2026-02-16 05:28:08 +01:00
Peter Steinberger
879466b706 fix(contacts): hard-validate custom and sort output 2026-02-16 05:28:08 +01:00
OpenClaw
4276d925e8 feat(contacts): add support for additional fields
Add support for the following contact fields in create/update commands:
- --org: Organization/company name
- --title: Job title
- --url: URLs (can be repeated for multiple)
- --note: Note/biography
- --custom: Custom key=value fields (can be repeated)

Also updates the read mask to include these fields in list/get output.

Closes #198
2026-02-16 05:28:08 +01:00
Peter Steinberger
888e7d9b6a refactor(cmd): tidy gmail watch history parsing tests 2026-02-16 04:50:08 +01:00
Peter Steinberger
a0af7d9ae8 refactor(cmd): optimize gmail watch history parsing 2026-02-16 04:48:48 +01:00
Peter Steinberger
8d7895df6c feat(gmail): land history types watch filtering (#168)
Co-authored-by: salmonumbrella <182032677+salmonumbrella@users.noreply.github.com>
2026-02-16 04:39:03 +01:00
Peter Steinberger
a50c3ca158 refactor(calendar): dedupe scope validation and attendee no-op handling 2026-02-16 04:02:05 +01:00
Peter Steinberger
bd9ce712d5 test(calendar): assert send-updates for scope=future patches 2026-02-16 03:54:10 +01:00
Peter Steinberger
5c3a506f38 docs: document sheets insert + notes 2026-02-16 03:29:58 +01:00
Peter Steinberger
039e296324 fix(sheets): polish insert command (#203) (thanks @andybergon) 2026-02-16 03:26:41 +01:00
Andrea Bergonzo
5a54fdc5ce fix: align sheets insert with upstream API changes
Pass context to outfmt.WriteJSON (signature changed upstream) and
use normalizeGoogleID for spreadsheet ID consistency.
2026-02-16 03:26:41 +01:00
Andrea Bergonzo
ccd680ec63 feat(sheets): add insert subcommand for rows and columns
Adds `gog sheets insert <id> <sheet> <rows|cols> <start>` to insert
empty rows or columns at a specific position using the Sheets API
InsertDimensionRequest via batchUpdate.

Supports --count for multiple rows/columns and --after to insert after
the specified position instead of before.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 03:26:41 +01:00
zerone0x
3a6dae30d4
fix(secrets): recognize empty GOG_KEYRING_PASSWORD in non-TTY environments (#269)
* fix(secrets): recognize empty GOG_KEYRING_PASSWORD in non-TTY environments

Use os.LookupEnv to distinguish between "env var not set" and "env var
set to empty string". Previously fileKeyringPasswordFuncFrom checked
password != "", which caused an empty passphrase to fall through to the
TTY prompt path, failing in headless/CI environments.

Fixes #268

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(secrets): respect empty GOG_KEYRING_PASSWORD (#269) (thanks @zerone0x)

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-15 14:11:26 +01:00
Sebastián Rodríguez
a2e486750c
fix: only patch Attendees in calendar respond to avoid reminders vali… (#265)
* fix: only patch Attendees in calendar respond to avoid reminders validation error

When responding to a calendar event, the previous code was patching the
entire event object including Reminders. This caused a Google API error
'Missing override reminder minutes' when the event had custom reminders.

The fix creates a minimal patch object containing only the Attendees
field, avoiding the reminders validation issue.

Fixes events with custom reminders failing to accept RSVP responses.

* fix(calendar): add RSVP reminders regression test (#265) (thanks @sebasrodriguez)

---------

Co-authored-by: J.A.R.V.I.S. <sebasrodriguez@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-15 05:30:51 +01:00
Peter Steinberger
d3fe8d45d2 chore: start 0.12.0-dev 2026-02-15 04:50:42 +01:00
Peter Steinberger
268c5b8e6f docs: refresh readme/spec for 0.11 2026-02-15 04:35:09 +01:00
Peter Steinberger
91c4c15884 chore(release): v0.11.0
Some checks failed
ci / test (push) Has been cancelled
ci / worker (push) Has been cancelled
ci / darwin-cgo-build (push) Has been cancelled
2026-02-15 04:28:24 +01:00
Peter Steinberger
2217180c9e docs(changelog): reorder unreleased entries 2026-02-15 04:25:51 +01:00
Peter Steinberger
e942022546
refactor: drive raw-query flag + mail address list parsing (#267)
* refactor(cmd): centralize all literal

* feat(drive): add --raw-query to search

* refactor(gmail): parse comma-separated address lists
2026-02-15 04:23:28 +01:00
Peter Steinberger
37b5b6cb6f test(drive): add httptest helpers 2026-02-15 04:16:13 +01:00
Peter Steinberger
f1c2b9dbab refactor(cmd): unify result output 2026-02-15 04:16:13 +01:00
Peter Steinberger
4272c684f4
fix(drive,gmail): pass through Drive filters + encode non-ASCII headers (#266)
* fix(drive,gmail): pass-through filter queries and encode non-ASCII headers

Drive search now detects raw API filter syntax (field comparisons,
contains, membership, has) and passes it through instead of wrapping
in fullText contains. Plain-text searches always append trashed=false
to prevent false positives.

Gmail MIME now RFC 2047-encodes display names with non-ASCII characters
in From/To/Cc/Bcc/Reply-To headers using net/mail.

Fixes #254, fixes #255

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(drive,gmail): tighten trashed predicate detection

* chore(lint): silence goconst for auth services

* fix(auth): avoid goconst on services=all

---------

Co-authored-by: salmonumbrella <182032677+salmonumbrella@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 04:00:09 +01:00
Peter Steinberger
7dbf57e191 fix(drive): add trash output + delete tests 2026-02-15 01:35:11 +01:00
laihenyi
ee1dd3da2d
fix(drive): delete command now moves to trash instead of permanent deletion (#262)
`drive delete` was calling `Files.Delete()` which permanently destroys
files. This contradicts the help text ("moves to trash") and user
expectations. The fix changes the default behavior to use
`Files.Update()` with `Trashed: true`, which moves files to trash
(recoverable for 30 days).

A new `--permanent` flag is added for users who explicitly want
irreversible deletion.

Fixes #261

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:33:52 +01:00
Alexandro T. Netto
49af127679
feat: add docs comments subcommand for managing Google Doc comments (#263)
* feat: add `docs comments` subcommand for managing Google Doc comments

Add a full `gog docs comments` command tree that provides a
doc-centric interface for managing comments on Google Docs via
the Drive API v3 comments endpoint.

Subcommands:
  list    - List comments (filters resolved by default, --include-resolved to show all)
  get     - Get a single comment with full details including replies
  add     - Add a comment, optionally anchored to quoted text
  reply   - Reply to a comment
  resolve - Resolve a comment (mark as done), with optional message
  delete  - Delete a comment

Key differences from `drive comments`:
- `list` filters resolved comments by default (--include-resolved to include)
- `list` always shows quoted text column (no separate flag needed)
- `resolve` subcommand (drive comments has no equivalent)
- Accepts Google Doc URLs in addition to bare IDs (via normalizeGoogleID)
- Doc-centric naming and help text

Follows existing patterns: uses shared helpers (collectAllPages,
tableWriter, formatDateTime, truncateString, normalizeGoogleID,
failEmptyExit, dryRunExit, confirmDestructive), same auth/token
flow, consistent output formatting.

* fix: improve docs comments list and anchoring (#263) (thanks @alextnetto)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-15 00:49:34 +01:00
Andrea Bergonzo
c530eb309d
feat: add sheets notes command to read cell notes (#208)
* feat: add `sheets notes` command to read cell notes

The existing `sheets get` uses the Values API which doesn't expose cell
notes. This adds `sheets notes <spreadsheetId> <range>` which uses the
full Spreadsheets.Get API with a narrow field mask to fetch only notes
and formatted values, keeping the response payload minimal.

Supports both text (tabwriter table) and JSON output modes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: harden sheets notes output (#208) (thanks @andybergon)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 23:25:49 +01:00
Peter Steinberger
b9582f2e6c docs(readme): document recent features 2026-02-14 23:06:55 +01:00
Toni Melisma
2c7426711c
feat(calendar): add --send-updates flag to update and delete commands (#163)
* feat(calendar): add --send-updates flag to update and delete commands

Add --send-updates flag to CalendarUpdateCmd and CalendarDeleteCmd to
control notification behavior when modifying or canceling events with
attendees.

Without this flag, attendees are not notified of updates or cancellations,
causing:
- Stale events remaining in attendees' calendars
- Duplicate/overlapping events when updates are made
- Data synchronization issues for systems managing calendars at arm's length

Changes:
- Add SendUpdates field to CalendarUpdateCmd and CalendarDeleteCmd
- Validate SendUpdates value (all, externalOnly, none)
- Pass SendUpdates to Patch and Delete API calls
- Update truncateParentRecurrence helper to accept sendUpdates parameter
- Add tests for validation and API integration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(calendar): add integration tests for --send-updates flag

Add TestCalendarSendUpdates Go integration test and shell live test
that verify attendee notifications are sent on create/update/delete.

Tests are opt-in via GOG_IT_ATTENDEE / GOG_LIVE_CALENDAR_ATTENDEE env vars.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(calendar): polish --send-updates landing

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 23:02:27 +01:00
Abdul Kareem
b0a9223347 feat(docs): added install instruction for AUR 2026-02-14 22:36:50 +01:00
Peter Steinberger
8cc8b13654 refactor(gmail): simplify quoting + reply fetch + test helpers 2026-02-14 22:32:16 +01:00
Peter Steinberger
afb5bea2d5 docs(readme): mention gmail send --quote 2026-02-14 22:05:55 +01:00
Peter Steinberger
951437db54 docs(changelog): mention gmail send --quote (#169) (thanks @terry-li-hm) 2026-02-14 21:52:24 +01:00
Terry Li
8acdc43419
feat: add --quote flag to include original message in replies (#169)
* feat: add --quote flag to include original message in replies

Adds a --quote flag to gog gmail send that automatically quotes the original message when replying.

Changes:
- Added --quote flag to GmailSendCmd struct
- Modified fetchReplyInfo to optionally fetch message body
- Added formatQuotedMessage function for attribution and quoting
- Updated validation to require reply target when --quote is used

* feat(gmail): add --quote flag to gmail send command

Add automatic message quoting when replying to emails. The new --quote flag
includes the original message body with proper attribution line and quote
prefixes when using --reply-to-message-id or --thread-id.

Changes:
- Add Quote bool flag to GmailSendCmd struct
- Validate --quote requires reply target (--reply-to-message-id or --thread-id)
- Modify fetchReplyInfo to support fetching full message format for quoting
- Add Date and Body fields to replyInfo struct
- Add formatQuotedMessage function to format original message as quote
- Append quoted message to user's body when --quote is set
- Update test calls to replyInfoFromMessage with new includeBody parameter
- Use gmailFormatFull/gmailFormatMetadata constants instead of string literals
- Use body += for appending instead of body = body +

* feat(gmail): add HTML blockquote support for --quote feature

* fix(gmail): include user body in HTML when using --quote

* feat(gmail): preserve original HTML formatting when quoting

* fix(gmail): handle --body-file and --body-html edge cases with --quote

* fix(gmail): handle HTML-only messages when using --quote

- Quote now works when original message has only HTML content (no plain text body)
- Removed unused formatQuotedMessageHTML function

Fixes edge cases where --quote would skip messages with HTML-only bodies.

* fix(gmail): harden --quote body selection + watch includeBody format (#169) (thanks @terry-li-hm)

---------

Co-authored-by: OpenCode <opencode@local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 21:51:09 +01:00
Peter Steinberger
43f3317671 docs(changelog): mention download --format validation (#259) 2026-02-14 20:57:12 +01:00
Peter Steinberger
0d810f5c68 fix(drive): validate drive download --format values 2026-02-14 20:57:12 +01:00
Peter Steinberger
ae103ced07 docs(changelog): mention --no-all-drives (#258) 2026-02-14 20:43:10 +01:00
Peter Steinberger
3d9c618ce0 feat(drive): add --no-all-drives to ls/search 2026-02-14 20:43:10 +01:00
Peter Steinberger
0ba7c46ba6 fix: land drive shared-drives + format validation (#256) (thanks @salmonumbrella)
Co-authored-by: salmonumbrella <182032677+salmonumbrella@users.noreply.github.com>
2026-02-14 20:18:54 +01:00
Peter Steinberger
57cdae812a fix(drive): drop undocumented --format auto 2026-02-14 20:18:54 +01:00
salmonumbrella
51c5f7a099 docs(drive): add comment explaining shared drives query params
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-14 20:18:54 +01:00
salmonumbrella
dfc49b0538 fix(drive): include all drives in ls 2026-02-14 20:18:54 +01:00
salmonumbrella
2a8df09fd7 fix(drive): include shared drives in search 2026-02-14 20:18:54 +01:00
salmonumbrella
1a4df201cd test(drive): cover invalid download format 2026-02-14 20:18:54 +01:00
salmonumbrella
0c4978d2f7 fix(drive): validate download formats 2026-02-14 20:18:54 +01:00
Peter Steinberger
eb0bc8e695 docs(readme): document oauth client id policy 2026-02-14 19:36:31 +01:00
Peter Steinberger
366f7acbbb refactor(auth): split manual oauth flow 2026-02-14 18:44:37 +01:00
spookyuser
0e1f77dac0
fix(auth): use non-privileged port for manual OAuth redirect (#172)
* fix(auth): use non-privileged port for manual OAuth redirect

Change the manual auth flow redirect URI from http://localhost:1 to
http://127.0.0.1:9004. Port 1 is a privileged port that browsers may
block or handle differently, causing the redirect to fail. Using port
9004 (non-privileged) ensures the browser will properly attempt the
navigation and display the redirect URL in the address bar.

https://claude.ai/code/session_01Huxgf7YcpWvp6MzZGLyjcP

* fix(auth): use non-privileged port for manual OAuth redirect

Change the manual auth flow redirect URI from http://localhost:1 to
http://127.0.0.1:9004. Port 1 is a privileged port that browsers may
block or handle differently, causing the redirect to fail. Using port
9004 (non-privileged) ensures the browser will properly attempt the
navigation and display the redirect URL in the address bar.

https://claude.ai/code/session_01Huxgf7YcpWvp6MzZGLyjcP

* fix(auth): tighten manual oauth formatting

* docs(changelog): thank @spookyuser for #172

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 18:23:52 +01:00