zele 0.3.14 → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +25 -0
  2. package/dist/api-utils.d.ts +3 -0
  3. package/dist/api-utils.js +6 -0
  4. package/dist/api-utils.js.map +1 -1
  5. package/dist/auth.js +1 -1
  6. package/dist/auth.js.map +1 -1
  7. package/dist/calendar-time.js +6 -0
  8. package/dist/calendar-time.js.map +1 -1
  9. package/dist/cli.js +6 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/attachment.js +42 -2
  12. package/dist/commands/attachment.js.map +1 -1
  13. package/dist/commands/auth-cmd.js +1 -1
  14. package/dist/commands/auth-cmd.js.map +1 -1
  15. package/dist/commands/calendar.js +1 -1
  16. package/dist/commands/calendar.js.map +1 -1
  17. package/dist/commands/draft.js +2 -2
  18. package/dist/commands/draft.js.map +1 -1
  19. package/dist/commands/filter.d.ts +2 -0
  20. package/dist/commands/filter.js +59 -0
  21. package/dist/commands/filter.js.map +1 -0
  22. package/dist/commands/mail-actions.js +12 -2
  23. package/dist/commands/mail-actions.js.map +1 -1
  24. package/dist/commands/mail.js +176 -93
  25. package/dist/commands/mail.js.map +1 -1
  26. package/dist/db.js +24 -1
  27. package/dist/db.js.map +1 -1
  28. package/dist/gmail-client.d.ts +28 -0
  29. package/dist/gmail-client.js +168 -13
  30. package/dist/gmail-client.js.map +1 -1
  31. package/dist/mail-tui.js +34 -9
  32. package/dist/mail-tui.js.map +1 -1
  33. package/dist/output.d.ts +2 -0
  34. package/dist/output.js +4 -0
  35. package/dist/output.js.map +1 -1
  36. package/package.json +8 -3
  37. package/skills/zele/SKILL.md +112 -0
  38. package/src/api-utils.ts +7 -0
  39. package/src/app.log +9 -0
  40. package/src/auth.ts +1 -1
  41. package/src/calendar-time.test.ts +35 -0
  42. package/src/calendar-time.ts +5 -0
  43. package/src/cli.ts +6 -1
  44. package/src/commands/attachment.ts +47 -2
  45. package/src/commands/auth-cmd.ts +1 -1
  46. package/src/commands/calendar.ts +1 -1
  47. package/src/commands/draft.ts +2 -2
  48. package/src/commands/filter.ts +68 -0
  49. package/src/commands/mail-actions.ts +14 -2
  50. package/src/commands/mail.ts +186 -98
  51. package/src/db.ts +26 -1
  52. package/src/gmail-client.ts +202 -20
  53. package/src/mail-tui.test.ts +170 -0
  54. package/src/mail-tui.tsx +56 -9
  55. package/src/output.ts +8 -1
  56. package/src/opentui-react.d.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zele",
3
- "version": "0.3.14",
3
+ "version": "0.3.16",
4
4
  "description": "Gmail CLI — manage email from your terminal",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
@@ -26,9 +26,11 @@
26
26
  "dependencies": {
27
27
  "@googleapis/gmail": "^16.1.1",
28
28
  "@libsql/client": "^0.15.15",
29
+ "@opentui/core": "^0.1.88",
30
+ "@opentui/react": "^0.1.88",
29
31
  "@prisma/adapter-libsql": "7.3.0",
30
32
  "@prisma/client": "7.3.0",
31
- "@termcast/utils": "^2.2.7",
33
+ "@termcast/utils": "^2.2.8",
32
34
  "email-addresses": "^5.0.0",
33
35
  "email-reply-parser": "^2.3.5",
34
36
  "errore": "^0.11.0",
@@ -41,7 +43,7 @@
41
43
  "picocolors": "^1.1.1",
42
44
  "react": "^19.2.4",
43
45
  "remark": "^15.0.1",
44
- "termcast": "^1.3.48",
46
+ "termcast": "^1.3.54",
45
47
  "ts-ics": "^2.4.0",
46
48
  "tsdav": "^2.1.7",
47
49
  "turndown": "^7.2.0",
@@ -63,17 +65,20 @@
63
65
  "@types/turndown": "^5.0.5",
64
66
  "prisma": "7.3.0",
65
67
  "tsx": "^4.19.4",
68
+ "tuistory": "0.0.16",
66
69
  "typescript": "^5.9.3",
67
70
  "vitest": "^4.0.18"
68
71
  },
