mirror of
https://github.com/hanzoskill/sogcli.git
synced 2026-10-30 21:03:29 +00:00
261 lines
7.6 KiB
Go
261 lines
7.6 KiB
Go
// Package cli defines the command-line interface for sog.
|
|
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// Root is the top-level CLI structure.
|
|
type Root struct {
|
|
// Global flags (matching gog patterns)
|
|
AIHelp bool `name:"ai-help" help:"Show detailed help for AI/LLM agents"`
|
|
Account string `help:"Account email to use" env:"SOG_ACCOUNT" short:"a"`
|
|
JSON bool `help:"Output JSON to stdout (best for scripting)" xor:"format"`
|
|
Plain bool `help:"Output stable, parseable text to stdout (TSV; no colors)" xor:"format"`
|
|
Color string `help:"Color output: auto|always|never" default:"auto" enum:"auto,always,never"`
|
|
Force bool `help:"Skip confirmations for destructive commands"`
|
|
NoInput bool `help:"Never prompt; fail instead (useful for CI)" name:"no-input"`
|
|
Verbose bool `help:"Enable verbose logging" short:"v"`
|
|
Version VersionFlag `name:"version" help:"Print version and exit"`
|
|
|
|
// Subcommands
|
|
Auth AuthCmd `cmd:"" help:"Manage accounts"`
|
|
Mail MailCmd `cmd:"" aliases:"m" help:"Read and send mail"`
|
|
Cal CalCmd `cmd:"" aliases:"c" help:"Calendar operations (CalDAV)"`
|
|
Contacts ContactsCmd `cmd:"" aliases:"con" help:"Contact operations (CardDAV)"`
|
|
Tasks TasksCmd `cmd:"" aliases:"t" help:"Task operations (CalDAV VTODO)"`
|
|
Drive DriveCmd `cmd:"" aliases:"files" help:"File operations (WebDAV)"`
|
|
Invite InviteCmd `cmd:"" aliases:"inv" help:"Meeting invitations (iTIP/iMIP)"`
|
|
Folders FoldersCmd `cmd:"" aliases:"f" help:"Manage folders"`
|
|
Drafts DraftsCmd `cmd:"" aliases:"d" help:"Manage drafts"`
|
|
Idle IdleCmd `cmd:"" help:"Watch for new mail (IMAP IDLE)"`
|
|
}
|
|
|
|
// VersionFlag handles --version.
|
|
type VersionFlag string
|
|
|
|
// BeforeApply prints version and exits.
|
|
func (v VersionFlag) BeforeApply() error {
|
|
fmt.Println(v)
|
|
os.Exit(0)
|
|
return nil
|
|
}
|
|
|
|
// AIHelpText contains the detailed help for AI/LLM agents.
|
|
var AIHelpText = `# sog — Standards Ops Gadget
|
|
|
|
CLI for IMAP/SMTP/CalDAV/CardDAV/WebDAV.
|
|
Open-standards alternative to gog (Google) and mog (Microsoft).
|
|
|
|
## Quick Start
|
|
|
|
sog auth add [email protected] --discover
|
|
sog auth test
|
|
sog mail list
|
|
|
|
## Global Flags
|
|
|
|
--account, -a Account email to use ($SOG_ACCOUNT)
|
|
--json JSON output (for scripting)
|
|
--plain TSV output (parseable)
|
|
--force Skip confirmations
|
|
--no-input Never prompt (CI mode)
|
|
--verbose, -v Debug logging
|
|
--ai-help This help text
|
|
|
|
## Authentication
|
|
|
|
sog auth add <email> [flags]
|
|
--discover Auto-discover servers from DNS
|
|
--imap-host IMAP server hostname
|
|
--imap-port IMAP port (default: 993)
|
|
--smtp-host SMTP server hostname
|
|
--smtp-port SMTP port (default: 587)
|
|
--caldav-url CalDAV server URL
|
|
--carddav-url CardDAV server URL
|
|
--webdav-url WebDAV server URL
|
|
--password Password (stored in keychain)
|
|
|
|
sog auth list List accounts
|
|
sog auth test [email] Test connection
|
|
sog auth remove <email> Remove account
|
|
sog auth password <email> Set protocol-specific passwords
|
|
--imap, --smtp, --caldav, --carddav, --webdav
|
|
|
|
## Mail (IMAP/SMTP)
|
|
|
|
sog mail list [folder]
|
|
--max N Maximum messages (default: 20)
|
|
--unseen Only unread messages
|
|
|
|
sog mail get <uid>
|
|
--headers Headers only
|
|
--raw Raw RFC822 format
|
|
|
|
sog mail search <query>
|
|
IMAP SEARCH syntax: FROM, TO, SUBJECT, SINCE, BEFORE, etc.
|
|
Example: sog mail search "FROM john SINCE 1-Jan-2026"
|
|
|
|
sog mail send --to <email> --subject <text> [flags]
|
|
--to Recipient(s)
|
|
--cc CC recipient(s)
|
|
--bcc BCC recipient(s)
|
|
--subject Subject line
|
|
--body Message body
|
|
--body-file Read body from file (- for stdin)
|
|
|
|
sog mail reply <uid> --body <text>
|
|
sog mail forward <uid> --to <email>
|
|
sog mail move <uid> <folder>
|
|
sog mail copy <uid> <folder>
|
|
sog mail flag <uid> <flag> Flags: seen, flagged, answered, deleted
|
|
sog mail unflag <uid> <flag>
|
|
sog mail delete <uid>
|
|
|
|
## Folders
|
|
|
|
sog folders list
|
|
sog folders create <name>
|
|
sog folders delete <name>
|
|
sog folders rename <old> <new>
|
|
|
|
## Drafts
|
|
|
|
sog drafts list
|
|
sog drafts create [flags] Same flags as mail send
|
|
sog drafts send <uid>
|
|
sog drafts delete <uid>
|
|
|
|
## Calendar (CalDAV)
|
|
|
|
sog cal list [calendar]
|
|
--from Start date (default: today)
|
|
--to End date (default: +30d)
|
|
--max Maximum events
|
|
|
|
sog cal get <uid>
|
|
sog cal search <query> Search in title/description/location
|
|
sog cal today [calendar]
|
|
sog cal week [calendar]
|
|
|
|
sog cal create <title> --start <datetime> [flags]
|
|
--start Start time (YYYY-MM-DDTHH:MM or YYYY-MM-DD for all-day)
|
|
--end End time
|
|
--duration Duration (1h, 30m)
|
|
--location Location
|
|
--description Description
|
|
|
|
sog cal update <uid> [flags] Same flags as create
|
|
sog cal delete <uid>
|
|
sog cal calendars List calendars
|
|
|
|
## Contacts (CardDAV)
|
|
|
|
sog contacts list [address-book]
|
|
--max Maximum contacts
|
|
|
|
sog contacts get <uid>
|
|
sog contacts search <query> Search name/email/phone
|
|
|
|
sog contacts create <name> [flags]
|
|
-e, --email Email address(es)
|
|
-p, --phone Phone number(s)
|
|
--org Organization
|
|
--title Job title
|
|
--note Note
|
|
|
|
sog contacts update <uid> [flags] Same flags as create
|
|
sog contacts delete <uid>
|
|
sog contacts books List address books
|
|
|
|
## Tasks (CalDAV VTODO)
|
|
|
|
sog tasks list [list]
|
|
--all Include completed tasks
|
|
|
|
sog tasks add <title> [flags]
|
|
--due Due date (YYYY-MM-DD)
|
|
-p, --priority Priority (1-9, 1=highest)
|
|
-d, --description Description
|
|
|
|
sog tasks get <uid>
|
|
sog tasks update <uid> [flags] Same flags as add
|
|
sog tasks done <uid> Mark complete
|
|
sog tasks undo <uid> Mark incomplete
|
|
sog tasks delete <uid>
|
|
sog tasks clear Delete all completed tasks
|
|
sog tasks due <date> Tasks due by date
|
|
sog tasks overdue Overdue tasks
|
|
sog tasks lists List task lists
|
|
|
|
## Files (WebDAV)
|
|
|
|
sog drive ls [path]
|
|
-l Long format with details
|
|
--all Show hidden files
|
|
|
|
sog drive get <path> Get file metadata
|
|
sog drive download <remote> [local]
|
|
sog drive upload <local> [remote]
|
|
sog drive mkdir <path>
|
|
sog drive delete <path>
|
|
sog drive move <src> <dst>
|
|
sog drive copy <src> <dst>
|
|
sog drive cat <path> Output file to stdout
|
|
|
|
## Meeting Invites (iTIP/iMIP)
|
|
|
|
sog invite send <summary> <attendees>... --start <datetime> [flags]
|
|
--start Start time
|
|
--duration Duration (default: 1h)
|
|
--location Location
|
|
--description Description
|
|
|
|
sog invite reply <file> --status <accept|decline|tentative>
|
|
--comment Optional comment
|
|
|
|
sog invite cancel <uid> <attendees>...
|
|
sog invite parse <file> Parse .ics file
|
|
sog invite preview <summary> <attendees>... --start <datetime>
|
|
|
|
## IMAP IDLE
|
|
|
|
sog idle [folder] Watch for new mail (push notifications)
|
|
--timeout Timeout in seconds
|
|
|
|
## Output Formats
|
|
|
|
Default: Human-readable colored output
|
|
--json: One JSON object per line (JSONL)
|
|
--plain: Tab-separated values (TSV)
|
|
|
|
## Environment Variables
|
|
|
|
SOG_ACCOUNT Default account email
|
|
|
|
## Examples
|
|
|
|
# List recent emails
|
|
sog mail list --max 10
|
|
|
|
# Send an email
|
|
sog mail send --to [email protected] --subject "Hello" --body "Hi there"
|
|
|
|
# Today's calendar
|
|
sog cal today
|
|
|
|
# Create a meeting with invite
|
|
sog invite send "Team Sync" [email protected] [email protected] \
|
|
--start "2026-01-25T14:00" --duration 30m --location "Zoom"
|
|
|
|
# Add a task
|
|
sog tasks add "Review PR" --due 2026-01-26 -p 1
|
|
|
|
# Upload a file
|
|
sog drive upload report.pdf /documents/
|
|
|
|
# Search contacts
|
|
sog contacts search "John"
|
|
`
|