- add keep create/delete commands for text and checklist notes
- validate checklist items and switch Keep service-account scope to writable access
- refresh README and changelog for Keep write support
Co-authored-by: John Westerlund <john.westerlund@cygnisec.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements Google Admin SDK Directory API support for Workspace user and
group management with domain-wide delegation.
New commands:
- gog admin users list --domain example.com
- gog admin users get user@example.com
- gog admin users create user@example.com --given John --family Doe
- gog admin users suspend user@example.com
- gog admin groups list --domain example.com
- gog admin groups members list group@example.com
- gog admin groups members add group@example.comuser@example.com --role MEMBER
- gog admin groups members remove group@example.comuser@example.comCloses#340
Note: This is a focused implementation of core user/group management.
For full GAM feature parity (PR #179), additional work would be needed
for: alerts, licenses, org units, printers, reports, vault, SSO, etc.
* 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>
* feat: add docs update command for editing Google Docs
* fix: handle document content range correctly for replace
* docs: add Jarbas avatar
* feat(gogcli): add markdown formatting support for Google Docs
Phase 1 & 2 complete:
- Markdown parser supporting headings, lists, code blocks, blockquotes, links
- Google Docs API integration for formatting
- --format markdown flag for docs update command
- Heading styles (H1-H6), horizontal rules, list indentation
- Code blocks with monospace font
Pending (Phase 3):
- Inline formatting (bold, italic, inline code) - index calculation issues
- Links - index calculation issues
Usage:
gog docs update <docId> --content-file ./doc.md --format markdown
* fix(gogcli): fix inline formatting indices in markdown formatter
- Simplified document generation to avoid index calculation errors
- Fixed ParseInlineFormatting to correctly track positions
- Preserves: headings, code blocks, blockquotes, lists, horizontal rules
Pending: inline formatting (bold, italic, code, links) - indices still need work
* fix(gogcli): use UTF-16 code units for Google Docs API indexing
- Fixed markdown formatter to use UTF-16 code units instead of UTF-8 bytes
- Added utf16Len() helper function for accurate character counting
- Fixed inline formatting indices (bold, italic, code, links)
- Added empty line handling (MDEmptyLine)
- Successfully tested with Docker course doc (21KB, emojis, diagrams)
This resolves index mismatch errors caused by multi-byte characters like emojis
which are 4 bytes in UTF-8 but 2 code units in UTF-16.
* feat(gogcli): add slides commands with markdown support
- Add 'gog slides update' command with markdown formatting
- Create slides_formatter.go for Google Slides API batch updates
- Create slides_markdown.go for markdown parsing (titles, bullets, code)
- Add slides.go with update/create/read operations
- Update googleauth service for Slides scope
Related: PR #219
* fix(gogcli): use shapes for slides text boxes instead of direct insertion
- Fixed slides creation to use CreateShape with TEXT_BOX instead of inserting text directly
- Direct text insertion into slides is not supported by Google Slides API
- Added title text box with bold 36pt font
- Added body text box for content (bullets, paragraphs, code)
- Supports markdown formatting (bold, bullets, code blocks)
Tested: Successfully created 20-slide presentation from Docker course outline
* feat: add markdown table support (formatted text output)
* feat: implement native Google Docs table insertion with multi-step API
* feat(slides): add --template flag for creating presentations from templates
* fix: stabilize docs/slides markdown + auth flow (#219) (thanks @goncaloalves)
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix(gmail): fallback to send-as list for display name
* refactor(gmail): remove dead code in primarySendAsDisplayNameFromList
The condition `primary == nil && sa.IsPrimary` inside the email-matching
block can never be true because `primary` is already unconditionally set
to `sa` when `sa.IsPrimary` is true earlier in the same loop iteration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(gmail): add --from display name fallback to list test
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(auth): persist manual oauth state
* feat(cli): add remote manual auth flow
* fix(auth): enforce remote manual auth state
* fix(auth): satisfy lint for manual auth flow
* fix(auth): harden remote manual auth state cache
* chore: update changelog for remote manual auth (#187) (thanks @salmonumbrella)
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.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>
- Add clickable account cards with pointer cursor
- Add "Permissions" button on hover to trigger re-auth
- Add /auth/upgrade endpoint with force-consent and login_hint
- Add service icons for classroom, groups, docs, keep
- Show all services on success page with missing ones greyed out
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Filter creation requires the gmail.settings.sharing scope. Without it,
users get a 403 insufficientPermissions error when trying to create
filters via `gog gmail settings filters create`.
Fixes#68