@shin1ohno/sage 0.7.9 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +26 -8
  2. package/dist/config/loader.d.ts.map +1 -1
  3. package/dist/config/loader.js +30 -1
  4. package/dist/config/loader.js.map +1 -1
  5. package/dist/config/validation.d.ts +130 -0
  6. package/dist/config/validation.d.ts.map +1 -0
  7. package/dist/config/validation.js +53 -0
  8. package/dist/config/validation.js.map +1 -0
  9. package/dist/index.js +677 -214
  10. package/dist/index.js.map +1 -1
  11. package/dist/integrations/calendar-service.d.ts +6 -3
  12. package/dist/integrations/calendar-service.d.ts.map +1 -1
  13. package/dist/integrations/calendar-service.js +26 -4
  14. package/dist/integrations/calendar-service.js.map +1 -1
  15. package/dist/integrations/calendar-source-manager.d.ts +302 -0
  16. package/dist/integrations/calendar-source-manager.d.ts.map +1 -0
  17. package/dist/integrations/calendar-source-manager.js +862 -0
  18. package/dist/integrations/calendar-source-manager.js.map +1 -0
  19. package/dist/integrations/google-calendar-service.d.ts +176 -0
  20. package/dist/integrations/google-calendar-service.d.ts.map +1 -0
  21. package/dist/integrations/google-calendar-service.js +745 -0
  22. package/dist/integrations/google-calendar-service.js.map +1 -0
  23. package/dist/oauth/google-oauth-handler.d.ts +149 -0
  24. package/dist/oauth/google-oauth-handler.d.ts.map +1 -0
  25. package/dist/oauth/google-oauth-handler.js +365 -0
  26. package/dist/oauth/google-oauth-handler.js.map +1 -0
  27. package/dist/types/config.d.ts +15 -0
  28. package/dist/types/config.d.ts.map +1 -1
  29. package/dist/types/config.js +21 -0
  30. package/dist/types/config.js.map +1 -1
  31. package/dist/types/google-calendar-types.d.ts +139 -0
  32. package/dist/types/google-calendar-types.d.ts.map +1 -0
  33. package/dist/types/google-calendar-types.js +46 -0
  34. package/dist/types/google-calendar-types.js.map +1 -0
  35. package/dist/types/index.d.ts +1 -0
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/dist/types/index.js +1 -0
  38. package/dist/types/index.js.map +1 -1
  39. package/dist/version.d.ts +2 -2
  40. package/dist/version.d.ts.map +1 -1
  41. package/dist/version.js +22 -4
  42. package/dist/version.js.map +1 -1
  43. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Google Calendar API Type Definitions
