@shin1ohno/sage 0.1.0
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/LICENSE +21 -0
- package/README.md +168 -0
- package/dist/config/loader.d.ts +37 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +95 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/storage/file-storage.d.ts +35 -0
- package/dist/config/storage/file-storage.d.ts.map +1 -0
- package/dist/config/storage/file-storage.js +76 -0
- package/dist/config/storage/file-storage.js.map +1 -0
- package/dist/config/storage/index.d.ts +8 -0
- package/dist/config/storage/index.d.ts.map +1 -0
- package/dist/config/storage/index.js +8 -0
- package/dist/config/storage/index.js.map +1 -0
- package/dist/config/storage/session-storage.d.ts +35 -0
- package/dist/config/storage/session-storage.d.ts.map +1 -0
- package/dist/config/storage/session-storage.js +44 -0
- package/dist/config/storage/session-storage.js.map +1 -0
- package/dist/config/storage/storage-factory.d.ts +32 -0
- package/dist/config/storage/storage-factory.d.ts.map +1 -0
- package/dist/config/storage/storage-factory.js +78 -0
- package/dist/config/storage/storage-factory.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/sage-core.d.ts +80 -0
- package/dist/core/sage-core.d.ts.map +1 -0
- package/dist/core/sage-core.js +190 -0
- package/dist/core/sage-core.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +901 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/apple-reminders.d.ts +96 -0
- package/dist/integrations/apple-reminders.d.ts.map +1 -0
- package/dist/integrations/apple-reminders.js +250 -0
- package/dist/integrations/apple-reminders.js.map +1 -0
- package/dist/integrations/calendar-service.d.ts +126 -0
- package/dist/integrations/calendar-service.d.ts.map +1 -0
- package/dist/integrations/calendar-service.js +295 -0
- package/dist/integrations/calendar-service.js.map +1 -0
- package/dist/integrations/notion-mcp.d.ts +121 -0
- package/dist/integrations/notion-mcp.d.ts.map +1 -0
- package/dist/integrations/notion-mcp.js +281 -0
- package/dist/integrations/notion-mcp.js.map +1 -0
- package/dist/integrations/reminder-manager.d.ts +90 -0
- package/dist/integrations/reminder-manager.d.ts.map +1 -0
- package/dist/integrations/reminder-manager.js +182 -0
- package/dist/integrations/reminder-manager.js.map +1 -0
- package/dist/platform/adapter-factory.d.ts +22 -0
- package/dist/platform/adapter-factory.d.ts.map +1 -0
- package/dist/platform/adapter-factory.js +41 -0
- package/dist/platform/adapter-factory.js.map +1 -0
- package/dist/platform/adapters/mcp-adapter.d.ts +32 -0
- package/dist/platform/adapters/mcp-adapter.d.ts.map +1 -0
- package/dist/platform/adapters/mcp-adapter.js +52 -0
- package/dist/platform/adapters/mcp-adapter.js.map +1 -0
- package/dist/platform/adapters/skills-adapter-ios.d.ts +38 -0
- package/dist/platform/adapters/skills-adapter-ios.d.ts.map +1 -0
- package/dist/platform/adapters/skills-adapter-ios.js +59 -0
- package/dist/platform/adapters/skills-adapter-ios.js.map +1 -0
- package/dist/platform/adapters/skills-adapter-web.d.ts +36 -0
- package/dist/platform/adapters/skills-adapter-web.d.ts.map +1 -0
- package/dist/platform/adapters/skills-adapter-web.js +56 -0
- package/dist/platform/adapters/skills-adapter-web.js.map +1 -0
- package/dist/platform/detector.d.ts +60 -0
- package/dist/platform/detector.d.ts.map +1 -0
- package/dist/platform/detector.js +217 -0
- package/dist/platform/detector.js.map +1 -0
- package/dist/platform/index.d.ts +11 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +11 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/types.d.ts +205 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +33 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/setup/questions.d.ts +15 -0
- package/dist/setup/questions.d.ts.map +1 -0
- package/dist/setup/questions.js +131 -0
- package/dist/setup/questions.js.map +1 -0
- package/dist/setup/wizard.d.ts +51 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +210 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/tools/analyze-tasks.d.ts +61 -0
- package/dist/tools/analyze-tasks.d.ts.map +1 -0
- package/dist/tools/analyze-tasks.js +258 -0
- package/dist/tools/analyze-tasks.js.map +1 -0
- package/dist/types/config.d.ts +126 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +118 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +39 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +83 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task.d.ts +69 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/estimation.d.ts +49 -0
- package/dist/utils/estimation.d.ts.map +1 -0
- package/dist/utils/estimation.js +244 -0
- package/dist/utils/estimation.js.map +1 -0
- package/dist/utils/priority.d.ts +68 -0
- package/dist/utils/priority.d.ts.map +1 -0
- package/dist/utils/priority.js +243 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/retry.d.ts +62 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +161 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/stakeholders.d.ts +61 -0
- package/dist/utils/stakeholders.d.ts.map +1 -0
- package/dist/utils/stakeholders.js +301 -0
- package/dist/utils/stakeholders.js.map +1 -0
- package/dist/utils/task-splitter.d.ts +45 -0
- package/dist/utils/task-splitter.d.ts.map +1 -0
- package/dist/utils/task-splitter.js +321 -0
- package/dist/utils/task-splitter.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar Service
|
|
3
|
+
* macOS AppleScript integration for Calendar.app
|
|
4
|
+
* Requirements: 6.1-6.9
|
|
5
|
+
*
|
|
6
|
+
* 現行実装: macOS AppleScript経由
|
|
7
|
+
* 将来対応予定: iOS/iPadOS ネイティブ統合(Claude Skills APIがデバイスAPIへのアクセスを提供した時点)
|
|
8
|
+
*/
|
|
9
|
+
import { retryWithBackoff, isRetryableError } from '../utils/retry.js';
|
|
10
|
+
/**
|
|
11
|
+
* Default retry options for calendar operations
|
|
12
|
+
*/
|
|
13
|
+
const RETRY_OPTIONS = {
|
|
14
|
+
maxAttempts: 3,
|
|
15
|
+
initialDelay: 500,
|
|
16
|
+
maxDelay: 5000,
|
|
17
|
+
shouldRetry: isRetryableError,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Calendar Service
|
|
21
|
+
* Provides platform-adaptive calendar integration
|
|
22
|
+
*/
|
|
23
|
+
export class CalendarService {
|
|
24
|
+
runAppleScript = null;
|
|
25
|
+
/**
|
|
26
|
+
* Detect the current platform
|
|
27
|
+
* Requirement: 6.1
|
|
28
|
+
*/
|
|
29
|
+
async detectPlatform() {
|
|
30
|
+
// Check for macOS (Node.js environment)
|
|
31
|
+
if (typeof process !== 'undefined' && process.platform === 'darwin') {
|
|
32
|
+
return {
|
|
33
|
+
platform: 'macos',
|
|
34
|
+
availableMethods: ['applescript', 'caldav'],
|
|
35
|
+
recommendedMethod: 'applescript',
|
|
36
|
+
requiresPermission: true,
|
|
37
|
+
hasNativeAccess: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Check for iOS/iPadOS (Skills environment)
|
|
41
|
+
if (typeof window !== 'undefined') {
|
|
42
|
+
const userAgent = window.navigator?.userAgent || '';
|
|
43
|
+
if (userAgent.includes('iPhone')) {
|
|
44
|
+
return {
|
|
45
|
+
platform: 'ios',
|
|
46
|
+
availableMethods: ['native'],
|
|
47
|
+
recommendedMethod: 'native',
|
|
48
|
+
requiresPermission: true,
|
|
49
|
+
hasNativeAccess: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (userAgent.includes('iPad')) {
|
|
53
|
+
return {
|
|
54
|
+
platform: 'ipados',
|
|
55
|
+
availableMethods: ['native'],
|
|
56
|
+
recommendedMethod: 'native',
|
|
57
|
+
requiresPermission: true,
|
|
58
|
+
hasNativeAccess: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Web browser
|
|
62
|
+
return {
|
|
63
|
+
platform: 'web',
|
|
64
|
+
availableMethods: ['ical_url', 'manual_input', 'outlook'],
|
|
65
|
+
recommendedMethod: 'manual_input',
|
|
66
|
+
requiresPermission: false,
|
|
67
|
+
hasNativeAccess: false,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
platform: 'unknown',
|
|
72
|
+
availableMethods: ['manual_input'],
|
|
73
|
+
recommendedMethod: 'manual_input',
|
|
74
|
+
requiresPermission: false,
|
|
75
|
+
hasNativeAccess: false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if calendar integration is available
|
|
80
|
+
*/
|
|
81
|
+
async isAvailable() {
|
|
82
|
+
const platform = await this.detectPlatform();
|
|
83
|
+
return platform.hasNativeAccess;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Fetch calendar events
|
|
87
|
+
* Requirement: 6.2, 6.3, 6.4
|
|
88
|
+
*/
|
|
89
|
+
async fetchEvents(startDate, endDate) {
|
|
90
|
+
const platform = await this.detectPlatform();
|
|
91
|
+
switch (platform.recommendedMethod) {
|
|
92
|
+
case 'native':
|
|
93
|
+
return this.fetchNativeEvents(startDate, endDate);
|
|
94
|
+
case 'applescript':
|
|
95
|
+
return this.fetchAppleScriptEvents(startDate, endDate);
|
|
96
|
+
case 'manual_input':
|
|
97
|
+
default:
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Fetch events via native iOS/iPadOS API
|
|
103
|
+
* 🔮 将来対応予定: Claude Skills APIがデバイスAPIへのアクセスを提供した時点で実装
|
|
104
|
+
* 現時点では window.claude?.calendar API は存在しません
|
|
105
|
+
* Requirement: 6.2
|
|
106
|
+
*/
|
|
107
|
+
async fetchNativeEvents(_startDate, _endDate) {
|
|
108
|
+
// 🔮 将来対応予定: ネイティブ統合
|
|
109
|
+
// 現時点では、iOS/iPadOSでの実行時は空の配列を返す
|
|
110
|
+
console.warn('ネイティブCalendar統合は将来対応予定です。現在はmacOS AppleScriptのみサポートしています。');
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fetch events via AppleScript (macOS)
|
|
115
|
+
* Requirement: 6.3
|
|
116
|
+
*/
|
|
117
|
+
async fetchAppleScriptEvents(startDate, endDate) {
|
|
118
|
+
try {
|
|
119
|
+
// Lazy load run-applescript
|
|
120
|
+
if (!this.runAppleScript) {
|
|
121
|
+
const module = await import('run-applescript');
|
|
122
|
+
this.runAppleScript = module.runAppleScript;
|
|
123
|
+
}
|
|
124
|
+
const script = this.buildFetchEventsScript(startDate, endDate);
|
|
125
|
+
// Use retry with exponential backoff for AppleScript execution
|
|
126
|
+
const result = await retryWithBackoff(async () => {
|
|
127
|
+
return await this.runAppleScript(script);
|
|
128
|
+
}, {
|
|
129
|
+
...RETRY_OPTIONS,
|
|
130
|
+
onRetry: (error, attempt) => {
|
|
131
|
+
console.error(`AppleScript Calendar retry attempt ${attempt}: ${error.message}`);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return this.parseAppleScriptResult(result);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error('AppleScript カレンダーエラー:', error);
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build AppleScript for fetching events
|
|
143
|
+
*/
|
|
144
|
+
buildFetchEventsScript(startDate, endDate) {
|
|
145
|
+
return `
|
|
146
|
+
tell application "Calendar"
|
|
147
|
+
set startDate to date "${startDate}"
|
|
148
|
+
set endDate to date "${endDate}"
|
|
149
|
+
set eventList to ""
|
|
150
|
+
|
|
151
|
+
repeat with cal in calendars
|
|
152
|
+
set calEvents to (every event of cal whose start date ≥ startDate and start date ≤ endDate)
|
|
153
|
+
repeat with evt in calEvents
|
|
154
|
+
set eventInfo to (summary of evt) & "|" & (start date of evt as string) & "|" & (end date of evt as string) & "|" & (uid of evt)
|
|
155
|
+
set eventList to eventList & eventInfo & linefeed
|
|
156
|
+
end repeat
|
|
157
|
+
end repeat
|
|
158
|
+
|
|
159
|
+
return eventList
|
|
160
|
+
end tell`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Parse AppleScript result into events
|
|
164
|
+
*/
|
|
165
|
+
parseAppleScriptResult(output) {
|
|
166
|
+
if (!output || output.trim() === '') {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
const events = [];
|
|
170
|
+
const lines = output.trim().split('\n');
|
|
171
|
+
for (const line of lines) {
|
|
172
|
+
const parts = line.split('|');
|
|
173
|
+
if (parts.length >= 4) {
|
|
174
|
+
events.push({
|
|
175
|
+
id: parts[3],
|
|
176
|
+
title: parts[0],
|
|
177
|
+
start: parts[1],
|
|
178
|
+
end: parts[2],
|
|
179
|
+
isAllDay: false,
|
|
180
|
+
source: 'applescript',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return events;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Find available slots from events
|
|
188
|
+
* Requirement: 6.4, 6.7
|
|
189
|
+
*/
|
|
190
|
+
findAvailableSlotsFromEvents(events, taskDuration, workingHours, date) {
|
|
191
|
+
const slots = [];
|
|
192
|
+
const dateObj = new Date(date);
|
|
193
|
+
// Parse working hours
|
|
194
|
+
const [startHour, startMin] = workingHours.start.split(':').map(Number);
|
|
195
|
+
const [endHour, endMin] = workingHours.end.split(':').map(Number);
|
|
196
|
+
// Create working hours boundaries
|
|
197
|
+
const workStart = new Date(dateObj);
|
|
198
|
+
workStart.setHours(startHour, startMin, 0, 0);
|
|
199
|
+
const workEnd = new Date(dateObj);
|
|
200
|
+
workEnd.setHours(endHour, endMin, 0, 0);
|
|
201
|
+
// Filter events for this day
|
|
202
|
+
const dayEvents = events
|
|
203
|
+
.filter((e) => !e.isAllDay)
|
|
204
|
+
.map((e) => ({
|
|
205
|
+
start: new Date(e.start),
|
|
206
|
+
end: new Date(e.end),
|
|
207
|
+
title: e.title,
|
|
208
|
+
}))
|
|
209
|
+
.filter((e) => e.start >= workStart && e.start < workEnd)
|
|
210
|
+
.sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
211
|
+
// If all-day event exists, no slots available
|
|
212
|
+
if (events.some((e) => e.isAllDay)) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
// Find gaps between events
|
|
216
|
+
let currentTime = workStart;
|
|
217
|
+
for (const event of dayEvents) {
|
|
218
|
+
const gapMinutes = (event.start.getTime() - currentTime.getTime()) / (1000 * 60);
|
|
219
|
+
if (gapMinutes >= taskDuration) {
|
|
220
|
+
slots.push({
|
|
221
|
+
start: currentTime.toISOString(),
|
|
222
|
+
end: event.start.toISOString(),
|
|
223
|
+
durationMinutes: gapMinutes,
|
|
224
|
+
suitability: 'good',
|
|
225
|
+
reason: `${Math.floor(gapMinutes)}分の空き時間`,
|
|
226
|
+
conflicts: [],
|
|
227
|
+
dayType: 'normal',
|
|
228
|
+
source: 'applescript',
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
currentTime = event.end > currentTime ? event.end : currentTime;
|
|
232
|
+
}
|
|
233
|
+
// Check remaining time after last event
|
|
234
|
+
const remainingMinutes = (workEnd.getTime() - currentTime.getTime()) / (1000 * 60);
|
|
235
|
+
if (remainingMinutes >= taskDuration) {
|
|
236
|
+
slots.push({
|
|
237
|
+
start: currentTime.toISOString(),
|
|
238
|
+
end: workEnd.toISOString(),
|
|
239
|
+
durationMinutes: remainingMinutes,
|
|
240
|
+
suitability: 'good',
|
|
241
|
+
reason: `${Math.floor(remainingMinutes)}分の空き時間`,
|
|
242
|
+
conflicts: [],
|
|
243
|
+
dayType: 'normal',
|
|
244
|
+
source: 'applescript',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return slots;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Calculate slot suitability based on day type
|
|
251
|
+
* Requirement: 6.5, 6.6, 6.8
|
|
252
|
+
*/
|
|
253
|
+
calculateSuitability(slot, config) {
|
|
254
|
+
const date = new Date(slot.start);
|
|
255
|
+
const dayName = date.toLocaleDateString('en-US', { weekday: 'long' });
|
|
256
|
+
let suitability = 'good';
|
|
257
|
+
let dayType = 'normal';
|
|
258
|
+
let reason = slot.reason;
|
|
259
|
+
if (config.deepWorkDays.includes(dayName)) {
|
|
260
|
+
suitability = 'excellent';
|
|
261
|
+
dayType = 'deep-work';
|
|
262
|
+
reason = `${dayName}は深い作業に最適な日です`;
|
|
263
|
+
}
|
|
264
|
+
else if (config.meetingHeavyDays.includes(dayName)) {
|
|
265
|
+
suitability = 'acceptable';
|
|
266
|
+
dayType = 'meeting-heavy';
|
|
267
|
+
reason = `${dayName}は会議が多い日です`;
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
...slot,
|
|
271
|
+
suitability,
|
|
272
|
+
dayType,
|
|
273
|
+
reason,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generate manual input prompt for web fallback
|
|
278
|
+
* Requirement: 6.9
|
|
279
|
+
*/
|
|
280
|
+
generateManualInputPrompt(startDate, endDate) {
|
|
281
|
+
return `📅 カレンダー情報を手動で入力してください
|
|
282
|
+
|
|
283
|
+
期間: ${startDate} 〜 ${endDate}
|
|
284
|
+
|
|
285
|
+
以下の形式で予定を教えてください:
|
|
286
|
+
- 予定名: 開始時間 - 終了時間
|
|
287
|
+
|
|
288
|
+
例:
|
|
289
|
+
- 会議: 10:00 - 11:00
|
|
290
|
+
- ランチ: 12:00 - 13:00
|
|
291
|
+
|
|
292
|
+
これにより、空き時間を計算して最適なタスク実行時間を提案します。`;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=calendar-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-service.js","sourceRoot":"","sources":["../../src/integrations/calendar-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notion MCP Service
|
|
3
|
+
* Notion integration via MCP Server
|
|
4
|
+
* Requirements: 8.1-8.5
|
|
5
|
+
*
|
|
6
|
+
* 現行実装: Notion MCP Server経由(Desktop/Code)
|
|
7
|
+
* 将来対応予定: iOS/iPadOS Notion Connector統合(Claude Skills APIが対応した時点)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Notion platform info
|
|
11
|
+
*/
|
|
12
|
+
export interface NotionPlatformInfo {
|
|
13
|
+
platform: 'mcp' | 'connector' | 'web' | 'unknown';
|
|
14
|
+
method: 'mcp' | 'connector' | 'fallback';
|
|
15
|
+
available: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Notion page request
|
|
19
|
+
*/
|
|
20
|
+
export interface NotionPageRequest {
|
|
21
|
+
databaseId: string;
|
|
22
|
+
title: string;
|
|
23
|
+
properties: Record<string, any>;
|
|
24
|
+
content?: NotionBlock[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Notion block
|
|
28
|
+
*/
|
|
29
|
+
export interface NotionBlock {
|
|
30
|
+
type: 'paragraph' | 'heading' | 'bulleted_list_item';
|
|
31
|
+
content: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Notion page result
|
|
35
|
+
*/
|
|
36
|
+
export interface NotionPageResult {
|
|
37
|
+
success: boolean;
|
|
38
|
+
method?: 'mcp' | 'connector' | 'fallback';
|
|
39
|
+
pageId?: string;
|
|
40
|
+
pageUrl?: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
fallbackText?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Task info for template generation
|
|
46
|
+
*/
|
|
47
|
+
export interface TaskInfo {
|
|
48
|
+
title: string;
|
|
49
|
+
priority?: string;
|
|
50
|
+
deadline?: string;
|
|
51
|
+
stakeholders?: string[];
|
|
52
|
+
estimatedMinutes?: number;
|
|
53
|
+
description?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* MCP request format
|
|
57
|
+
*/
|
|
58
|
+
export interface MCPRequest {
|
|
59
|
+
method: string;
|
|
60
|
+
params: {
|
|
61
|
+
name: string;
|
|
62
|
+
arguments: Record<string, any>;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Notion MCP Service
|
|
67
|
+
* Provides platform-adaptive Notion integration
|
|
68
|
+
* - Desktop/Code: MCP経由
|
|
69
|
+
* - iOS/iPadOS: Notion Connector経由
|
|
70
|
+
* - Web: フォールバック
|
|
71
|
+
*/
|
|
72
|
+
export declare class NotionMCPService {
|
|
73
|
+
/**
|
|
74
|
+
* Detect the current platform for Notion integration
|
|
75
|
+
*/
|
|
76
|
+
detectPlatform(): Promise<NotionPlatformInfo>;
|
|
77
|
+
/**
|
|
78
|
+
* Check if Notion integration is available
|
|
79
|
+
*/
|
|
80
|
+
isAvailable(): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Create a page in Notion
|
|
83
|
+
* Routes to appropriate integration based on platform
|
|
84
|
+
* Requirement: 8.1, 8.2, 8.3
|
|
85
|
+
*/
|
|
86
|
+
createPage(request: NotionPageRequest): Promise<NotionPageResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Create page via MCP (Desktop/Code)
|
|
89
|
+
*/
|
|
90
|
+
private createPageViaMCP;
|
|
91
|
+
/**
|
|
92
|
+
* Create page via Notion Connector (iOS/iPadOS Skills)
|
|
93
|
+
* 🔮 将来対応予定: Claude Skills APIがデバイスAPIへのアクセスを提供した時点で実装
|
|
94
|
+
* 現時点では window.claude?.notion API は存在しません
|
|
95
|
+
* Requirement: 8.1, 8.2
|
|
96
|
+
*/
|
|
97
|
+
private createPageViaConnector;
|
|
98
|
+
/**
|
|
99
|
+
* Build MCP request for Notion page creation
|
|
100
|
+
*/
|
|
101
|
+
buildMCPRequest(request: NotionPageRequest): MCPRequest;
|
|
102
|
+
/**
|
|
103
|
+
* Build Notion block format
|
|
104
|
+
*/
|
|
105
|
+
private buildNotionBlock;
|
|
106
|
+
/**
|
|
107
|
+
* Build Notion properties format
|
|
108
|
+
*/
|
|
109
|
+
buildNotionProperties(taskInfo: TaskInfo): Record<string, any>;
|
|
110
|
+
/**
|
|
111
|
+
* Generate fallback template for manual Notion copy
|
|
112
|
+
* Requirement: 8.4
|
|
113
|
+
*/
|
|
114
|
+
generateFallbackTemplate(taskInfo: TaskInfo): string;
|
|
115
|
+
/**
|
|
116
|
+
* Determine if a task should be synced to Notion based on deadline
|
|
117
|
+
* Requirement: 8.1 (8日以上先のタスク)
|
|
118
|
+
*/
|
|
119
|
+
shouldSyncToNotion(deadline: string | undefined, thresholdDays?: number): boolean;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=notion-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-mcp.d.ts","sourceRoot":"","sources":["../../src/integrations/notion-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,oBAAoB,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,CAAC;CACH;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA2BnD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBvE;;OAEG;YACW,gBAAgB;IAyC9B;;;;;OAKG;YACW,sBAAsB;IAepC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU;IAgBvD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA4C9D;;;OAGG;IACH,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IA6BpD;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,GAAE,MAAU,GAAG,OAAO;CAYrF"}
|