69
72
  "trustedDependencies": [
70
73
  "@prisma/engines",
74
+ "node-pty",
71
75
  "prisma"
72
76
  ],
73
77
  "files": [
74
78
  "dist",
75
79
  "bin",
76
80
  "src",
81
+ "skills",
77
82
  "schema.prisma"
78
83
  ]
79
84
  }
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: zele
3
+ description: >
4
+ Control Gmail and Google Calendar via CLI. Read, search, send, reply, and forward
5
+ emails. Create, update, and delete calendar events. Manage drafts, labels, and attachments.
6
+ Supports multiple Google accounts. Use this skill whenever the user asks to check email,
7
+ send messages, schedule meetings, or manage their calendar.
8
+ ---
9
+
10
+ # zele — Gmail & Google Calendar CLI
11
+
12
+ A multi-account Gmail and Google Calendar client. Output is YAML, pipe-friendly.
13
+
14
+ ## Setup
15
+
16
+ ```bash
17
+ # install (requires bun)
18
+ bun install -g zele
19
+
20
+ # show connected accounts
21
+ zele whoami
22
+
23
+ # authenticate (opens browser, supports multiple accounts)
24
+ zele login
25
+ ```
26
+
27
+ **Remote/headless login:** `zele login` is interactive — it prints an authorization URL and waits for a redirect URL to be pasted back. In agent/headless environments, run it inside tmux so the process persists:
28
+
29
+ ```bash
30
+ # start login in a tmux session
31
+ tmux new-session -d -s zele-login 'zele login'
32
+
33
+ # read the authorization URL from tmux output
34
+ tmux capture-pane -t zele-login -p
35
+
36
+ # after the user completes consent in their browser, paste the redirect URL
37
+ tmux send-keys -t zele-login 'http://localhost:...?code=...' Enter
38
+
39
+ # verify login succeeded
40
+ tmux capture-pane -t zele-login -p
41
+ tmux kill-session -t zele-login
42
+ ```
43
+
44
+ ## Important
45
+
46
+ **Always run `zele --help` before using.** The help output is the source of truth for all commands, options, and syntax. Run `zele <command> --help` for subcommand details (e.g. `zele mail send --help`). NEVER use head to truncate the output. read it fully.
47
+
48
+ Running `zele` with no subcommand launches a human-friendly TUI for browsing email. **Agents should not use the TUI** — always use the CLI subcommands (`zele mail list`, `zele cal events`, etc.) which output structured YAML.
49
+
50
+ ## Capabilities
51
+
52
+ - **Mail:** list, search, read, send, reply, forward, star, archive, trash, label, watch for new emails, manage filters
53
+ - **Drafts:** list, create, get, send, delete
54
+ - **Calendar:** list calendars, list/search events, create/update/delete events, RSVP, free/busy
55
+ - **Labels:** list, create, delete, unread counts
56
+ - **Attachments:** list per thread, download
57
+ - **Multi-account:** all commands support `--account <email>` to filter; list/search merge across accounts
58
+
59
+ ## Account discovery
60
+
61
+ When the user asks to check emails **for a specific account** (e.g. "check my work email", "what's new on my personal Gmail?"), always run `zele whoami` first to list the connected accounts and find the exact email address to pass to `--account`. Never guess the email — use the output of `zele whoami` to pick the right one.
62
+
63
+ ```bash
64
+ # list connected accounts
65
+ zele whoami
66
+
67
+ # then use the email from the output
68
+ zele mail list --account user@work.com
69
+ ```
70
+
71
+ ## Examples
72
+
73
+ ```bash
74
+ # list inbox
75
+ zele mail list
76
+
77
+ # list only unread emails
78
+ zele mail list --filter "is:unread"
79
+
80
+ # list unread emails with attachments in inbox
81
+ zele mail list --filter "is:unread has:attachment"
82
+
83
+ # combine filter with folder
84
+ zele mail list --filter "from:github" --folder sent
85
+
86
+ # search mail
87
+ zele mail search "from:github subject:review"
88
+
89
+ # read a thread (thread IDs come from list/search output)
90
+ zele mail read <threadId>
91
+
92
+ # send an email with attachment
93
+ zele mail send --to alice@example.com --subject "Report" --body "See attached" --attach report.pdf
94
+
95
+ # reply all
96
+ zele mail reply <threadId> --body "Thanks!" --all
97
+
98
+ # watch inbox for new mail (polls every 15s)
99
+ zele mail watch
100
+
101
+ # today's calendar events across all accounts
102
+ zele cal events --today --all
103
+
104
+ # create a meeting with Google Meet
105
+ zele cal create --summary "Standup" --from tomorrow --to +30m --meet --attendees bob@example.com
106
+
107
+ # check free/busy
108
+ zele cal freebusy --from today --to +8h
109
+
110
+ # list Gmail filters
111
+ zele mail filter list
112
+ ```
package/src/api-utils.ts CHANGED
@@ -133,6 +133,13 @@ export function isAuthLikeError(err: unknown): boolean {
133
133
  return msg.includes('Invalid credentials') || msg.includes('Unauthorized') || msg.includes('invalid_grant')
134
134
  }
