@bobfrankston/gcal 0.1.20 → 0.1.23

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/gcal.d.ts CHANGED
@@ -4,8 +4,7 @@
4
4
  * Manage Google Calendar events with ICS import support
5
5
  *
6
6
  * Can be associated with .ics files for direct import:
7
- * assoc .ics=icsfile
8
- * ftype icsfile=gcal "%1"
7
+ * gcal assoc
9
8
  */
10
9
  export {};
11
10
  //# sourceMappingURL=gcal.d.ts.map
package/gcal.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gcal.d.ts","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
1
+ {"version":3,"file":"gcal.d.ts","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
package/gcal.js CHANGED
@@ -4,11 +4,11 @@
4
4
  * Manage Google Calendar events with ICS import support
5
5
  *
6
6
  * Can be associated with .ics files for direct import:
7
- * assoc .ics=icsfile
8
- * ftype icsfile=gcal "%1"
7
+ * gcal assoc
9
8
  */
10
9
  import fs from 'fs';
11
10
  import path from 'path';
11
+ import { execSync } from 'child_process';
12
12
  import { authenticateOAuth } from '@bobfrankston/oauthsupport';
13
13
  import { CREDENTIALS_FILE, loadConfig, saveConfig, getUserPaths, ensureUserDir, formatDateTime, formatDuration, parseDuration, parseDateTime, ts, normalizeUser } from './glib/gutils.js';
14
14
  const CALENDAR_API_BASE = 'https://www.googleapis.com/calendar/v3';
@@ -68,13 +68,15 @@ async function listCalendars(accessToken) {
68
68
  const data = await res.json();
69
69
  return data.items || [];
70
70
  }
71
- async function listEvents(accessToken, calendarId = 'primary', maxResults = 10, timeMin) {
71
+ async function listEvents(accessToken, calendarId = 'primary', maxResults = 10, timeMin, timeMax) {
72
72
  const params = new URLSearchParams({
73
73
  maxResults: maxResults.toString(),
74
74
  singleEvents: 'true',
75
75
  orderBy: 'startTime',
76
76
  timeMin: timeMin || new Date().toISOString()
77
77
  });
78
+ if (timeMax)
79
+ params.set('timeMax', timeMax);
78
80
  const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events?${params}`;
79
81
  const res = await apiFetch(url, accessToken);
80
82
  if (!res.ok) {
@@ -103,6 +105,18 @@ async function deleteEvent(accessToken, eventId, calendarId = 'primary') {
103
105
  throw new Error(`Failed to delete event: ${res.status} ${errText}`);
104
106
  }
105
107
  }
108
+ async function updateEvent(accessToken, eventId, body, calendarId = 'primary') {
109
+ const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
110
+ const res = await apiFetch(url, accessToken, {
111
+ method: 'PATCH',
112
+ body: JSON.stringify(body)
113
+ });
114
+ if (!res.ok) {
115
+ const errText = await res.text();
116
+ throw new Error(`Failed to update event: ${res.status} ${errText}`);
117
+ }
118
+ return await res.json();
119
+ }
106
120
  async function importIcsFile(filePath, accessToken, calendarId = 'primary') {
107
121
  const ICAL = await import('ical.js');
108
122
  const result = { imported: 0, errors: [] };
@@ -172,6 +186,39 @@ async function importIcsFile(filePath, accessToken, calendarId = 'primary') {
172
186
  }
173
187
  return result;
174
188
  }
189
+ function setupFileAssociation() {
190
+ if (process.platform !== 'win32') {
191
+ console.error('File association is only supported on Windows.');
192
+ process.exit(1);
193
+ }
194
+ const classKey = 'HKCU\\Software\\Classes';
195
+ const command = `cmd.exe /c gcal "%1"`;
196
+ try {
197
+ execSync(`reg add "${classKey}\\.ics" /ve /d "gcalFile" /f`, { stdio: 'pipe' });
198
+ execSync(`reg add "${classKey}\\gcalFile\\shell\\open\\command" /ve /d "${command}" /f`, { stdio: 'pipe' });
199
+ console.log('.ics file association set — double-click any .ics to import via gcal');
200
+ }
201
+ catch (e) {
202
+ console.error(`Failed to set file association: ${e.message}`);
203
+ process.exit(1);
204
+ }
205
+ }
206
+ /** Clean up URLs — replace https URLs with [sitename] labels */
207
+ function cleanUrls(text) {
208
+ if (!text)
209
+ return text;
210
+ return text.replace(/https?:\/\/([^\/\s]+)\S*/gi, (_match, host) => {
211
+ // Extract meaningful site name from hostname
212
+ const parts = host.split('.');
213
+ // Drop common prefixes (www, us02web, events, etc.) and TLD suffixes
214
+ // Keep the main domain name: "us02web.zoom.us" → "Zoom", "events.vtools.ieee.org" → "ieee"
215
+ if (parts.length >= 2) {
216
+ const domain = parts.length > 2 ? parts[parts.length - 2] : parts[0];
217
+ return `[${domain.charAt(0).toUpperCase() + domain.slice(1)}]`;
218
+ }
219
+ return '[link]';
220
+ });
221
+ }
175
222
  function showUsage() {
176
223
  console.log(`
177
224
  gcal - Google Calendar CLI
@@ -184,8 +231,10 @@ Commands:
184
231
  list [n] List upcoming n events (default: 10)
185
232
  add <title> <when> [duration] Add event
186
233
  del|delete <id> [id2...] Delete event(s) by ID (prefix match)
234
+ update <id> [flags] Update event by ID (prefix match)
187
235
  import <file.ics> Import events from ICS file
188
236
  calendars List available calendars
237
+ assoc Associate .ics files with gcal (Windows)
189
238
  help Show this help
190
239
 
191
240
  Options:
@@ -193,8 +242,18 @@ Options:
193
242
  -defaultUser <email> Set default user for future use
194
243
  -c, -calendar <id> Calendar ID (default: primary)
195
244
  -n <count> Number of events to list
245
+ -limit <span> Time horizon for list: #d, #w, #m, #y (default: 3m)
196
246
  -v, -verbose Show event IDs and links
197
247
  -b, -birthdays Include birthday events (hidden by default)
248
+ -title <text> New title (update command)
249
+ -loc <text> New location (update command)
250
+ -start <when> New start time (update command)
251
+ -dur <duration> New duration (update command)
252
+ -r <spec> Reminders: #m, #h, #d with optional :email/:popup
253
+ -r 0 No reminders
254
+ -r 30m 30 min popup (default kind)
255
+ -r 1h:email 1 hour email
256
+ -r 15m,1h Multiple: comma-separated
198
257
 
199
258
  Examples:
200
259
  gcal meeting.ics Import ICS file
@@ -203,13 +262,68 @@ Examples:
203
262
  gcal add "Lunch" "1/14/2026 12:00" "1h"
204
263
  gcal add "Meeting" "tomorrow 10:00"
205
264
  gcal add "Appointment" "jan 15 2pm"
265
+ gcal add "Call" "tomorrow 3pm" "30m" -r 15m,1h:email
266
+ gcal update abc1 -title "New Title" -loc "Room 5"
267
+ gcal update abc1 -start "friday 3pm" -dur 2h
268
+ gcal update abc1 -r 15m,1h:email
206
269
  gcal -defaultUser bob@gmail.com Set default user
207
270
 
208
271
  File Association (Windows):
209
- assoc .ics=icsfile
210
- ftype icsfile=gcal "%1"
272
+ gcal assoc Set up .ics file association
211
273
  `);
212
274
  }
275
+ /** Parse a reminder spec like "30m", "1h", "2d", "30m:email", "1h:popup" */
276
+ function parseReminder(spec) {
277
+ // Split on colon for method: "30m:email" or just "30m"
278
+ const [timePart, methodPart] = spec.split(':');
279
+ const method = methodPart === 'email' ? 'email' : 'popup';
280
+ const match = timePart.match(/^(\d+)\s*([mhd]?)$/i);
281
+ if (!match) {
282
+ console.error(`Invalid reminder: "${spec}" — use #m, #h, or #d (e.g. 30m, 1h, 2d)`);
283
+ process.exit(1);
284
+ }
285
+ const num = parseInt(match[1]);
286
+ const unit = (match[2] || 'm').toLowerCase();
287
+ let minutes;
288
+ switch (unit) {
289
+ case 'h':
290
+ minutes = num * 60;
291
+ break;
292
+ case 'd':
293
+ minutes = num * 60 * 24;
294
+ break;
295
+ default:
296
+ minutes = num;
297
+ break;
298
+ }
299
+ return { method, minutes };
300
+ }
301
+ /** Parse a time limit spec like "3m", "1y", "2w", "90d" into a future Date */
302
+ function parseTimeLimit(spec) {
303
+ const match = spec.match(/^(\d+)\s*([dwmy]?)$/i);
304
+ if (!match) {
305
+ console.error(`Invalid time limit: "${spec}" — use #d, #w, #m, or #y (e.g. 3m, 90d, 1y)`);
306
+ process.exit(1);
307
+ }
308
+ const num = parseInt(match[1]);
309
+ const unit = (match[2] || 'm').toLowerCase();
310
+ const now = new Date();
311
+ switch (unit) {
312
+ case 'd':
313
+ now.setDate(now.getDate() + num);
314
+ break;
315
+ case 'w':
316
+ now.setDate(now.getDate() + num * 7);
317
+ break;
318
+ case 'y':
319
+ now.setFullYear(now.getFullYear() + num);
320
+ break;
321
+ default:
322
+ now.setMonth(now.getMonth() + num);
323
+ break; // 'm' = months
324
+ }
325
+ return now;
326
+ }
213
327
  function parseArgs(argv) {
214
328
  const result = {
215
329
  command: '',
@@ -221,7 +335,14 @@ function parseArgs(argv) {
221
335
  help: false,
222
336
  verbose: false,
223
337
  icsFile: '',
224
- birthdays: false
338
+ birthdays: false,
339
+ reminders: [],
340
+ noReminders: false,
341
+ timeLimit: '3m',
342
+ title: '',
343
+ location: '',
344
+ startTime: '',
345
+ duration: ''
225
346
  };
226
347
  const unknown = [];
227
348
  let i = 0;
@@ -255,6 +376,44 @@ function parseArgs(argv) {
255
376
  case '--birthdays':
256
377
  result.birthdays = true;
257
378
  break;
379
+ case '-limit':
380
+ case '--limit':
381
+ result.timeLimit = argv[++i] || '3m';
382
+ break;
383
+ case '-title':
384
+ case '--title':
385
+ result.title = argv[++i] || '';
386
+ break;
387
+ case '-loc':
388
+ case '-location':
389
+ case '--location':
390
+ result.location = argv[++i] || '';
391
+ break;
392
+ case '-start':
393
+ case '--start':
394
+ result.startTime = argv[++i] || '';
395
+ break;
396
+ case '-dur':
397
+ case '-duration':
398
+ case '--duration':
399
+ result.duration = argv[++i] || '';
400
+ break;
401
+ case '-r':
402
+ case '-reminder':
403
+ case '--reminder': {
404
+ const rval = argv[++i] || '';
405
+ if (rval === '0' || rval === 'none') {
406
+ result.noReminders = true;
407
+ }
408
+ else {
409
+ for (const part of rval.split(',')) {
410
+ const reminder = parseReminder(part.trim());
411
+ if (reminder)
412
+ result.reminders.push(reminder);
413
+ }
414
+ }
415
+ break;
416
+ }
258
417
  case '-h':
259
418
  case '-help':
260
419
  case '--help':
@@ -282,7 +441,8 @@ function parseArgs(argv) {
282
441
  i++;
283
442
  }
284
443
  if (unknown.length > 0) {
285
- console.error(`Unknown options: ${unknown.join(', ')}`);
444
+ console.error(`Unknown options: ${unknown.join(', ')}\n`);
445
+ showUsage();
286
446
  process.exit(1);
287
447
  }
288
448
  return result;
@@ -326,6 +486,11 @@ async function main() {
326
486
  showUsage();
327
487
  process.exit(1);
328
488
  }
489
+ // Commands that don't need a user
490
+ if (parsed.command === 'assoc') {
491
+ setupFileAssociation();
492
+ process.exit(0);
493
+ }
329
494
  // Resolve user
330
495
  const user = resolveUser(parsed.user, false);
331
496
  if (!user) {
@@ -358,8 +523,9 @@ async function main() {
358
523
  }
359
524
  case 'list': {
360
525
  const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
526
+ const timeMax = parseTimeLimit(parsed.timeLimit).toISOString();
361
527
  const token = await getAccessToken(user, false);
362
- let events = await listEvents(token, parsed.calendar, count);
528
+ let events = await listEvents(token, parsed.calendar, count, undefined, timeMax);
363
529
  const birthdayCount = events.filter(e => e.eventType === 'birthday').length;
364
530
  if (!parsed.birthdays) {
365
531
  events = events.filter(e => e.eventType !== 'birthday');
@@ -375,8 +541,8 @@ async function main() {
375
541
  const shortId = (event.id || '').slice(0, 8);
376
542
  const start = event.start ? formatDateTime(event.start) : '?';
377
543
  const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
378
- const summary = (event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
379
- const loc = event.location || '';
544
+ const summary = cleanUrls(event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
545
+ const loc = cleanUrls(event.location || '');
380
546
  if (parsed.verbose) {
381
547
  rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
382
548
  }
@@ -390,12 +556,13 @@ async function main() {
390
556
  : ['ID', 'When', 'Dur', 'Event', 'Location'];
391
557
  const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map(r => (r[i] || '').length)));
392
558
  // Print header
393
- const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
559
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
394
560
  console.log(headerLine);
395
- console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
396
- // Print rows
561
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
562
+ // Print rows — last column not padded to avoid trailing whitespace
397
563
  for (const row of rows) {
398
- const line = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
564
+ const lastIdx = row.length - 1;
565
+ const line = row.map((cell, i) => i < lastIdx ? (cell || '').padEnd(colWidths[i]) : (cell || '')).join(' ');
399
566
  console.log(line);
400
567
  }
401
568
  }
@@ -425,10 +592,27 @@ async function main() {
425
592
  timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
426
593
  }
427
594
  };
595
+ if (parsed.noReminders) {
596
+ event.reminders = { useDefault: false, overrides: [] };
597
+ }
598
+ else if (parsed.reminders.length > 0) {
599
+ event.reminders = { useDefault: false, overrides: parsed.reminders };
600
+ }
428
601
  const token = await getAccessToken(user, true);
429
602
  const created = await createEvent(token, event, parsed.calendar);
430
603
  console.log(`\nEvent created: ${created.summary}`);
431
604
  console.log(` When: ${formatDateTime(created.start)} - ${formatDateTime(created.end)}`);
605
+ if (parsed.noReminders) {
606
+ console.log(` Reminders: none`);
607
+ }
608
+ else if (parsed.reminders.length > 0) {
609
+ const rlist = parsed.reminders.map(r => {
610
+ const mins = r.minutes;
611
+ const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
612
+ return `${label}${r.method === 'email' ? ':email' : ''}`;
613
+ }).join(', ');
614
+ console.log(` Reminders: ${rlist}`);
615
+ }
432
616
  if (created.htmlLink) {
433
617
  console.log(` Link: ${created.htmlLink}`);
434
618
  }
@@ -452,7 +636,12 @@ async function main() {
452
636
  if (matches.length > 1) {
453
637
  console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
454
638
  for (const e of matches) {
455
- console.error(` ${e.id?.slice(0, 8)} - ${e.summary}`);
639
+ // Show enough ID to distinguish recurring instances (base_date)
640
+ const displayId = (e.id || '').length > 12 ? e.id.slice(0, 16) : e.id?.slice(0, 8);
641
+ const cleaned = cleanUrls(e.summary || '');
642
+ const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
643
+ const when = e.start ? formatDateTime(e.start) : '';
644
+ console.error(` ${displayId} ${when} ${summary}`);
456
645
  }
457
646
  continue;
458
647
  }
@@ -462,7 +651,7 @@ async function main() {
462
651
  continue;
463
652
  }
464
653
  await deleteEvent(token, event.id, parsed.calendar);
465
- console.log(`Deleted: ${event.summary}`);
654
+ console.log(`Deleted: ${cleanUrls(event.summary || '')}`);
466
655
  }
467
656
  break;
468
657
  }
@@ -478,6 +667,99 @@ async function main() {
478
667
  }
479
668
  break;
480
669
  }
670
+ case 'update': {
671
+ if (parsed.args.length === 0) {
672
+ console.error('Usage: gcal update <id> [-title "..."] [-loc "..."] [-start "..."] [-dur "..."] [-r ...]');
673
+ console.error('Use "gcal list -v" to see event IDs');
674
+ process.exit(1);
675
+ }
676
+ const idPrefix = parsed.args[0];
677
+ const token = await getAccessToken(user, true);
678
+ const events = await listEvents(token, parsed.calendar, 50);
679
+ const matches = events.filter(e => e.id?.startsWith(idPrefix));
680
+ if (matches.length === 0) {
681
+ console.error(`${idPrefix}: not found`);
682
+ process.exit(1);
683
+ }
684
+ if (matches.length > 1) {
685
+ console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
686
+ for (const e of matches) {
687
+ const displayId = (e.id || '').length > 12 ? e.id.slice(0, 16) : e.id?.slice(0, 8);
688
+ const cleaned = cleanUrls(e.summary || '');
689
+ const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
690
+ const when = e.start ? formatDateTime(e.start) : '';
691
+ console.error(` ${displayId} ${when} ${summary}`);
692
+ }
693
+ process.exit(1);
694
+ }
695
+ const target = matches[0];
696
+ const body = {};
697
+ const changes = [];
698
+ if (parsed.title) {
699
+ body.summary = parsed.title;
700
+ changes.push(`title → "${parsed.title}"`);
701
+ }
702
+ if (parsed.location) {
703
+ body.location = parsed.location;
704
+ changes.push(`location → "${parsed.location}"`);
705
+ }
706
+ if (parsed.startTime) {
707
+ const newStart = parseDateTime(parsed.startTime);
708
+ const durationMs = parsed.duration
709
+ ? parseDuration(parsed.duration) * 60 * 1000
710
+ : (target.end?.dateTime && target.start?.dateTime)
711
+ ? new Date(target.end.dateTime).getTime() - new Date(target.start.dateTime).getTime()
712
+ : 60 * 60 * 1000;
713
+ const newEnd = new Date(newStart.getTime() + durationMs);
714
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
715
+ body.start = { dateTime: newStart.toISOString(), timeZone: tz };
716
+ body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
717
+ changes.push(`start → ${formatDateTime(body.start)}`);
718
+ if (parsed.duration)
719
+ changes.push(`duration → ${parsed.duration}`);
720
+ }
721
+ else if (parsed.duration) {
722
+ // Duration change without start change — shift end time
723
+ if (target.start?.dateTime) {
724
+ const startMs = new Date(target.start.dateTime).getTime();
725
+ const newEnd = new Date(startMs + parseDuration(parsed.duration) * 60 * 1000);
726
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
727
+ body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
728
+ changes.push(`duration → ${parsed.duration}`);
729
+ }
730
+ else {
731
+ console.error('Cannot change duration of all-day event');
732
+ process.exit(1);
733
+ }
734
+ }
735
+ if (parsed.noReminders) {
736
+ body.reminders = { useDefault: false, overrides: [] };
737
+ changes.push('reminders → none');
738
+ }
739
+ else if (parsed.reminders.length > 0) {
740
+ body.reminders = { useDefault: false, overrides: parsed.reminders };
741
+ const rlist = parsed.reminders.map(r => {
742
+ const mins = r.minutes;
743
+ const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
744
+ return `${label}${r.method === 'email' ? ':email' : ''}`;
745
+ }).join(', ');
746
+ changes.push(`reminders → ${rlist}`);
747
+ }
748
+ if (changes.length === 0) {
749
+ console.error('No update flags provided. Use -title, -loc, -start, -dur, or -r');
750
+ process.exit(1);
751
+ }
752
+ const updated = await updateEvent(token, target.id, body, parsed.calendar);
753
+ console.log(`\nUpdated: ${cleanUrls(updated.summary || '')}`);
754
+ for (const c of changes) {
755
+ console.log(` ${c}`);
756
+ }
757
+ break;
758
+ }
759
+ case 'assoc': {
760
+ setupFileAssociation();
761
+ break;
762
+ }
481
763
  default:
482
764
  console.error(`Unknown command: ${parsed.command}`);
483
765
  showUsage();
@@ -485,9 +767,11 @@ async function main() {
485
767
  }
486
768
  }
487
769
  if (import.meta.main) {
488
- main().catch(e => {
770
+ main().then(() => {
771
+ process.exitCode = 0;
772
+ }).catch(e => {
489
773
  console.error(`Error: ${e.message}`);
490
- process.exit(1);
774
+ process.exitCode = 1;
491
775
  });
492
776
  }
493
777
  //# sourceMappingURL=gcal.js.map
package/gcal.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gcal.js","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gcal.js","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":"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"}
package/gcal.ts CHANGED
@@ -4,14 +4,14 @@
4
4
  * Manage Google Calendar events with ICS import support
5
5
  *
6
6
  * Can be associated with .ics files for direct import:
7
- * assoc .ics=icsfile
8
- * ftype icsfile=gcal "%1"
7
+ * gcal assoc
9
8
  */
10
9
 
11
10
  import fs from 'fs';
12
11
  import path from 'path';
12
+ import { execSync } from 'child_process';
13
13
  import { authenticateOAuth } from '@bobfrankston/oauthsupport';
14
- import type { GoogleEvent, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
14
+ import type { GoogleEvent, EventReminder, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
15
15
  import {
16
16
  CREDENTIALS_FILE, loadConfig, saveConfig, getUserPaths,
17
17
  ensureUserDir, formatDateTime, formatDuration, parseDuration, parseDateTime, ts, normalizeUser
@@ -90,7 +90,8 @@ async function listEvents(
90
90
  accessToken: string,
91
91
  calendarId = 'primary',
92
92
  maxResults = 10,
93
- timeMin?: string
93
+ timeMin?: string,
94
+ timeMax?: string
94
95
  ): Promise<GoogleEvent[]> {
95
96
  const params = new URLSearchParams({
96
97
  maxResults: maxResults.toString(),
@@ -98,6 +99,8 @@ async function listEvents(
98
99
  orderBy: 'startTime',
99
100
  timeMin: timeMin || new Date().toISOString()
100
101
  });
102
+ if (timeMax)
103
+ params.set('timeMax', timeMax);
101
104
 
102
105
  const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events?${params}`;
103
106
  const res = await apiFetch(url, accessToken);
@@ -138,6 +141,24 @@ async function deleteEvent(
138
141
  }
139
142
  }
140
143
 
144
+ async function updateEvent(
145
+ accessToken: string,
146
+ eventId: string,
147
+ body: Partial<GoogleEvent>,
148
+ calendarId = 'primary'
149
+ ): Promise<GoogleEvent> {
150
+ const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
151
+ const res = await apiFetch(url, accessToken, {
152
+ method: 'PATCH',
153
+ body: JSON.stringify(body)
154
+ });
155
+ if (!res.ok) {
156
+ const errText = await res.text();
157
+ throw new Error(`Failed to update event: ${res.status} ${errText}`);
158
+ }
159
+ return await res.json() as GoogleEvent;
160
+ }
161
+
141
162
  async function importIcsFile(
142
163
  filePath: string,
143
164
  accessToken: string,
@@ -218,6 +239,41 @@ async function importIcsFile(
218
239
  return result;
219
240
  }
220
241
 
242
+ function setupFileAssociation(): void {
243
+ if (process.platform !== 'win32') {
244
+ console.error('File association is only supported on Windows.');
245
+ process.exit(1);
246
+ }
247
+
248
+ const classKey = 'HKCU\\Software\\Classes';
249
+ const command = `cmd.exe /c gcal "%1"`;
250
+
251
+ try {
252
+ execSync(`reg add "${classKey}\\.ics" /ve /d "gcalFile" /f`, { stdio: 'pipe' });
253
+ execSync(`reg add "${classKey}\\gcalFile\\shell\\open\\command" /ve /d "${command}" /f`, { stdio: 'pipe' });
254
+ console.log('.ics file association set — double-click any .ics to import via gcal');
255
+ } catch (e: any) {
256
+ console.error(`Failed to set file association: ${e.message}`);
257
+ process.exit(1);
258
+ }
259
+ }
260
+
261
+ /** Clean up URLs — replace https URLs with [sitename] labels */
262
+ function cleanUrls(text: string): string {
263
+ if (!text) return text;
264
+ return text.replace(/https?:\/\/([^\/\s]+)\S*/gi, (_match, host: string) => {
265
+ // Extract meaningful site name from hostname
266
+ const parts = host.split('.');
267
+ // Drop common prefixes (www, us02web, events, etc.) and TLD suffixes
268
+ // Keep the main domain name: "us02web.zoom.us" → "Zoom", "events.vtools.ieee.org" → "ieee"
269
+ if (parts.length >= 2) {
270
+ const domain = parts.length > 2 ? parts[parts.length - 2] : parts[0];
271
+ return `[${domain.charAt(0).toUpperCase() + domain.slice(1)}]`;
272
+ }
273
+ return '[link]';
274
+ });
275
+ }
276
+
221
277
  function showUsage(): void {
222
278
  console.log(`
223
279
  gcal - Google Calendar CLI
@@ -230,8 +286,10 @@ Commands:
230
286
  list [n] List upcoming n events (default: 10)
231
287
  add <title> <when> [duration] Add event
232
288
  del|delete <id> [id2...] Delete event(s) by ID (prefix match)
289
+ update <id> [flags] Update event by ID (prefix match)
233
290
  import <file.ics> Import events from ICS file
234
291
  calendars List available calendars
292
+ assoc Associate .ics files with gcal (Windows)
235
293
  help Show this help
236
294
 
237
295
  Options:
@@ -239,8 +297,18 @@ Options:
239
297
  -defaultUser <email> Set default user for future use
240
298
  -c, -calendar <id> Calendar ID (default: primary)
241
299
  -n <count> Number of events to list
300
+ -limit <span> Time horizon for list: #d, #w, #m, #y (default: 3m)
242
301
  -v, -verbose Show event IDs and links
243
302
  -b, -birthdays Include birthday events (hidden by default)
303
+ -title <text> New title (update command)
304
+ -loc <text> New location (update command)
305
+ -start <when> New start time (update command)
306
+ -dur <duration> New duration (update command)
307
+ -r <spec> Reminders: #m, #h, #d with optional :email/:popup
308
+ -r 0 No reminders
309
+ -r 30m 30 min popup (default kind)
310
+ -r 1h:email 1 hour email
311
+ -r 15m,1h Multiple: comma-separated
244
312
 
245
313
  Examples:
246
314
  gcal meeting.ics Import ICS file
@@ -249,11 +317,14 @@ Examples:
249
317
  gcal add "Lunch" "1/14/2026 12:00" "1h"
250
318
  gcal add "Meeting" "tomorrow 10:00"
251
319
  gcal add "Appointment" "jan 15 2pm"
320
+ gcal add "Call" "tomorrow 3pm" "30m" -r 15m,1h:email
321
+ gcal update abc1 -title "New Title" -loc "Room 5"
322
+ gcal update abc1 -start "friday 3pm" -dur 2h
323
+ gcal update abc1 -r 15m,1h:email
252
324
  gcal -defaultUser bob@gmail.com Set default user
253
325
 
254
326
  File Association (Windows):
255
- assoc .ics=icsfile
256
- ftype icsfile=gcal "%1"
327
+ gcal assoc Set up .ics file association
257
328
  `);
258
329
  }
259
330
 
@@ -268,6 +339,56 @@ interface ParsedArgs {
268
339
  verbose: boolean;
269
340
  icsFile: string; /** Direct .ics file path */
270
341
  birthdays: boolean;
342
+ reminders: EventReminder[]; /** Reminder overrides, empty = use defaults, null entry = no reminders */
343
+ noReminders: boolean; /** -r 0 means no reminders at all */
344
+ timeLimit: string; /** Max time horizon for list, e.g. "3m", "1y", "2w" — default "3m" */
345
+ title: string; /** New title for update command */
346
+ location: string; /** New location for update command */
347
+ startTime: string; /** New start time for update command */
348
+ duration: string; /** New duration for update command */
349
+ }
350
+
351
+ /** Parse a reminder spec like "30m", "1h", "2d", "30m:email", "1h:popup" */
352
+ function parseReminder(spec: string): EventReminder {
353
+ // Split on colon for method: "30m:email" or just "30m"
354
+ const [timePart, methodPart] = spec.split(':');
355
+ const method: 'email' | 'popup' = methodPart === 'email' ? 'email' : 'popup';
356
+
357
+ const match = timePart.match(/^(\d+)\s*([mhd]?)$/i);
358
+ if (!match) {
359
+ console.error(`Invalid reminder: "${spec}" — use #m, #h, or #d (e.g. 30m, 1h, 2d)`);
360
+ process.exit(1);
361
+ }
362
+
363
+ const num = parseInt(match[1]);
364
+ const unit = (match[2] || 'm').toLowerCase();
365
+ let minutes: number;
366
+ switch (unit) {
367
+ case 'h': minutes = num * 60; break;
368
+ case 'd': minutes = num * 60 * 24; break;
369
+ default: minutes = num; break;
370
+ }
371
+
372
+ return { method, minutes };
373
+ }
374
+
375
+ /** Parse a time limit spec like "3m", "1y", "2w", "90d" into a future Date */
376
+ function parseTimeLimit(spec: string): Date {
377
+ const match = spec.match(/^(\d+)\s*([dwmy]?)$/i);
378
+ if (!match) {
379
+ console.error(`Invalid time limit: "${spec}" — use #d, #w, #m, or #y (e.g. 3m, 90d, 1y)`);
380
+ process.exit(1);
381
+ }
382
+ const num = parseInt(match[1]);
383
+ const unit = (match[2] || 'm').toLowerCase();
384
+ const now = new Date();
385
+ switch (unit) {
386
+ case 'd': now.setDate(now.getDate() + num); break;
387
+ case 'w': now.setDate(now.getDate() + num * 7); break;
388
+ case 'y': now.setFullYear(now.getFullYear() + num); break;
389
+ default: now.setMonth(now.getMonth() + num); break; // 'm' = months
390
+ }
391
+ return now;
271
392
  }
272
393
 
273
394
  function parseArgs(argv: string[]): ParsedArgs {
@@ -281,7 +402,14 @@ function parseArgs(argv: string[]): ParsedArgs {
281
402
  help: false,
282
403
  verbose: false,
283
404
  icsFile: '',
284
- birthdays: false
405
+ birthdays: false,
406
+ reminders: [],
407
+ noReminders: false,
408
+ timeLimit: '3m',
409
+ title: '',
410
+ location: '',
411
+ startTime: '',
412
+ duration: ''
285
413
  };
286
414
 
287
415
  const unknown: string[] = [];
@@ -316,6 +444,43 @@ function parseArgs(argv: string[]): ParsedArgs {
316
444
  case '--birthdays':
317
445
  result.birthdays = true;
318
446
  break;
447
+ case '-limit':
448
+ case '--limit':
449
+ result.timeLimit = argv[++i] || '3m';
450
+ break;
451
+ case '-title':
452
+ case '--title':
453
+ result.title = argv[++i] || '';
454
+ break;
455
+ case '-loc':
456
+ case '-location':
457
+ case '--location':
458
+ result.location = argv[++i] || '';
459
+ break;
460
+ case '-start':
461
+ case '--start':
462
+ result.startTime = argv[++i] || '';
463
+ break;
464
+ case '-dur':
465
+ case '-duration':
466
+ case '--duration':
467
+ result.duration = argv[++i] || '';
468
+ break;
469
+ case '-r':
470
+ case '-reminder':
471
+ case '--reminder': {
472
+ const rval = argv[++i] || '';
473
+ if (rval === '0' || rval === 'none') {
474
+ result.noReminders = true;
475
+ } else {
476
+ for (const part of rval.split(',')) {
477
+ const reminder = parseReminder(part.trim());
478
+ if (reminder)
479
+ result.reminders.push(reminder);
480
+ }
481
+ }
482
+ break;
483
+ }
319
484
  case '-h':
320
485
  case '-help':
321
486
  case '--help':
@@ -341,7 +506,8 @@ function parseArgs(argv: string[]): ParsedArgs {
341
506
  }
342
507
 
343
508
  if (unknown.length > 0) {
344
- console.error(`Unknown options: ${unknown.join(', ')}`);
509
+ console.error(`Unknown options: ${unknown.join(', ')}\n`);
510
+ showUsage();
345
511
  process.exit(1);
346
512
  }
347
513
 
@@ -396,6 +562,12 @@ async function main(): Promise<void> {
396
562
  process.exit(1);
397
563
  }
398
564
 
565
+ // Commands that don't need a user
566
+ if (parsed.command === 'assoc') {
567
+ setupFileAssociation();
568
+ process.exit(0);
569
+ }
570
+
399
571
  // Resolve user
400
572
  const user = resolveUser(parsed.user, false);
401
573
  if (!user) {
@@ -435,8 +607,9 @@ async function main(): Promise<void> {
435
607
 
436
608
  case 'list': {
437
609
  const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
610
+ const timeMax = parseTimeLimit(parsed.timeLimit).toISOString();
438
611
  const token = await getAccessToken(user, false);
439
- let events = await listEvents(token, parsed.calendar, count);
612
+ let events = await listEvents(token, parsed.calendar, count, undefined, timeMax);
440
613
  const birthdayCount = events.filter(e => e.eventType === 'birthday').length;
441
614
  if (!parsed.birthdays) {
442
615
  events = events.filter(e => e.eventType !== 'birthday');
@@ -453,8 +626,8 @@ async function main(): Promise<void> {
453
626
  const shortId = (event.id || '').slice(0, 8);
454
627
  const start = event.start ? formatDateTime(event.start) : '?';
455
628
  const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
456
- const summary = (event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
457
- const loc = event.location || '';
629
+ const summary = cleanUrls(event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
630
+ const loc = cleanUrls(event.location || '');
458
631
  if (parsed.verbose) {
459
632
  rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
460
633
  } else {
@@ -471,13 +644,14 @@ async function main(): Promise<void> {
471
644
  );
472
645
 
473
646
  // Print header
474
- const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
647
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
475
648
  console.log(headerLine);
476
- console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
649
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
477
650
 
478
- // Print rows
651
+ // Print rows — last column not padded to avoid trailing whitespace
479
652
  for (const row of rows) {
480
- const line = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
653
+ const lastIdx = row.length - 1;
654
+ const line = row.map((cell, i) => i < lastIdx ? (cell || '').padEnd(colWidths[i]) : (cell || '')).join(' ');
481
655
  console.log(line);
482
656
  }
483
657
  }
@@ -511,10 +685,26 @@ async function main(): Promise<void> {
511
685
  }
512
686
  };
513
687
 
688
+ if (parsed.noReminders) {
689
+ event.reminders = { useDefault: false, overrides: [] };
690
+ } else if (parsed.reminders.length > 0) {
691
+ event.reminders = { useDefault: false, overrides: parsed.reminders };
692
+ }
693
+
514
694
  const token = await getAccessToken(user, true);
515
695
  const created = await createEvent(token, event, parsed.calendar);
516
696
  console.log(`\nEvent created: ${created.summary}`);
517
697
  console.log(` When: ${formatDateTime(created.start)} - ${formatDateTime(created.end)}`);
698
+ if (parsed.noReminders) {
699
+ console.log(` Reminders: none`);
700
+ } else if (parsed.reminders.length > 0) {
701
+ const rlist = parsed.reminders.map(r => {
702
+ const mins = r.minutes;
703
+ const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
704
+ return `${label}${r.method === 'email' ? ':email' : ''}`;
705
+ }).join(', ');
706
+ console.log(` Reminders: ${rlist}`);
707
+ }
518
708
  if (created.htmlLink) {
519
709
  console.log(` Link: ${created.htmlLink}`);
520
710
  }
@@ -542,7 +732,12 @@ async function main(): Promise<void> {
542
732
  if (matches.length > 1) {
543
733
  console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
544
734
  for (const e of matches) {
545
- console.error(` ${e.id?.slice(0, 8)} - ${e.summary}`);
735
+ // Show enough ID to distinguish recurring instances (base_date)
736
+ const displayId = (e.id || '').length > 12 ? e.id!.slice(0, 16) : e.id?.slice(0, 8);
737
+ const cleaned = cleanUrls(e.summary || '');
738
+ const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
739
+ const when = e.start ? formatDateTime(e.start) : '';
740
+ console.error(` ${displayId} ${when} ${summary}`);
546
741
  }
547
742
  continue;
548
743
  }
@@ -553,7 +748,7 @@ async function main(): Promise<void> {
553
748
  continue;
554
749
  }
555
750
  await deleteEvent(token, event.id!, parsed.calendar);
556
- console.log(`Deleted: ${event.summary}`);
751
+ console.log(`Deleted: ${cleanUrls(event.summary || '')}`);
557
752
  }
558
753
  break;
559
754
  }
@@ -572,6 +767,104 @@ async function main(): Promise<void> {
572
767
  break;
573
768
  }
574
769
 
770
+ case 'update': {
771
+ if (parsed.args.length === 0) {
772
+ console.error('Usage: gcal update <id> [-title "..."] [-loc "..."] [-start "..."] [-dur "..."] [-r ...]');
773
+ console.error('Use "gcal list -v" to see event IDs');
774
+ process.exit(1);
775
+ }
776
+
777
+ const idPrefix = parsed.args[0];
778
+ const token = await getAccessToken(user, true);
779
+ const events = await listEvents(token, parsed.calendar, 50);
780
+ const matches = events.filter(e => e.id?.startsWith(idPrefix));
781
+
782
+ if (matches.length === 0) {
783
+ console.error(`${idPrefix}: not found`);
784
+ process.exit(1);
785
+ }
786
+ if (matches.length > 1) {
787
+ console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
788
+ for (const e of matches) {
789
+ const displayId = (e.id || '').length > 12 ? e.id.slice(0, 16) : e.id?.slice(0, 8);
790
+ const cleaned = cleanUrls(e.summary || '');
791
+ const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
792
+ const when = e.start ? formatDateTime(e.start) : '';
793
+ console.error(` ${displayId} ${when} ${summary}`);
794
+ }
795
+ process.exit(1);
796
+ }
797
+
798
+ const target = matches[0];
799
+ const body: Partial<GoogleEvent> = {};
800
+ const changes: string[] = [];
801
+
802
+ if (parsed.title) {
803
+ body.summary = parsed.title;
804
+ changes.push(`title → "${parsed.title}"`);
805
+ }
806
+ if (parsed.location) {
807
+ body.location = parsed.location;
808
+ changes.push(`location → "${parsed.location}"`);
809
+ }
810
+ if (parsed.startTime) {
811
+ const newStart = parseDateTime(parsed.startTime);
812
+ const durationMs = parsed.duration
813
+ ? parseDuration(parsed.duration) * 60 * 1000
814
+ : (target.end?.dateTime && target.start?.dateTime)
815
+ ? new Date(target.end.dateTime).getTime() - new Date(target.start.dateTime).getTime()
816
+ : 60 * 60 * 1000;
817
+ const newEnd = new Date(newStart.getTime() + durationMs);
818
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
819
+ body.start = { dateTime: newStart.toISOString(), timeZone: tz };
820
+ body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
821
+ changes.push(`start → ${formatDateTime(body.start)}`);
822
+ if (parsed.duration) changes.push(`duration → ${parsed.duration}`);
823
+ } else if (parsed.duration) {
824
+ // Duration change without start change — shift end time
825
+ if (target.start?.dateTime) {
826
+ const startMs = new Date(target.start.dateTime).getTime();
827
+ const newEnd = new Date(startMs + parseDuration(parsed.duration) * 60 * 1000);
828
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
829
+ body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
830
+ changes.push(`duration → ${parsed.duration}`);
831
+ } else {
832
+ console.error('Cannot change duration of all-day event');
833
+ process.exit(1);
834
+ }
835
+ }
836
+
837
+ if (parsed.noReminders) {
838
+ body.reminders = { useDefault: false, overrides: [] };
839
+ changes.push('reminders → none');
840
+ } else if (parsed.reminders.length > 0) {
841
+ body.reminders = { useDefault: false, overrides: parsed.reminders };
842
+ const rlist = parsed.reminders.map(r => {
843
+ const mins = r.minutes;
844
+ const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
845
+ return `${label}${r.method === 'email' ? ':email' : ''}`;
846
+ }).join(', ');
847
+ changes.push(`reminders → ${rlist}`);
848
+ }
849
+
850
+ if (changes.length === 0) {
851
+ console.error('No update flags provided. Use -title, -loc, -start, -dur, or -r');
852
+ process.exit(1);
853
+ }
854
+
855
+ const updated = await updateEvent(token, target.id, body, parsed.calendar);
856
+ console.log(`\nUpdated: ${cleanUrls(updated.summary || '')}`);
857
+ for (const c of changes) {
858
+ console.log(` ${c}`);
859
+ }
860
+ break;
861
+ }
862
+
863
+ case 'assoc': {
864
+ setupFileAssociation();
865
+ break;
866
+ }
867
+
575
868
  default:
576
869
  console.error(`Unknown command: ${parsed.command}`);
577
870
  showUsage();
@@ -580,8 +873,10 @@ async function main(): Promise<void> {
580
873
  }
581
874
 
582
875
  if (import.meta.main) {
583
- main().catch(e => {
876
+ main().then(() => {
877
+ process.exitCode = 0;
878
+ }).catch(e => {
584
879
  console.error(`Error: ${e.message}`);
585
- process.exit(1);
880
+ process.exitCode = 1;
586
881
  });
587
882
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/gcal",
3
- "version": "0.1.20",
3
+ "version": "0.1.23",
4
4
  "description": "Google Calendar CLI tool with ICS import support",
5
5
  "type": "module",
6
6
  "main": "gcal.js",
@@ -26,14 +26,17 @@
26
26
  "url": "git+https://github.com/BobFrankston/gcal.git"
27
27
  },
28
28
  "scripts": {
29
+ "postinstall": "node -e \"if(process.platform==='win32')console.log('\\nTip: run \\\"gcal assoc\\\" to associate .ics files with gcal')\"",
29
30
  "build": "tsc",
30
31
  "check": "tsc --noEmit",
31
32
  "prerelease:local": "git add -A && (git diff-index --quiet HEAD || git commit -m \"Pre-release commit\")",
32
33
  "preversion": "npm run build && git add -A",
33
34
  "postversion": "git push && git push --tags",
34
- "release": "npm run prerelease:local && npm version patch && npm publish --access public",
35
+ "release": "npmglobalize",
35
36
  "release:local": "npm run prerelease:local && npm version patch && npm publish --access public --ignore-scripts",
36
- "installer": "npm run release && npm install -g ."
37
+ "installer": "npm run release && npm install -g .",
38
+ "old-release": "npm run prerelease:local && npm version patch && npm publish --access public",
39
+ "old-installer": "npm run release && npm install -g ."
37
40
  },
38
41
  "keywords": [
39
42
  "google",