@bobfrankston/gcal 0.1.22 → 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,13 @@ 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)
198
252
  -r <spec> Reminders: #m, #h, #d with optional :email/:popup
199
253
  -r 0 No reminders
200
254
  -r 30m 30 min popup (default kind)
@@ -209,11 +263,13 @@ Examples:
209
263
  gcal add "Meeting" "tomorrow 10:00"
210
264
  gcal add "Appointment" "jan 15 2pm"
211
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
212
269
  gcal -defaultUser bob@gmail.com Set default user
213
270
 
214
271
  File Association (Windows):
215
- assoc .ics=icsfile
216
- ftype icsfile=gcal "%1"
272
+ gcal assoc Set up .ics file association
217
273
  `);
218
274
  }
219
275
  /** Parse a reminder spec like "30m", "1h", "2d", "30m:email", "1h:popup" */
@@ -242,6 +298,32 @@ function parseReminder(spec) {
242
298
  }
243
299
  return { method, minutes };
244
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
+ }
245
327
  function parseArgs(argv) {
246
328
  const result = {
247
329
  command: '',
@@ -255,7 +337,12 @@ function parseArgs(argv) {
255
337
  icsFile: '',
256
338
  birthdays: false,
257
339
  reminders: [],
258
- noReminders: false
340
+ noReminders: false,
341
+ timeLimit: '3m',
342
+ title: '',
343
+ location: '',
344
+ startTime: '',
345
+ duration: ''
259
346
  };
260
347
  const unknown = [];
261
348
  let i = 0;
@@ -289,6 +376,28 @@ function parseArgs(argv) {
289
376
  case '--birthdays':
290
377
  result.birthdays = true;
291
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;
292
401
  case '-r':
293
402
  case '-reminder':
294
403
  case '--reminder': {
@@ -332,7 +441,8 @@ function parseArgs(argv) {
332
441
  i++;
333
442
  }
334
443
  if (unknown.length > 0) {
335
- console.error(`Unknown options: ${unknown.join(', ')}`);
444
+ console.error(`Unknown options: ${unknown.join(', ')}\n`);
445
+ showUsage();
336
446
  process.exit(1);
337
447
  }
338
448
  return result;
@@ -376,6 +486,11 @@ async function main() {
376
486
  showUsage();
377
487
  process.exit(1);
378
488
  }
489
+ // Commands that don't need a user
490
+ if (parsed.command === 'assoc') {
491
+ setupFileAssociation();
492
+ process.exit(0);
493
+ }
379
494
  // Resolve user
380
495
  const user = resolveUser(parsed.user, false);
381
496
  if (!user) {
@@ -408,8 +523,9 @@ async function main() {
408
523
  }
409
524
  case 'list': {
410
525
  const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
526
+ const timeMax = parseTimeLimit(parsed.timeLimit).toISOString();
411
527
  const token = await getAccessToken(user, false);
412
- let events = await listEvents(token, parsed.calendar, count);
528
+ let events = await listEvents(token, parsed.calendar, count, undefined, timeMax);
413
529
  const birthdayCount = events.filter(e => e.eventType === 'birthday').length;
414
530
  if (!parsed.birthdays) {
415
531
  events = events.filter(e => e.eventType !== 'birthday');
@@ -425,8 +541,8 @@ async function main() {
425
541
  const shortId = (event.id || '').slice(0, 8);
426
542
  const start = event.start ? formatDateTime(event.start) : '?';
427
543
  const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
428
- const summary = (event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
429
- const loc = event.location || '';
544
+ const summary = cleanUrls(event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
545
+ const loc = cleanUrls(event.location || '');
430
546
  if (parsed.verbose) {
431
547
  rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
432
548
  }
@@ -440,12 +556,13 @@ async function main() {
440
556
  : ['ID', 'When', 'Dur', 'Event', 'Location'];
441
557
  const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map(r => (r[i] || '').length)));
442
558
  // Print header
443
- const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
559
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
444
560
  console.log(headerLine);
445
- console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
446
- // Print rows
561
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
562
+ // Print rows — last column not padded to avoid trailing whitespace
447
563
  for (const row of rows) {
448
- 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(' ');
449
566
  console.log(line);
450
567
  }
451
568
  }
@@ -519,7 +636,12 @@ async function main() {
519
636
  if (matches.length > 1) {
520
637
  console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
521
638
  for (const e of matches) {
522
- 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}`);
523
645
  }
524
646
  continue;
525
647
  }
@@ -529,7 +651,7 @@ async function main() {
529
651
  continue;
530
652
  }
531
653
  await deleteEvent(token, event.id, parsed.calendar);
532
- console.log(`Deleted: ${event.summary}`);
654
+ console.log(`Deleted: ${cleanUrls(event.summary || '')}`);
533
655
  }
534
656
  break;
535
657
  }
@@ -545,6 +667,99 @@ async function main() {
545
667
  }
546
668
  break;
547
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
+ }
548
763
  default:
549
764
  console.error(`Unknown command: ${parsed.command}`);
550
765
  showUsage();
@@ -552,9 +767,11 @@ async function main() {
552
767
  }
553
768
  }
