@smcllns/gmail 0.1.1

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.
package/dist/cli.js ADDED
@@ -0,0 +1,539 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "fs";
3
+ import { parseArgs } from "util";
4
+ import { GmailService } from "./gmail-service.js";
5
+ const service = new GmailService();
6
+ // Custom error class for restricted operations
7
+ class RestrictedOperationError extends Error {
8
+ constructor(operation, guidance) {
9
+ super(`RESTRICTED: ${operation}\n\n${guidance}`);
10
+ this.name = "RestrictedOperationError";
11
+ }
12
+ }
13
+ function usage() {
14
+ console.log(`gmail - Gmail CLI for Claude Code agents
15
+
16
+ USAGE
17
+
18
+ gmail accounts <action> Account management
19
+ gmail config <action> Configuration management
20
+ gmail <command> [options] Gmail operations (uses default account)
21
+ gmail --account <email> <command> Gmail operations with specific account
22
+
23
+ ACCOUNT COMMANDS
24
+
25
+ gmail accounts credentials <file.json> Set OAuth credentials (once)
26
+ gmail accounts list List configured accounts
27
+ gmail accounts add <email> [--manual] Add account (--manual for browserless OAuth)
28
+ gmail accounts remove <email> Remove account
29
+
30
+ CONFIG COMMANDS
31
+
32
+ gmail config default <email> Set default account for all commands
33
+ gmail config show Show current configuration
34
+
35
+ GMAIL COMMANDS
36
+
37
+ gmail search <query> [--max N] [--page TOKEN]
38
+ Search threads using Gmail query syntax.
39
+ Returns: thread ID, date, sender, subject, labels.
40
+
41
+ Query examples:
42
+ in:inbox, in:sent, in:drafts, in:trash
43
+ is:unread, is:starred, is:important
44
+ from:sender@example.com, to:recipient@example.com
45
+ subject:keyword, has:attachment, filename:pdf
46
+ after:2024/01/01, before:2024/12/31
47
+ label:Work, label:UNREAD
48
+ Combine: "in:inbox is:unread from:boss@company.com"
49
+
50
+ gmail thread <threadId> [--download]
51
+ Get thread with all messages.
52
+ Shows: Message-ID, headers, body, attachments.
53
+ --download saves attachments to ~/.gmail-cli/attachments/
54
+
55
+ gmail labels list
56
+ List all labels with ID, name, and type.
57
+
58
+ gmail labels <threadIds...> [--add L] [--remove L]
59
+ Modify labels on threads (comma-separated for multiple).
60
+ Accepts label names or IDs (names are case-insensitive).
61
+ System labels: INBOX, UNREAD, STARRED, IMPORTANT, TRASH, SPAM
62
+
63
+ gmail drafts list
64
+ List all drafts. Returns: draft ID, message ID.
65
+
66
+ gmail drafts get <draftId> [--download]
67
+ View draft with attachments.
68
+ --download saves attachments to ~/.gmail-cli/attachments/
69
+
70
+ gmail url <threadIds...>
71
+ Generate Gmail web URLs for threads.
72
+ Uses canonical URL format with email parameter.
73
+
74
+ RESTRICTED OPERATIONS (will return guidance instead of executing)
75
+
76
+ gmail drafts create - Not permitted: drafts should be created manually
77
+ gmail drafts send - Not permitted: sending requires human review
78
+ gmail drafts delete - Not permitted: deletion requires human confirmation
79
+ gmail send - Not permitted: sending requires human review
80
+
81
+ EXAMPLES
82
+
83
+ gmail config default you@gmail.com
84
+ gmail search "in:inbox is:unread"
85
+ gmail search "from:boss@company.com" --max 50
86
+ gmail thread 19aea1f2f3532db5
87
+ gmail thread 19aea1f2f3532db5 --download
88
+ gmail labels list
89
+ gmail labels abc123 --add Work --remove UNREAD
90
+ gmail url 19aea1f2f3532db5 19aea1f2f3532db6
91
+
92
+ DATA STORAGE
93
+
94
+ ~/.gmail-cli/credentials.json OAuth client credentials
95
+ ~/.gmail-cli/accounts.json Account tokens
96
+ ~/.gmail-cli/config.json CLI configuration (default account)
97
+ ~/.gmail-cli/attachments/ Downloaded attachments`);
98
+ process.exit(1);
99
+ }
100
+ function error(msg) {
101
+ console.error("Error:", msg);
102
+ process.exit(1);
103
+ }
104
+ function getAccount(args) {
105
+ // Check for --account flag
106
+ const accountIndex = args.indexOf("--account");
107
+ if (accountIndex !== -1 && args[accountIndex + 1]) {
108
+ const account = args[accountIndex + 1];
109
+ const remainingArgs = [...args.slice(0, accountIndex), ...args.slice(accountIndex + 2)];
110
+ return { account, remainingArgs };
111
+ }
112
+ // Use default account
113
+ const defaultAccount = service.getDefaultAccount();
114
+ if (!defaultAccount) {
115
+ error("No default account configured. Run: gmail config default <email>");
116
+ }
117
+ return { account: defaultAccount, remainingArgs: args };
118
+ }
119
+ async function main() {
120
+ const args = process.argv.slice(2);
121
+ if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
122
+ usage();
123
+ }
124
+ const first = args[0];
125
+ const rest = args.slice(1);
126
+ try {
127
+ // Handle 'accounts' command separately (no email required)
128
+ if (first === "accounts") {
129
+ await handleAccounts(rest);
130
+ return;
131
+ }
132
+ // Handle 'config' command
133
+ if (first === "config") {
134
+ await handleConfig(rest);
135
+ return;
136
+ }
137
+ // All other commands use account resolution
138
+ const { account, remainingArgs } = getAccount(args);
139
+ const command = remainingArgs[0];
140
+ const commandArgs = remainingArgs.slice(1);
141
+ if (!command) {
142
+ error("Missing command. Use --help for usage.");
143
+ }
144
+ switch (command) {
145
+ case "search":
146
+ await handleSearch(account, commandArgs);
147
+ break;
148
+ case "thread":
149
+ await handleThread(account, commandArgs);
150
+ break;
151
+ case "labels":
152
+ await handleLabels(account, commandArgs);
153
+ break;
154
+ case "drafts":
155
+ await handleDrafts(account, commandArgs);
156
+ break;
157
+ case "send":
158
+ handleRestrictedSend();
159
+ break;
160
+ case "url":
161
+ handleUrl(account, commandArgs);
162
+ break;
163
+ default:
164
+ error(`Unknown command: ${command}`);
165
+ }
166
+ }
167
+ catch (e) {
168
+ if (e instanceof RestrictedOperationError) {
169
+ console.error(e.message);
170
+ process.exit(2);
171
+ }
172
+ error(e instanceof Error ? e.message : String(e));
173
+ }
174
+ }
175
+ async function handleConfig(args) {
176
+ const action = args[0];
177
+ if (!action)
178
+ error("Missing action: default|show");
179
+ switch (action) {
180
+ case "default": {
181
+ const email = args[1];
182
+ if (!email)
183
+ error("Usage: gmail config default <email>");
184
+ // Verify the account exists
185
+ const accounts = service.listAccounts();
186
+ const exists = accounts.some((a) => a.email === email);
187
+ if (!exists) {
188
+ error(`Account '${email}' not found. Add it first with: gmail accounts add ${email}`);
189
+ }
190
+ service.setDefaultAccount(email);
191
+ console.log(`Default account set to: ${email}`);
192
+ break;
193
+ }
194
+ case "show": {
195
+ const defaultAccount = service.getDefaultAccount();
196
+ console.log("Configuration:");
197
+ console.log(` Default account: ${defaultAccount || "(not set)"}`);
198
+ break;
199
+ }
200
+ default:
201
+ error(`Unknown action: ${action}`);
202
+ }
203
+ }
204
+ async function handleAccounts(args) {
205
+ const action = args[0];
206
+ if (!action)
207
+ error("Missing action: list|add|remove|credentials");
208
+ switch (action) {
209
+ case "list": {
210
+ const accounts = service.listAccounts();
211
+ const defaultAccount = service.getDefaultAccount();
212
+ if (accounts.length === 0) {
213
+ console.log("No accounts configured");
214
+ }
215
+ else {
216
+ for (const a of accounts) {
217
+ const isDefault = a.email === defaultAccount ? " (default)" : "";
218
+ console.log(`${a.email}${isDefault}`);
219
+ }
220
+ }
221
+ break;
222
+ }
223
+ case "credentials": {
224
+ const credFile = args[1];
225
+ if (!credFile)
226
+ error("Usage: gmail accounts credentials <credentials.json>");
227
+ const creds = JSON.parse(fs.readFileSync(credFile, "utf8"));
228
+ const installed = creds.installed || creds.web;
229
+ if (!installed)
230
+ error("Invalid credentials file");
231
+ service.setCredentials(installed.client_id, installed.client_secret);
232
+ console.log("Credentials saved");
233
+ break;
234
+ }
235
+ case "add": {
236
+ const manual = args.includes("--manual");
237
+ const filtered = args.slice(1).filter((a) => a !== "--manual");
238
+ const email = filtered[0];
239
+ if (!email)
240
+ error("Usage: gmail accounts add <email> [--manual]");
241
+ const creds = service.getCredentials();
242
+ if (!creds)
243
+ error("No credentials configured. Run: gmail accounts credentials <credentials.json>");
244
+ await service.addGmailAccount(email, creds.clientId, creds.clientSecret, manual);
245
+ console.log(`Account '${email}' added`);
246
+ // Set as default if it's the first account
247
+ const accounts = service.listAccounts();
248
+ if (accounts.length === 1) {
249
+ service.setDefaultAccount(email);
250
+ console.log(`Set as default account`);
251
+ }
252
+ break;
253
+ }
254
+ case "remove": {
255
+ const email = args[1];
256
+ if (!email)
257
+ error("Usage: gmail accounts remove <email>");
258
+ const deleted = service.deleteAccount(email);
259
+ console.log(deleted ? `Removed '${email}'` : `Not found: ${email}`);
260
+ break;
261
+ }
262
+ default:
263
+ error(`Unknown action: ${action}`);
264
+ }
265
+ }
266
+ async function handleSearch(account, args) {
267
+ const { values, positionals } = parseArgs({
268
+ args,
269
+ options: {
270
+ max: { type: "string", short: "m" },
271
+ page: { type: "string", short: "p" },
272
+ },
273
+ allowPositionals: true,
274
+ });
275
+ const query = positionals.join(" ");
276
+ if (!query)
277
+ error("Usage: gmail search <query>");
278
+ const results = await service.searchThreads(account, query, Number(values.max) || 10, values.page);
279
+ const { idToName } = await service.getLabelMap(account);
280
+ if (results.threads.length === 0) {
281
+ console.log("No results");
282
+ }
283
+ else {
284
+ console.log("ID\tDATE\tFROM\tSUBJECT\tLABELS");
285
+ for (const t of results.threads) {
286
+ const msg = t.messages[0];
287
+ const date = msg?.date ? new Date(msg.date).toISOString().slice(0, 16).replace("T", " ") : "";
288
+ const from = msg?.from?.replace(/\t/g, " ") || "";
289
+ const subject = msg?.subject?.replace(/\t/g, " ") || "(no subject)";
290
+ const labels = msg?.labelIds?.map((id) => idToName.get(id) || id).join(",") || "";
291
+ console.log(`${t.id}\t${date}\t${from}\t${subject}\t${labels}`);
292
+ }
293
+ if (results.nextPageToken) {
294
+ console.log(`\n# Next page: --page ${results.nextPageToken}`);
295
+ }
296
+ }
297
+ }
298
+ async function handleThread(account, args) {
299
+ const download = args.includes("--download");
300
+ const filtered = args.filter((a) => a !== "--download");
301
+ const threadId = filtered[0];
302
+ if (!threadId)
303
+ error("Usage: gmail thread <threadId>");
304
+ const result = await service.getThread(account, threadId, download);
305
+ if (download) {
306
+ const attachments = result;
307
+ if (attachments.length === 0) {
308
+ console.log("No attachments");
309
+ }
310
+ else {
311
+ console.log("FILENAME\tPATH\tSIZE");
312
+ for (const a of attachments) {
313
+ console.log(`${a.filename}\t${a.path}\t${a.size}`);
314
+ }
315
+ }
316
+ }
317
+ else {
318
+ const thread = result;
319
+ for (const msg of thread.messages || []) {
320
+ const headers = msg.payload?.headers || [];
321
+ const getHeader = (name) => headers.find((h) => h.name?.toLowerCase() === name.toLowerCase())?.value || "";
322
+ console.log(`Message-ID: ${msg.id}`);
323
+ console.log(`From: ${getHeader("from")}`);
324
+ console.log(`To: ${getHeader("to")}`);
325
+ console.log(`Date: ${getHeader("date")}`);
326
+ console.log(`Subject: ${getHeader("subject")}`);
327
+ console.log("");
328
+ console.log(decodeBody(msg.payload));
329
+ console.log("");
330
+ const attachments = getAttachments(msg.payload);
331
+ if (attachments.length > 0) {
332
+ console.log("Attachments:");
333
+ for (const att of attachments) {
334
+ console.log(` - ${att.filename} (${formatSize(att.size)}, ${att.mimeType})`);
335
+ }
336
+ console.log("");
337
+ }
338
+ console.log("---");
339
+ }
340
+ }
341
+ }
342
+ function formatSize(bytes) {
343
+ if (bytes === 0)
344
+ return "0 B";
345
+ const units = ["B", "KB", "MB", "GB"];
346
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
347
+ return `${(bytes / 1024 ** i).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
348
+ }
349
+ function decodeBody(payload) {
350
+ if (!payload)
351
+ return "";
352
+ if (payload.body?.data) {
353
+ return Buffer.from(payload.body.data, "base64url").toString();
354
+ }
355
+ if (payload.parts) {
356
+ for (const part of payload.parts) {
357
+ if (part.mimeType === "text/plain" && part.body?.data) {
358
+ return Buffer.from(part.body.data, "base64url").toString();
359
+ }
360
+ }
361
+ for (const part of payload.parts) {
362
+ const nested = decodeBody(part);
363
+ if (nested)
364
+ return nested;
365
+ }
366
+ }
367
+ return "";
368
+ }
369
+ function getAttachments(payload) {
370
+ const attachments = [];
371
+ if (!payload?.parts)
372
+ return attachments;
373
+ for (const part of payload.parts) {
374
+ if (part.filename && part.body?.attachmentId) {
375
+ attachments.push({
376
+ filename: part.filename,
377
+ size: part.body.size || 0,
378
+ mimeType: part.mimeType || "application/octet-stream",
379
+ });
380
+ }
381
+ attachments.push(...getAttachments(part));
382
+ }
383
+ return attachments;
384
+ }
385
+ async function handleLabels(account, args) {
386
+ const { values, positionals } = parseArgs({
387
+ args,
388
+ options: {
389
+ add: { type: "string", short: "a" },
390
+ remove: { type: "string", short: "r" },
391
+ },
392
+ allowPositionals: true,
393
+ });
394
+ if (positionals.length === 0) {
395
+ error("Usage: gmail labels list | gmail labels <threadIds...> [--add L] [--remove L]");
396
+ }
397
+ // labels list
398
+ if (positionals[0] === "list") {
399
+ const labels = await service.listLabels(account);
400
+ console.log("ID\tNAME\tTYPE");
401
+ for (const l of labels) {
402
+ console.log(`${l.id}\t${l.name}\t${l.type}`);
403
+ }
404
+ return;
405
+ }
406
+ // labels <threadIds...> [--add] [--remove]
407
+ const threadIds = positionals;
408
+ const { nameToId } = await service.getLabelMap(account);
409
+ const addLabels = values.add ? service.resolveLabelIds(values.add.split(","), nameToId) : [];
410
+ const removeLabels = values.remove ? service.resolveLabelIds(values.remove.split(","), nameToId) : [];
411
+ const results = await service.modifyLabels(account, threadIds, addLabels, removeLabels);
412
+ for (const r of results) {
413
+ console.log(`${r.threadId}: ${r.success ? "ok" : r.error}`);
414
+ }
415
+ }
416
+ // Restricted operation handlers with clear guidance
417
+ function handleRestrictedSend() {
418
+ throw new RestrictedOperationError("Sending emails is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
419
+
420
+ To send an email, you should:
421
+ 1. Open the thread in Gmail using: gmail url <threadId>
422
+ 2. Compose and send the email manually in the Gmail web interface
423
+
424
+ This restriction ensures human review before any outbound communication.`);
425
+ }
426
+ function handleRestrictedDraftCreate() {
427
+ throw new RestrictedOperationError("Creating drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
428
+
429
+ To create a draft:
430
+ 1. Open Gmail directly in your browser
431
+ 2. Compose the draft manually
432
+
433
+ Drafts created programmatically bypass human review of the content.`);
434
+ }
435
+ function handleRestrictedDraftSend() {
436
+ throw new RestrictedOperationError("Sending drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
437
+
438
+ To send a draft:
439
+ 1. Open Gmail directly in your browser
440
+ 2. Review the draft content
441
+ 3. Send it manually after verification
442
+
443
+ This restriction ensures human review before any outbound communication.`);
444
+ }
445
+ function handleRestrictedDraftDelete() {
446
+ throw new RestrictedOperationError("Deleting drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
447
+
448
+ To delete a draft:
449
+ 1. Open Gmail directly in your browser
450
+ 2. Navigate to Drafts
451
+ 3. Delete the draft manually after confirmation
452
+
453
+ This restriction prevents accidental data loss.`);
454
+ }
455
+ async function handleDrafts(account, args) {
456
+ const action = args[0];
457
+ const rest = args.slice(1);
458
+ if (!action)
459
+ error("Usage: gmail drafts <action>");
460
+ switch (action) {
461
+ case "list": {
462
+ const drafts = await service.listDrafts(account);
463
+ if (drafts.length === 0) {
464
+ console.log("No drafts");
465
+ }
466
+ else {
467
+ console.log("ID\tMESSAGE_ID");
468
+ for (const d of drafts) {
469
+ console.log(`${d.id}\t${d.message?.id || ""}`);
470
+ }
471
+ }
472
+ break;
473
+ }
474
+ case "get": {
475
+ const download = rest.includes("--download");
476
+ const filtered = rest.filter((a) => a !== "--download");
477
+ const draftId = filtered[0];
478
+ if (!draftId)
479
+ error("Usage: gmail drafts get <draftId> [--download]");
480
+ const draft = await service.getDraft(account, draftId);
481
+ const msg = draft.message;
482
+ if (msg) {
483
+ if (download) {
484
+ const downloaded = await service.downloadMessageAttachments(account, msg.id);
485
+ if (downloaded.length === 0) {
486
+ console.log("No attachments");
487
+ }
488
+ else {
489
+ console.log("FILENAME\tPATH\tSIZE");
490
+ for (const a of downloaded) {
491
+ console.log(`${a.filename}\t${a.path}\t${a.size}`);
492
+ }
493
+ }
494
+ }
495
+ else {
496
+ const headers = msg.payload?.headers || [];
497
+ const getHeader = (name) => headers.find((h) => h.name?.toLowerCase() === name.toLowerCase())?.value || "";
498
+ console.log(`Draft-ID: ${draft.id}`);
499
+ console.log(`To: ${getHeader("to")}`);
500
+ console.log(`Cc: ${getHeader("cc")}`);
501
+ console.log(`Subject: ${getHeader("subject")}`);
502
+ console.log("");
503
+ console.log(decodeBody(msg.payload));
504
+ console.log("");
505
+ const attachments = getAttachments(msg.payload);
506
+ if (attachments.length > 0) {
507
+ console.log("Attachments:");
508
+ for (const att of attachments) {
509
+ console.log(` - ${att.filename} (${formatSize(att.size)}, ${att.mimeType})`);
510
+ }
511
+ }
512
+ }
513
+ }
514
+ break;
515
+ }
516
+ case "delete":
517
+ handleRestrictedDraftDelete();
518
+ break;
519
+ case "send":
520
+ handleRestrictedDraftSend();
521
+ break;
522
+ case "create":
523
+ handleRestrictedDraftCreate();
524
+ break;
525
+ default:
526
+ error(`Unknown action: ${action}`);
527
+ }
528
+ }
529
+ function handleUrl(account, args) {
530
+ if (args.length === 0) {
531
+ error("Usage: gmail url <threadIds...>");
532
+ }
533
+ for (const id of args) {
534
+ const url = `https://mail.google.com/mail/?authuser=${encodeURIComponent(account)}#all/${id}`;
535
+ console.log(`${id}\t${url}`);
536
+ }
537
+ }
538
+ main();
539
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class GmailOAuthFlow {
2
+ private oauth2Client;
3
+ private server;
4
+ private timeoutId;
5
+ constructor(clientId: string, clientSecret: string);
6
+ authorize(manual?: boolean): Promise<string>;
7
+ private startManualFlow;
8
+ private startAuthFlow;
9
+ private handleCallback;
10
+ private cleanup;
11
+ private openBrowser;
12
+ }
13
+ //# sourceMappingURL=gmail-oauth-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-oauth-flow.d.ts","sourceRoot":"","sources":["../src/gmail-oauth-flow.ts"],"names":[],"mappings":"AAoBA,qBAAa,cAAc;IAC1B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAA+B;gBAEpC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAI5C,SAAS,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;YAWlC,eAAe;IAqC7B,OAAO,CAAC,aAAa;YA8CP,cAAc;IAmC5B,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,WAAW;CAInB"}