135
135
 
136
+ /** Check if an error is specifically about missing OAuth scopes (not expired tokens or revoked access).
137
+ * When true, the user needs to `zele login` again to grant the new scope. */
138
+ export function isScopeError(err: unknown): boolean {
139
+ const msg = String(err)
140
+ return msg.includes('insufficient authentication scopes') || msg.includes('Insufficient Permission')
141
+ }
142
+
136
143
 
137
144
  // ---------------------------------------------------------------------------
138
145
  // Rate limit detection
package/src/app.log ADDED
@@ -0,0 +1,9 @@
1
+ [2026-02-20T20:05:26.791Z] ERROR: No package.json found at: /Users/morse/.kimaki/projects/gtui/src/package.json
2
+ Error: No package.json found at: /Users/morse/.kimaki/projects/gtui/src/package.json
3
+ at startDevMode (/Users/morse/.kimaki/projects/gtui/node_modules/termcast/dist/extensions/dev.js:106:19)
4
+ at runDevAction (/Users/morse/.kimaki/projects/gtui/node_modules/termcast/dist/cli.js:36:15)
5
+ at <anonymous> (/Users/morse/.kimaki/projects/gtui/node_modules/termcast/dist/cli.js:141:11)
6
+ at parse (/Users/morse/.kimaki/projects/gtui/node_modules/goke/dist/goke.js:821:18)
7
+ at /Users/morse/.kimaki/projects/gtui/node_modules/termcast/dist/cli.js:609:5
8
+ at asyncModuleEvaluation (native:2)
9
+ at processTicksAndRejections (native:7:39)
package/src/auth.ts CHANGED
@@ -59,7 +59,7 @@ const CLIENT_SECRET =
59
59
  process.env.ZELE_CLIENT_SECRET ?? ACTIVE_CLIENT.clientSecret
60
60
 
61
61
  const SCOPES = [
62
- 'https://mail.google.com/', // Gmail (full)
62
+ 'https://mail.google.com/', // Gmail (full — covers settings, filters, etc.)
63
63
  'https://www.googleapis.com/auth/calendar', // Calendar (full)
64
64
  'https://www.googleapis.com/auth/userinfo.email', // Email identity
65
65
  ]
