Skip to content

feat: subcommand-level allowlist for --enable-commands#1

Open
EricYangTL wants to merge 308 commits intomainfrom
feat/subcommand-allowlist
Open

feat: subcommand-level allowlist for --enable-commands#1
EricYangTL wants to merge 308 commits intomainfrom
feat/subcommand-allowlist

Conversation

@EricYangTL
Copy link
Owner

Cross-repo PR to steipete/gogcli

andybergon and others added 30 commits February 14, 2026 23:25
* 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 (steipete#208) (thanks @andybergon)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
…steipete#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 (steipete#263) (thanks @alextnetto)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
…letion (steipete#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 steipete#261

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…rs (steipete#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 steipete#254, fixes steipete#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>
)

* refactor(cmd): centralize all literal

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

* refactor(gmail): parse comma-separated address lists
steipete#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 (steipete#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>
…ments (steipete#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 steipete#268

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

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
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>
Pass context to outfmt.WriteJSON (signature changed upstream) and
use normalizeGoogleID for spreadsheet ID consistency.
Co-authored-by: salmonumbrella <182032677+salmonumbrella@users.noreply.github.com>
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 steipete#198
…election (steipete#131)

* fix(gmail): decode ISO-2022-JP bodies

* fix(gmail): include cc/bcc in get output

* feat(calendar): allow selecting calendars in events

* test(gmail): add edge case tests for ISO-2022-JP decoding

Add tests for edge cases in ISO-2022-JP body decoding:
- Mixed ASCII and Japanese text (e.g., "Hello こんにちは World")
- Empty content with ISO-2022-JP charset header
- Malformed ISO-2022-JP sequences (graceful degradation)
- Truncated escape sequences

These tests verify the graceful fallback behavior in decodeBodyCharset
which returns original data if decoding fails.

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

* fix(calendar): validate unknown calendar names in resolveCalendarIDs

When a calendar name doesn't match any known calendar (not in bySummary
or byID maps), return an error listing the unrecognized names instead
of treating them as raw calendar IDs which causes cryptic Google API
errors.

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

* fix(calendar): validate unknown and ambiguous calendar name resolutions

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
steipete and others added 30 commits March 9, 2026 03:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.