- Patch only attendees array when declining, not full event object
- Add defensive guard in expandRepeatSchedule against infinite loop
- Add JSON output test for propose-time command
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace vague "error" framing with "API Limitation" label
- Add explicit "Action:" instruction to open issue tracker and click +1
- Rename JSON fields: limitation→api_limitation, error_message→upvote_action
- Update tests to verify new messaging format
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add the core Run method that:
- Fetches event from Google Calendar API
- Generates propose-time browser URL (base64 encoded)
- Optionally declines the event with comment
- Outputs JSON or text format
- Opens browser if --open flag is set
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use tab-separated format like other gog commands:
attachment\t<filename>\t<size>\t<mimeType>\t<attachmentId>
This matches the pattern used in calendar_print.go (attendee, attachment)
and drive.go for array data.
Add two test cases:
- TestGmailGetCmd_JSON_Full_WithAttachments: verifies attachments array
is present in JSON output with correct filename, size, mime type, and ID
- TestGmailGetCmd_Text_Full_WithAttachments: verifies plain text output
includes attachment info section with all expected fields
Display attachment filename, size, MIME type, and attachment_id in both
plain text and JSON output for the 'gmail get' command with --format=full.
This makes it easier to identify and download attachments without needing
to manually parse the message payload structure.
Example plain text output:
attachments:
CV-Document.pdf (192123 bytes, application/pdf)
attachment_id ANGjdJ...
Example JSON output (new field):
"attachments": [
{"Filename": "CV-Document.pdf", "Size": 192123, ...}
]
* feat(gmail): add timezone support for date output
Add --timezone and --local flags to gmail search and watch serve commands
to control how dates are displayed. By default uses local timezone.
Users can specify any IANA timezone (e.g., America/New_York, UTC).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(gmail): fix execute test for timezone changes
Update TestExecute_GmailSearch_JSON to use explicit --timezone UTC flag
and expect the correctly converted time (22:04 UTC from 15:04 -0700).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(gmail): add -z short flag for --timezone
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(gmail): add unit tests for resolveOutputLocation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs(gmail): clarify timezone flag help text
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(gmail): add timezone conversion tests for formatGmailDateInLocation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(config): add default_timezone setting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(gmail): support GOG_TIMEZONE env var and config for timezone
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(config): add gog config command for timezone and settings
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(calendar): respect GOG_TIMEZONE and config for timezone
Update calendar time command to follow the same timezone priority as gmail:
1. --timezone flag (explicit)
2. GOG_TIMEZONE env var
3. Config file default_timezone
4. Fall back to Google Calendar's timezone (calendar-specific fallback)
Add getConfiguredTimezone helper that returns nil when no explicit timezone
is configured, allowing calendar commands to use their own fallback behavior.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(gmail): add tests for GOG_TIMEZONE env var and getConfiguredTimezone
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(config): warn on invalid timezone instead of error
When default_timezone in config is invalid, print a warning to stderr
and fall back to local timezone instead of returning a hard error.
Invalid flag/env var still returns errors (user mistake in current
session), but invalid config should not break the CLI (stale config).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(gmail): remove unused formatGmailDate, add nolint directive
- Remove unused formatGmailDate wrapper function (all callers use
formatGmailDateInLocation directly with explicit location)
- Add nolint:nilnil directive to getConfiguredTimezone with explanation
that nil return signals caller to use its own fallback
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(timezone): honor --timezone local
* refactor(cli): unify config/timezone helpers
* test(cmd): isolate config env in timezone tests
* refactor(config): centralize config key metadata
* fix(config): drop unused key spec lookup
* fix(config): standardize config key errors
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Implements working shell completions for bash, zsh, fish, and PowerShell.
Changes:
- Add CompletionInternalCmd for kong's __complete helper
- Refactor completion generation to use kong's built-in support
- Extract newParser() for reuse in completion generation
- Add baseDescription() to avoid duplication
The completion command now generates valid scripts that work when
eval'd in the user's shell configuration.
Fixes#65
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add confirmDestructive() to leave command for consistency with other
destructive operations
- Add SYNC comments to shared CSS in HTML templates
- Add tests for /auth/upgrade endpoint (success, missing email, creds error)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>