@@ -0,0 +1,35 @@
1
+ // Tests for calendar time range resolution logic.
2
+
3
+ import { expect, test, describe } from 'vitest'
4
+ import { resolveTimeRange, parseTimeExpression, isDateOnly } from './calendar-time.js'
5
+
6
+ const tz = 'America/New_York'
7
+
8
+ describe('resolveTimeRange', () => {
9
+ test('same-day --from and --to produces full day range', () => {
10
+ const range = resolveTimeRange({ from: '2026-03-12', to: '2026-03-12' }, tz)
11
+ // --from date-only → start of day (00:00)
12
+ expect(range.timeMin).toMatch(/^2026-03-12T00:00:00/)
13
+ // --to date-only → end of day (23:59)
14
+ expect(range.timeMax).toMatch(/^2026-03-12T23:59:00/)
15
+ })
16
+
17
+ test('--to date-only resolves to end of day', () => {
18
+ const range = resolveTimeRange({ from: '2026-03-10', to: '2026-03-14' }, tz)
19
+ expect(range.timeMin).toMatch(/^2026-03-10T00:00:00/)
20
+ expect(range.timeMax).toMatch(/^2026-03-14T23:59:00/)
21
+ })
22
+
23
+ test('--to with explicit time is preserved', () => {
24
+ const range = resolveTimeRange({ from: '2026-03-12', to: '2026-03-12T14:00' }, tz)
25
+ expect(range.timeMin).toMatch(/^2026-03-12T00:00:00/)
26
+ expect(range.timeMax).toMatch(/^2026-03-12T14:00:00/)
27
+ })
28
+
29
+ test('--to with duration is relative to --from', () => {
30
+ const range = resolveTimeRange({ from: '2026-03-12', to: '+2d' }, tz)
31
+ expect(range.timeMin).toMatch(/^2026-03-12T00:00:00/)
32
+ // 2 days after 2026-03-12T00:00
33
+ expect(range.timeMax).toMatch(/^2026-03-14/)
34
+ })
35
+ })
@@ -278,6 +278,11 @@ export function resolveTimeRange(opts: TimeRangeOptions, tz: string): ResolvedTi
278
278
  if (durationMs !== null) {
279
279
  const fromDate = new Date(fromStr)
280
280
  toStr = new Date(fromDate.getTime() + durationMs).toISOString()
281
+ } else if (isDateOnly(opts.to)) {
282
+ // Date-only --to means "through end of that day" (23:59),
283
+ // consistent with --today/--tomorrow/--week convenience flags.
284
+ const [y, m, d] = opts.to.split('-').map(Number)
285
+ toStr = dateToRfc3339(y!, m!, d!, 23, 59, tz)
281
286
  } else {
282
287
  toStr = parseTimeExpression(opts.to, tz)
283
288
  }
package/src/cli.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  // Entry point: registers all commands, global options, help, and version.
5
5
  // Uses goke for command parsing with zod schemas for type-safe options.
6
6
 
7
+ import { createRequire } from 'node:module'
7
8
  import { goke } from 'goke'
8
9
  import { z } from 'zod'
9
10
  import React from 'react'
@@ -17,6 +18,7 @@ import { registerAttachmentCommands } from './commands/attachment.js'
17
18
  import { registerProfileCommands } from './commands/profile.js'
18
19
  import { registerCalendarCommands } from './commands/calendar.js'
19
20
  import { registerWatchCommands } from './commands/watch.js'
21
+ import { registerFilterCommands } from './commands/filter.js'
20
22
  import { handleCommandError } from './output.js'
21
23
 
22
24
  const cli = goke('zele')
@@ -79,13 +81,16 @@ registerLabelCommands(cli)
79
81
  registerAttachmentCommands(cli)
80
82
  registerCalendarCommands(cli)
81
83
  registerWatchCommands(cli)
84
+ registerFilterCommands(cli)
82
85
 
83
86
  // ---------------------------------------------------------------------------
84
87
  // Help & version
85
88
  // ---------------------------------------------------------------------------
86
89
 
87
90
  cli.help()
88
- cli.version('0.3.14')
91
+ const require = createRequire(import.meta.url)
92
+ const { version } = require('../package.json')
93
+ cli.version(version)
89
94
 
90
95
  // ---------------------------------------------------------------------------
91
96
  // Parse & run
@@ -61,9 +61,18 @@ export function registerAttachmentCommands(cli: Goke) {
61
61
  }
62
62
 
63
63
  const meta = msg.attachments.find((a) => a.attachmentId === attachmentId)
64
- const filename = options.filename ?? meta?.filename ?? `${messageId}_${attachmentId.slice(0, 8)}`
64
+ const fallbackFilename = `${messageId}_${attachmentId.slice(0, 8)}`
65
+ const rawFilename = options.filename ?? meta?.filename
66
+ const filename = sanitizeFilename(rawFilename, fallbackFilename)
65
67
 
66
- const outPath = path.resolve(options.outDir, filename)
68
+ const outDir = path.resolve(options.outDir)
69
+ const outPath = path.join(outDir, filename)
70
+
71
+ // Security: verify the resolved path is within the output directory
72
+ if (!outPath.startsWith(outDir + path.sep) && outPath !== outDir) {
73
+ out.error(`Security error: filename "${rawFilename}" would write outside output directory`)
74
+ process.exit(1)
75
+ }
67
76
 
68
77
  // Check if file already exists with same size (skip re-download)