554
769
  if (import.meta.main) {
555
- main().catch(e => {
770
+ main().then(() => {
771
+ process.exitCode = 0;
772
+ }).catch(e => {
556
773
  console.error(`Error: ${e.message}`);
557
- process.exit(1);
774
+ process.exitCode = 1;
558
775
  });
559
776
  }
560
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,12 +4,12 @@
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
14
  import type { GoogleEvent, EventReminder, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
15
15
  import {
@@ -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,13 @@ 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)
244
307
  -r <spec> Reminders: #m, #h, #d with optional :email/:popup
245
308
  -r 0 No reminders
246
309
  -r 30m 30 min popup (default kind)
@@ -255,11 +318,13 @@ Examples:
255
318
  gcal add "Meeting" "tomorrow 10:00"
256
319
  gcal add "Appointment" "jan 15 2pm"
257
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
258
324
  gcal -defaultUser bob@gmail.com Set default user
259
325
 
260
326
  File Association (Windows):
261
- assoc .ics=icsfile
262
- ftype icsfile=gcal "%1"
327
+ gcal assoc Set up .ics file association
263
328
  `);
264
329
  }
265
330
 
@@ -276,6 +341,11 @@ interface ParsedArgs {
276
341
  birthdays: boolean;
277
342
  reminders: EventReminder[]; /** Reminder overrides, empty = use defaults, null entry = no reminders */
278
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 */
279
349
  }
280
350
 
281
351
  /** Parse a reminder spec like "30m", "1h", "2d", "30m:email", "1h:popup" */
@@ -302,6 +372,25 @@ function parseReminder(spec: string): EventReminder {
302
372
  return { method, minutes };
303
373
  }
304
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;
392
+ }
393
+
305
394
  function parseArgs(argv: string[]): ParsedArgs {
306
395
  const result: ParsedArgs = {
307
396
  command: '',
@@ -315,7 +404,12 @@ function parseArgs(argv: string[]): ParsedArgs {
315
404
  icsFile: '',
316
405
  birthdays: false,
317
406
  reminders: [],
318
- noReminders: false
407
+ noReminders: false,
408
+ timeLimit: '3m',
409
+ title: '',
410
+ location: '',
411
+ startTime: '',
412
+ duration: ''
319
413
  };
320
414
 
321
415
  const unknown: string[] = [];
@@ -350,6 +444,28 @@ function parseArgs(argv: string[]): ParsedArgs {
350
444
  case '--birthdays':
351
445
  result.birthdays = true;
352
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;
353
469
  case '-r':
354
470
  case '-reminder':
355
471
  case '--reminder': {
@@ -390,7 +506,8 @@ function parseArgs(argv: string[]): ParsedArgs {
390
506
  }
391
507
 
392
508
  if (unknown.length > 0) {
393
- console.error(`Unknown options: ${unknown.join(', ')}`);
509
+ console.error(`Unknown options: ${unknown.join(', ')}\n`);
510
+ showUsage();
394
511
  process.exit(1);
395
512
  }
396
513
 
@@ -445,6 +562,12 @@ async function main(): Promise<void> {
445
562
  process.exit(1);
446
563
  }
447
564
 
565
+ // Commands that don't need a user
566
+ if (parsed.command === 'assoc') {
567
+ setupFileAssociation();
568
+ process.exit(0);
569
+ }
570
+
448
571
  // Resolve user
449
572
  const user = resolveUser(parsed.user, false);
450
573
  if (!user) {
@@ -484,8 +607,9 @@ async function main(): Promise<void> {
484
607
 
485
608
  case 'list': {
486
609
  const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
610
+ const timeMax = parseTimeLimit(parsed.timeLimit).toISOString();
487
611
  const token = await getAccessToken(user, false);
488
- let events = await listEvents(token, parsed.calendar, count);
612
+ let events = await listEvents(token, parsed.calendar, count, undefined, timeMax);
489
613
  const birthdayCount = events.filter(e => e.eventType === 'birthday').length;
490
614
  if (!parsed.birthdays) {
491
615
  events = events.filter(e => e.eventType !== 'birthday');
@@ -502,8 +626,8 @@ async function main(): Promise<void> {
502
626
  const shortId = (event.id || '').slice(0, 8);
503
627
  const start = event.start ? formatDateTime(event.start) : '?';
504
628
  const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
505
- const summary = (event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
506
- const loc = event.location || '';
629
+ const summary = cleanUrls(event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
630
+ const loc = cleanUrls(event.location || '');
507
631
  if (parsed.verbose) {
508
632
  rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
509
633
  } else {
@@ -520,13 +644,14 @@ async function main(): Promise<void> {
520
644
  );
521
645
 
522
646
  // Print header
523
- const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
647
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
524
648
  console.log(headerLine);
525
- console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
649
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
526
650
 
527
- // Print rows
651
+ // Print rows — last column not padded to avoid trailing whitespace
528
652
  for (const row of rows) {
529
- 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(' ');
530
655
  console.log(line);
531
656
  }
532
657
  }
@@ -607,7 +732,12 @@ async function main(): Promise<void> {
607
732
  if (matches.length > 1) {
608
733
  console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
609
734
  for (const e of matches) {
610
- 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}`);
611
741
  }
612
742
  continue;
613
743
  }
@@ -618,7 +748,7 @@ async function main(): Promise<void> {
618
748
  continue;
619
749
  }
620
750
  await deleteEvent(token, event.id!, parsed.calendar);
621
- console.log(`Deleted: ${event.summary}`);
751
+ console.log(`Deleted: ${cleanUrls(event.summary || '')}`);
622
752
  }
623
753
  break;
624
754
  }
@@ -637,6 +767,104 @@ async function main(): Promise<void> {
637
767
  break;
638
768
  }
639
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
+
640
868
  default:
641
869
  console.error(`Unknown command: ${parsed.command}`);
642
870
  showUsage();
@@ -645,8 +873,10 @@ async function main(): Promise<void> {
645
873
  }
646
874
 
647
875
  if (import.meta.main) {
648
- main().catch(e => {
876
+ main().then(() => {
877
+ process.exitCode = 0;
878
+ }).catch(e => {
649
879
  console.error(`Error: ${e.message}`);
650
- process.exit(1);
880
+ process.exitCode = 1;
651
881
  });
652
882
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/gcal",
3
- "version": "0.1.22",
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,6 +26,7 @@
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\")",