* fix(paths): expand ~ in user-provided file paths
When users specify paths with ~ (e.g., --out ~/Downloads/file.pdf) and
the path is quoted in the shell command, the tilde is not expanded by
the shell. This caused files to be written to a literal ~/Downloads
directory instead of the user's home directory.
Add config.ExpandPath() function that expands ~ at the beginning of
paths to the user's home directory. Apply this fix to all user-provided
file paths across:
- gmail attachment download (--out)
- drive download/export (--out)
- drive upload (localPath argument)
- auth token export (--out)
- auth credentials/import/keep (input paths)
- gmail thread attachments (--out-dir)
- gmail send/drafts (--attach)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(lint): address wrapcheck and wsl issues
* fix(calendar): support ISO 8601 time format and add 'list' alias
- Add parsing for ISO 8601 datetime with numeric timezone without colon
(e.g., 2026-01-09T16:38:41-0800), which is the format produced by
macOS `date +%Y-%m-%dT%H:%M:%S%z`
- Add 'list' as an alias for 'events' subcommand for more intuitive CLI
usage (gog calendar list instead of gog calendar events)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore(changelog): note PR #56
* chore(lint): dedupe file string
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Google Calendar API requires an explicit TimeZone field on EventDateTime
when creating recurring events. Without it, the API returns:
'Missing time zone definition for start time.'
This change extracts the timezone from the RFC3339 offset in the --from/--to
values and maps common US offsets to IANA timezone names.
Fixes recurring event creation via:
gog calendar create primary --summary 'Test' \
--from '2026-01-08T11:00:00-05:00' \
--to '2026-01-08T11:30:00-05:00' \
--rrule 'RRULE:FREQ=DAILY;INTERVAL=28'
On headless Linux systems (e.g., Raspberry Pi), gnome-keyring may be
installed but not running. When this happens, the keyring library's
attempt to connect to D-Bus SecretService hangs indefinitely.
This change adds two layers of protection:
1. D-Bus detection: If DBUS_SESSION_BUS_ADDRESS is not set and backend
is "auto", automatically use file backend (avoids hang entirely)
2. Timeout fallback: If D-Bus is present but unresponsive, timeout after
5 seconds with guidance to use file backend
The D-Bus detection handles the common case cleanly without goroutine
leaks. The timeout is a safety net for edge cases where D-Bus is set
but SecretService is still unresponsive.
Fixes#45
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>