69
78
  if (fs.existsSync(outPath) && meta) {
@@ -101,3 +110,39 @@ function formatSize(bytes: number): string {
101
110
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
102
111
  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
103
112
  }
113
+
114
+ /**
115
+ * Sanitize a filename to prevent path traversal and filesystem issues.
116
+ * - Strips directory components (path traversal prevention)
117
+ * - Removes null bytes and control characters
118
+ * - Replaces characters problematic on Windows/macOS/Linux
119
+ * - Handles Windows reserved names
120
+ * - Limits length to 255 characters
121
+ */
122
+ function sanitizeFilename(name: string | undefined, fallback: string): string {
123
+ if (!name || name.trim().length === 0) return fallback
124
+
125
+ let sanitized = name
126
+ // Strip directory components (critical for path traversal prevention)
127
+ .split(/[/\\]/).pop() || ''
128
+ // Remove null bytes and control characters
129
+ .replace(/[\x00-\x1f]/g, '')
130
+ // Replace characters problematic across filesystems: < > : " / \ | ? *
131
+ .replace(/[<>:"/\\|?*]/g, '_')
132
+ // Trim leading/trailing spaces and dots (problematic on Windows)
133
+ .replace(/^[\s.]+|[\s.]+$/g, '')
134
+
135
+ // Handle Windows reserved names (CON, PRN, AUX, NUL, COM1-9, LPT1-9)
136
+ if (/^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])$/i.test(sanitized)) {
137
+ sanitized = `_${sanitized}`
138
+ }
139
+
140
+ // Limit length (255 is common filesystem limit)
141
+ if (sanitized.length > 255) {
142
+ const ext = path.extname(sanitized)
143
+ const base = sanitized.slice(0, 255 - ext.length)
144
+ sanitized = base + ext
145
+ }
146
+
147
+ return sanitized.length > 0 ? sanitized : fallback
148
+ }
@@ -10,7 +10,7 @@ import { handleCommandError } from '../output.js'
10
10
 
11
11
  export function registerAuthCommands(cli: Goke) {
12
12
  cli
13
- .command('login', 'Authenticate with Google (opens browser). Run in background via tmux for remote/headless environments. The command prints an authorization URL — show it to the user, ask them to complete consent in their browser, then paste back the localhost redirect URL containing the auth code.')
13
+ .command('login', 'Authenticate with Google (opens browser). For headless/agent environments, run inside tmux: the command prints an authorization URL to open in a browser, then waits for the localhost redirect URL to be pasted back.')
14
14
  .action(async () => {
15
15
  const result = await login()
16
16
  if (result instanceof Error) handleCommandError(result)
@@ -78,7 +78,7 @@ export function registerCalendarCommands(cli: Goke) {
78
78
  .option('--all', 'Fetch from all calendars')
79
79
  .option('--query <query>', 'Free text search')
80
80
  .option('--max [max]', 'Max results (default: 20)')
81
- .option('--page <page>', 'Pagination token')
81
+ .option('--page <page>', 'Pagination token (requires --account, only works for a single account)')
82
82
  .action(async (options) => {
83
83
  const max = options.max ? Number(options.max) : 20
84
84
  const calendarId = options.calendar ?? 'primary'
@@ -21,7 +21,7 @@ export function registerDraftCommands(cli: Goke) {
21
21
  cli
22
22
  .command('draft list', 'List drafts')
23
23
  .option('--max <max>', z.number().default(20).describe('Max results'))
24
- .option('--page <page>', z.string().describe('Pagination token'))
24
+ .option('--page <page>', z.string().describe('Pagination token (requires --account, only works for a single account)'))
25
25
  .option('--query <query>', z.string().describe('Search query'))
26
26
  .action(async (options) => {
27
27
  const clients = await getClients(options.account)
@@ -72,7 +72,7 @@ export function registerDraftCommands(cli: Goke) {
72
72
  subject: d.subject,
73
73
  date: out.formatDate(d.date),
74
74
  })),
75
- { summary: `${merged.length} draft(s)` },
75
+ { summary: `${merged.length} draft(s)`, nextPage: allResults[0]?.result.nextPageToken },
76
76
  )
77
77
  })
78
78
 
@@ -0,0 +1,68 @@
1
+ // Filter commands: list, create, delete Gmail filters.
2
+ // Multi-account support via getClients/getClient like label.ts.
3
+
4
+ import type { Goke } from 'goke'
5
+ import { getClients } from '../auth.js'
6
+ import { AuthError, isScopeError } from '../api-utils.js'
7
+ import * as out from '../output.js'
8
+
9
+ export function registerFilterCommands(cli: Goke) {
10
+ // =========================================================================
11
+ // filter list
12
+ // =========================================================================
13
+
14
+ cli
15
+ .command('mail filter list', 'List all Gmail filters')
16
+ .action(async (options) => {
17
+ const clients = await getClients(options.account)
18
+
19
+ const results = await Promise.all(
20
+ clients.map(async ({ email, client }) => {
21
+ const res = await client.listFilters()
22
+ if (res instanceof Error) return res
23
+ return { email, filters: res.parsed }
24
+ }),
25
+ )
26
+
27
+ const allResults = results.filter((r): r is Exclude<typeof r, Error> => {
28
+ if (r instanceof AuthError) {
29
+ if (isScopeError(r)) {
30
+ out.error(`Missing required OAuth scopes. Run: zele login to grant updated permissions`)
31
+ } else {
32
+ out.error(`${r.message}. Try: zele login`)
33
+ }
34
+ return false
35
+ }
36
+ if (r instanceof Error) { out.error(`Failed to fetch filters: ${r.message}`); return false }
37
+ return true
38
+ })
39
+
40
+ const merged = allResults.flatMap(({ email, filters }) =>
41
+ filters.map((f) => ({ ...f, account: email })),
42
+ )
43
+
44
+ if (merged.length === 0) {
45
+ out.hint('No filters found')
46
+ return
47
+ }
48
+
49
+ const showAccount = clients.length > 1
50
+ for (const f of merged) {
51
+ out.printYaml({
52
+ ...(showAccount ? { account: f.account } : {}),
53
+ id: f.id,
54
+ criteria: f.criteria,
55
+ action: f.action,
56
+ })
57
+ }
58
+
59
+ out.hint(`${merged.length} filter(s)`)
60
+ })
61
+
62
+ // TODO: add `mail filter create` and `mail filter delete` commands once
63
+ // gmail.settings.basic scope is added to the GCP OAuth consent screen.
64
+ // The https://mail.google.com/ scope covers reading filters but Google
65
+ // enforces the narrower scope for write operations (create/delete).
66
+ // The gmail-client.ts methods (createFilter, deleteFilter, resolveLabel)
67
+ // are already implemented and ready to use.
68
+ }
@@ -1,4 +1,4 @@
1
- // Mail action commands: star, unstar, archive, trash, untrash, mark read/unread, label modify.
1
+ // Mail action commands: star, unstar, archive, trash, untrash, mark read/unread, spam, unspam, label modify.
2
2
  // Bulk operations on threads — cache invalidation is handled by the client methods.
3
3
 
4
4
  import type { Goke } from 'goke'
@@ -66,7 +66,7 @@ export function registerMailActionCommands(cli: Goke) {
66
66
  })
67
67
 
68
68
  cli
69
- .command('mail read-mark [...threadIds]', 'Mark threads as read')
69
+ .command('mail read-mark [...threadIds]', 'Mark threads as read (removes UNREAD label)')
70
70
  .action(async (threadIds, options) => {
71
71
  await bulkAction(threadIds, 'Marked as read', options.account, (c, ids) => c.markAsRead({ threadIds: ids }))
72
72
  })
@@ -77,6 +77,18 @@ export function registerMailActionCommands(cli: Goke) {
77
77
  await bulkAction(threadIds, 'Marked as unread', options.account, (c, ids) => c.markAsUnread({ threadIds: ids }))
78
78
  })
79
79
 
80
+ cli
81
+ .command('mail spam [...threadIds]', 'Mark threads as spam')
82
+ .action(async (threadIds, options) => {
83
+ await bulkAction(threadIds, 'Marked as spam', options.account, (c, ids) => c.markAsSpam({ threadIds: ids }))
84
+ })
85
+
86
+ cli
87
+ .command('mail unspam [...threadIds]', 'Remove threads from spam')
88
+ .action(async (threadIds, options) => {
89
+ await bulkAction(threadIds, 'Removed from spam', options.account, (c, ids) => c.unmarkSpam({ threadIds: ids }))
90
+ })
91
+
80
92
  cli
81
93
  .command('mail label [...threadIds]', 'Add or remove labels from threads')
82
94
  .option('--add <add>', z.string().describe('Labels to add (comma-separated)'))