3
+ * Requirement: 1, 2, 3, 4, 5, 6
4
+ * Design: .claude/specs/google-calendar-api/design.md (Data Models section)
5
+ */
6
+ /**
7
+ * Google Calendar Event (internal representation from Google Calendar API)
8
+ * Requirement: 2
9
+ */
10
+ export interface GoogleCalendarEvent {
11
+ id: string;
12
+ summary: string;
13
+ description?: string;
14
+ location?: string;
15
+ start: {
16
+ dateTime?: string;
17
+ date?: string;
18
+ timeZone?: string;
19
+ };
20
+ end: {
21
+ dateTime?: string;
22
+ date?: string;
23
+ timeZone?: string;
24
+ };
25
+ attendees?: Array<{
26
+ email: string;
27
+ responseStatus: 'needsAction' | 'declined' | 'tentative' | 'accepted';
28
+ }>;
29
+ reminders?: {
30
+ useDefault: boolean;
31
+ overrides?: Array<{
32
+ method: 'email' | 'popup';
33
+ minutes: number;
34
+ }>;
35
+ };
36
+ recurringEventId?: string;
37
+ iCalUID: string;
38
+ status?: 'confirmed' | 'tentative' | 'cancelled';
39
+ organizer?: {
40
+ email: string;
41
+ displayName?: string;
42
+ };
43
+ }
44
+ /**
45
+ * OAuth tokens for Google Calendar API
46
+ * Requirement: 1
47
+ */
48
+ export interface OAuthTokens {
49
+ accessToken: string;
50
+ refreshToken: string;
51
+ expiresAt: string;
52
+ scope: string[];
53
+ }
54
+ /**
55
+ * Calendar information from Google Calendar API
56
+ * Requirement: 2
57
+ */
58
+ export interface CalendarInfo {
59
+ id: string;
60
+ name: string;
61
+ source: 'eventkit' | 'google';
62
+ isPrimary: boolean;
63
+ color?: string;
64
+ accessRole?: 'owner' | 'writer' | 'reader';
65
+ }
66
+ /**
67
+ * Sync result between EventKit and Google Calendar
68
+ * Requirement: 8 (optional feature)
69
+ */
70
+ export interface SyncResult {
71
+ success: boolean;
72
+ eventsAdded: number;
73
+ eventsUpdated: number;
74
+ eventsDeleted: number;
75
+ conflicts: Array<{
76
+ eventId: string;
77
+ reason: string;
78
+ resolution: 'skipped' | 'merged' | 'duplicated';
79
+ }>;
80
+ errors: Array<{
81
+ source: 'eventkit' | 'google';
82
+ error: string;
83
+ }>;
84
+ timestamp: string;
85
+ }
86
+ /**
87
+ * Sync status between calendar sources
88
+ * Requirement: 8 (optional feature)
89
+ */
90
+ export interface SyncStatus {
91
+ lastSyncTime?: string;
92
+ nextSyncTime?: string;
93
+ isEnabled: boolean;
94
+ sources: {
95
+ eventkit: {
96
+ available: boolean;
97
+ lastError?: string;
98
+ };
99
+ google: {
100
+ available: boolean;
101
+ lastError?: string;
102
+ };
103
+ };
104
+ }
105
+ /**
106
+ * Extended Calendar Event with additional fields for Google Calendar integration
107
+ * Extends the base CalendarEvent from calendar-service.ts
108
+ * Requirement: 2, 3, 4, 5, 6
109
+ */
110
+ export interface CalendarEvent {
111
+ id: string;
112
+ title: string;
113
+ start: string;
114
+ end: string;
115
+ isAllDay: boolean;
116
+ source: 'eventkit' | 'google';
117
+ calendar?: string;
118
+ location?: string;
119
+ description?: string;
120
+ attendees?: string[];
121
+ status?: 'confirmed' | 'tentative' | 'cancelled';
122
+ iCalUID?: string;
123
+ }
124
+ /**
125
+ * Convert Google Calendar Event to unified CalendarEvent format
126
+ * Requirement: 2
127
+ * @param googleEvent Google Calendar API event object
128
+ * @returns Unified CalendarEvent object
129
+ */
130
+ export declare function convertGoogleToCalendarEvent(googleEvent: GoogleCalendarEvent): CalendarEvent;
131
+ /**
132
+ * Check if two events are duplicates based on iCalUID or title+time matching
133
+ * Requirement: 7 (deduplication)
134
+ * @param event1 First calendar event
135
+ * @param event2 Second calendar event
136
+ * @returns true if events are duplicates
137
+ */
138
+ export declare function areEventsDuplicate(event1: CalendarEvent, event2: CalendarEvent): boolean;
139
+ //# sourceMappingURL=google-calendar-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-calendar-types.d.ts","sourceRoot":"","sources":["../../src/types/google-calendar-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Google Calendar API Type Definitions
3
+ * Requirement: 1, 2, 3, 4, 5, 6
4
+ * Design: .claude/specs/google-calendar-api/design.md (Data Models section)
5
+ */
6
+ /**
7
+ * Convert Google Calendar Event to unified CalendarEvent format
8
+ * Requirement: 2
9
+ * @param googleEvent Google Calendar API event object
10
+ * @returns Unified CalendarEvent object
11
+ */
12
+ export function convertGoogleToCalendarEvent(googleEvent) {
13
+ return {
14
+ id: googleEvent.id,
15
+ title: googleEvent.summary,
16
+ start: googleEvent.start.dateTime || googleEvent.start.date || '',
17
+ end: googleEvent.end.dateTime || googleEvent.end.date || '',
18
+ isAllDay: !!googleEvent.start.date,
19
+ source: 'google',
20
+ calendar: googleEvent.organizer?.email,
21
+ location: googleEvent.location,
22
+ description: googleEvent.description,
23
+ attendees: googleEvent.attendees?.map((a) => a.email),
24
+ status: googleEvent.status,
25
+ iCalUID: googleEvent.iCalUID,
26
+ };
27
+ }
28
+ /**
29
+ * Check if two events are duplicates based on iCalUID or title+time matching
30
+ * Requirement: 7 (deduplication)
31
+ * @param event1 First calendar event
32
+ * @param event2 Second calendar event
33
+ * @returns true if events are duplicates
34
+ */
35
+ export function areEventsDuplicate(event1, event2) {
36
+ // Method 1: iCalUID comparison (most reliable)
37
+ if (event1.iCalUID && event2.iCalUID && event1.iCalUID === event2.iCalUID) {
38
+ return true;
39
+ }
40
+ // Method 2: Title + start time + end time matching
41
+ const titleMatch = event1.title.toLowerCase() === event2.title.toLowerCase();
42
+ const startMatch = event1.start === event2.start;
43
+ const endMatch = event1.end === event2.end;
44
+ return titleMatch && startMatch && endMatch;
45
+ }
46
+ //# sourceMappingURL=google-calendar-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-calendar-types.js","sourceRoot":"","sources":["../../src/types/google-calendar-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwHH;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAgC;IAC3E,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,KAAK,EAAE,WAAW,CAAC,OAAO;QAC1B,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;QACjE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC3D,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI;QAClC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,WAAW,CAAC,SAAS,EAAE,KAAK;QACtC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB,EAAE,MAAqB;IAC7E,+CAA+C;IAC/C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC;IAE3C,OAAO,UAAU,IAAI,UAAU,IAAI,QAAQ,CAAC;AAC9C,CAAC"}
@@ -4,4 +4,5 @@
4
4
  export * from './task.js';
