Skip to content
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- Gmail: include `gmail.settings.sharing` scope for filter operations to avoid 403 insufficientPermissions. (#69) — thanks @ryanh-ai.
- Gmail: resync on stale history 404s and skip missing message fetches without masking non-404 failures. (#70) — thanks @antons.
- Classroom: normalize assignee updates + fix grade update masks. (#74) — thanks @salmonumbrella.

### Build

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# 🧭 gogcli — Google in your terminal.

Google in your terminal — CLI for Gmail, Calendar, Drive, Docs, Slides, Sheets, Contacts, Tasks, People, Groups (Workspace), and Keep (Workspace-only).
Google in your terminal — CLI for Gmail, Calendar, Classroom, Drive, Docs, Slides, Sheets, Contacts, Tasks, People, Groups (Workspace), and Keep (Workspace-only).

## Features

- **Gmail** - search threads, send emails, manage labels, drafts, filters, delegation, vacation settings, and watch (Pub/Sub push)
- **Email tracking** - track opens for `gog gmail send --track` with a small Cloudflare Worker backend
- **Calendar** - list/create/update events, detect conflicts, manage invitations, check free/busy status, team calendars
- **Classroom** - list courses, rosters, coursework, submissions, announcements, topics, invitations, guardians
- **Drive** - list/search/upload/download files, manage permissions, organize folders
- **Contacts** - search/create/update contacts, access Workspace directory
- **Tasks** - manage tasklists and tasks: create/add/update/done/undo/delete/clear
Expand Down Expand Up @@ -64,6 +65,7 @@ Before adding an account, create OAuth2 credentials from Google Cloud Console:
- Gmail API: https://console.cloud.google.com/apis/api/gmail.googleapis.com
- Google Calendar API: https://console.cloud.google.com/apis/api/calendar-json.googleapis.com
- Google Drive API: https://console.cloud.google.com/apis/api/drive.googleapis.com
- Google Classroom API: https://console.cloud.google.com/apis/api/classroom.googleapis.com
- People API (Contacts): https://console.cloud.google.com/apis/api/people.googleapis.com
- Google Tasks API: https://console.cloud.google.com/apis/api/tasks.googleapis.com
- Google Sheets API: https://console.cloud.google.com/apis/api/sheets.googleapis.com
Expand Down
62 changes: 61 additions & 1 deletion docs/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Build a single, clean, modern Go CLI that talks to:

- Gmail API
- Google Calendar API
- Google Classroom API
- Google Drive API
- Google People API (Contacts + directory)

Expand Down Expand Up @@ -134,7 +135,7 @@ Flag aliases:
### Implemented

- `gog auth credentials <credentials.json|->`
- `gog auth add <email> [--services user|all|gmail,calendar,drive,docs,contacts,tasks,sheets,people,groups] [--readonly] [--drive-scope full|readonly|file] [--manual] [--force-consent]`
- `gog auth add <email> [--services user|all|gmail,calendar,classroom,drive,docs,contacts,tasks,sheets,people,groups] [--readonly] [--drive-scope full|readonly|file] [--manual] [--force-consent]`
- `gog auth services [--markdown]`
- `gog auth keep <email> --key <service-account.json>` (Google Keep; Workspace only)
- `gog auth list`
Expand Down Expand Up @@ -165,6 +166,65 @@ Flag aliases:
- `gog calendar delete <calendarId> <eventId>`
- `gog calendar freebusy <calendarIds> --from RFC3339 --to RFC3339`
- `gog calendar respond <calendarId> <eventId> --status accepted|declined|tentative [--send-updates all|none|externalOnly]`
- `gog classroom courses [--state ...] [--max N] [--page TOKEN]`
- `gog classroom courses get <courseId>`
- `gog classroom courses create --name NAME [--owner me] [--state ACTIVE|...]`
- `gog classroom courses update <courseId> [--name ...] [--state ...]`
- `gog classroom courses delete <courseId>`
- `gog classroom courses archive <courseId>`
- `gog classroom courses unarchive <courseId>`
- `gog classroom courses join <courseId> [--role student|teacher] [--user me]`
- `gog classroom courses leave <courseId> [--role student|teacher] [--user me]`
- `gog classroom courses url <courseId...>`
- `gog classroom students <courseId> [--max N] [--page TOKEN]`
- `gog classroom students get <courseId> <userId>`
- `gog classroom students add <courseId> <userId> [--enrollment-code CODE]`
- `gog classroom students remove <courseId> <userId>`
- `gog classroom teachers <courseId> [--max N] [--page TOKEN]`
- `gog classroom teachers get <courseId> <userId>`
- `gog classroom teachers add <courseId> <userId>`
- `gog classroom teachers remove <courseId> <userId>`
- `gog classroom roster <courseId> [--students] [--teachers]`
- `gog classroom coursework <courseId> [--state ...] [--topic TOPIC_ID] [--max N] [--page TOKEN]`
- `gog classroom coursework get <courseId> <courseworkId>`
- `gog classroom coursework create <courseId> --title TITLE [--type ASSIGNMENT|...]`
- `gog classroom coursework update <courseId> <courseworkId> [--title ...]`
- `gog classroom coursework delete <courseId> <courseworkId>`
- `gog classroom coursework assignees <courseId> <courseworkId> [--mode ...] [--add-student ...]`
- `gog classroom materials <courseId> [--state ...] [--topic TOPIC_ID] [--max N] [--page TOKEN]`
- `gog classroom materials get <courseId> <materialId>`
- `gog classroom materials create <courseId> --title TITLE`
- `gog classroom materials update <courseId> <materialId> [--title ...]`
- `gog classroom materials delete <courseId> <materialId>`
- `gog classroom submissions <courseId> <courseworkId> [--state ...] [--max N] [--page TOKEN]`
- `gog classroom submissions get <courseId> <courseworkId> <submissionId>`
- `gog classroom submissions turn-in <courseId> <courseworkId> <submissionId>`
- `gog classroom submissions reclaim <courseId> <courseworkId> <submissionId>`
- `gog classroom submissions return <courseId> <courseworkId> <submissionId>`
- `gog classroom submissions grade <courseId> <courseworkId> <submissionId> [--draft N] [--assigned N]`
- `gog classroom announcements <courseId> [--state ...] [--max N] [--page TOKEN]`
- `gog classroom announcements get <courseId> <announcementId>`
- `gog classroom announcements create <courseId> --text TEXT`
- `gog classroom announcements update <courseId> <announcementId> [--text ...]`
- `gog classroom announcements delete <courseId> <announcementId>`
- `gog classroom announcements assignees <courseId> <announcementId> [--mode ...]`
- `gog classroom topics <courseId> [--max N] [--page TOKEN]`
- `gog classroom topics get <courseId> <topicId>`
- `gog classroom topics create <courseId> --name NAME`
- `gog classroom topics update <courseId> <topicId> --name NAME`
- `gog classroom topics delete <courseId> <topicId>`
- `gog classroom invitations [--course ID] [--user ID]`
- `gog classroom invitations get <invitationId>`
- `gog classroom invitations create <courseId> <userId> --role STUDENT|TEACHER|OWNER`
- `gog classroom invitations accept <invitationId>`
- `gog classroom invitations delete <invitationId>`
- `gog classroom guardians <studentId> [--max N] [--page TOKEN]`
- `gog classroom guardians get <studentId> <guardianId>`
- `gog classroom guardians delete <studentId> <guardianId>`
- `gog classroom guardian-invitations <studentId> [--state ...] [--max N] [--page TOKEN]`
- `gog classroom guardian-invitations get <studentId> <invitationId>`
- `gog classroom guardian-invitations create <studentId> --email EMAIL`
- `gog classroom profile [userId]`
- `gog gmail search <query> [--max N] [--page TOKEN]`
- `gog gmail thread get <threadId> [--download]`
- `gog gmail thread modify <threadId> [--add ...] [--remove ...]`
Expand Down
21 changes: 21 additions & 0 deletions internal/cmd/classroom.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package cmd

import "github.com/steipete/gogcli/internal/googleapi"

var newClassroomService = googleapi.NewClassroom

type ClassroomCmd struct {
Courses ClassroomCoursesCmd `cmd:"" help:"Courses"`
Students ClassroomStudentsCmd `cmd:"" help:"Course students"`
Teachers ClassroomTeachersCmd `cmd:"" help:"Course teachers"`
Roster ClassroomRosterCmd `cmd:"" help:"Course roster (students + teachers)"`
Coursework ClassroomCourseworkCmd `cmd:"" name:"coursework" aliases:"work" help:"Coursework"`
Materials ClassroomMaterialsCmd `cmd:"" name:"materials" help:"Coursework materials"`
Submissions ClassroomSubmissionsCmd `cmd:"" help:"Student submissions"`
Announcements ClassroomAnnouncementsCmd `cmd:"" help:"Announcements"`
Topics ClassroomTopicsCmd `cmd:"" help:"Topics"`
Invitations ClassroomInvitationsCmd `cmd:"" help:"Invitations"`
Guardians ClassroomGuardiansCmd `cmd:"" help:"Guardians"`
GuardianInvites ClassroomGuardianInvitesCmd `cmd:"" name:"guardian-invitations" help:"Guardian invitations"`
Profile ClassroomProfileCmd `cmd:"" help:"User profiles"`
}
Loading