5
5
  export * from './config.js';
6
6
  export * from './errors.js';
7
+ export * from './google-calendar-types.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC"}
@@ -4,4 +4,5 @@
4
4
  export * from './task.js';
5
5
  export * from './config.js';
6
6
  export * from './errors.js';
7
+ export * from './google-calendar-types.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Version information for sage
3
3
  *
4
- * Single source of truth for version number.
4
+ * Reads version from package.json at runtime.
5
5
  * Import this instead of hardcoding version strings.
6
6
  */
7
- export declare const VERSION = "0.7.6";
7
+ export declare const VERSION: string;
8
8
  export declare const SERVER_NAME = "sage";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,WAAW,SAAS,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,eAAO,MAAM,OAAO,QAAe,CAAC;AACpC,eAAO,MAAM,WAAW,SAAS,CAAC"}
package/dist/version.js CHANGED
@@ -1,11 +1,29 @@
1
1
  /**
2
2
  * Version information for sage
3
3
  *
4
- * Single source of truth for version number.
4
+ * Reads version from package.json at runtime.
5
5
  * Import this instead of hardcoding version strings.
6
6
  */
7
- // Version is updated by npm version command and build process
8
- // Keep in sync with package.json
9
- export const VERSION = '0.7.6';
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ // Fallback version - keep in sync with package.json
10
+ const FALLBACK_VERSION = '0.8.4';
11
+ function getVersion() {
12
+ // Try to find package.json from current working directory
13
+ const pkgPath = join(process.cwd(), 'package.json');
14
+ try {
15
+ if (existsSync(pkgPath)) {
16
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
17
+ if (pkg.name === '@shin1ohno/sage') {
18
+ return pkg.version;
19
+ }
20
+ }
21
+ }
22
+ catch {
23
+ // Fall through to default
24
+ }
25
+ return FALLBACK_VERSION;
26
+ }
27
+ export const VERSION = getVersion();
10
28
  export const SERVER_NAME = 'sage';
11
29
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,iCAAiC;AACjC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,SAAS,UAAU;IACjB,0DAA0D;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACnC,OAAO,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shin1ohno/sage",
3
- "version": "0.7.9",
3
+ "version": "0.8.4",
4
4
  "description": "AI Task Management Assistant MCP Server for Claude Desktop and Claude Code",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,8 +11,8 @@
11
11
  "build": "tsc",
12
12
  "start": "node dist/index.js",
13
13
  "dev": "tsx src/index.ts",
14
- "test": "jest",
15
- "test:coverage": "jest --coverage",
14
+ "test": "jest --forceExit",
15
+ "test:coverage": "jest --coverage --forceExit",
16
16
  "lint": "eslint src/**/*.ts",
17
17
  "clean": "rm -rf dist",
18
18
  "prepublishOnly": "npm run build"
@@ -47,6 +47,7 @@
47
47
  "homepage": "https://github.com/shin1ohno/sage#readme",
48
48
  "dependencies": {
49
49
  "@modelcontextprotocol/sdk": "^1.0.4",
50
+ "googleapis": "^134.0.0",
50
51
  "run-applescript": "^7.1.0",
51
52
  "zod": "^3.23.8"
52
53
  },