aiag-cli 2.2.3 → 2.4.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.
Files changed (100) hide show
  1. package/README.md +72 -37
  2. package/dist/api/client.d.ts +9 -1
  3. package/dist/api/client.d.ts.map +1 -1
  4. package/dist/api/client.js +20 -0
  5. package/dist/api/client.js.map +1 -1
  6. package/dist/api/endpoints.d.ts +2 -0
  7. package/dist/api/endpoints.d.ts.map +1 -1
  8. package/dist/api/endpoints.js +2 -0
  9. package/dist/api/endpoints.js.map +1 -1
  10. package/dist/api/types.d.ts +34 -0
  11. package/dist/api/types.d.ts.map +1 -1
  12. package/dist/cli.js +60 -9
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/commit.d.ts.map +1 -1
  15. package/dist/commands/commit.js +37 -1
  16. package/dist/commands/commit.js.map +1 -1
  17. package/dist/commands/complete.d.ts.map +1 -1
  18. package/dist/commands/complete.js +11 -1
  19. package/dist/commands/complete.js.map +1 -1
  20. package/dist/commands/feature.d.ts +11 -0
  21. package/dist/commands/feature.d.ts.map +1 -0
  22. package/dist/commands/feature.js +153 -0
  23. package/dist/commands/feature.js.map +1 -0
  24. package/dist/commands/init.d.ts +1 -1
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +29 -78
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/prd.d.ts +12 -0
  29. package/dist/commands/prd.d.ts.map +1 -0
  30. package/dist/commands/prd.js +179 -0
  31. package/dist/commands/prd.js.map +1 -0
  32. package/dist/commands/session.d.ts +29 -0
  33. package/dist/commands/session.d.ts.map +1 -1
  34. package/dist/commands/session.js +270 -120
  35. package/dist/commands/session.js.map +1 -1
  36. package/dist/commands/sync.d.ts +10 -0
  37. package/dist/commands/sync.d.ts.map +1 -1
  38. package/dist/commands/sync.js +95 -2
  39. package/dist/commands/sync.js.map +1 -1
  40. package/dist/commands/work.d.ts.map +1 -1
  41. package/dist/commands/work.js +13 -1
  42. package/dist/commands/work.js.map +1 -1
  43. package/dist/prompts/index.d.ts +2 -0
  44. package/dist/prompts/index.d.ts.map +1 -1
  45. package/dist/prompts/index.js +2 -0
  46. package/dist/prompts/index.js.map +1 -1
  47. package/dist/prompts/prd.d.ts +28 -0
  48. package/dist/prompts/prd.d.ts.map +1 -0
  49. package/dist/prompts/prd.js +105 -0
  50. package/dist/prompts/prd.js.map +1 -0
  51. package/dist/skills/index.d.ts +12 -0
  52. package/dist/skills/index.d.ts.map +1 -0
  53. package/dist/skills/index.js +12 -0
  54. package/dist/skills/index.js.map +1 -0
  55. package/dist/skills/installer.d.ts +38 -0
  56. package/dist/skills/installer.d.ts.map +1 -0
  57. package/dist/skills/installer.js +153 -0
  58. package/dist/skills/installer.js.map +1 -0
  59. package/dist/skills/loader.d.ts +34 -0
  60. package/dist/skills/loader.d.ts.map +1 -0
  61. package/dist/skills/loader.js +134 -0
  62. package/dist/skills/loader.js.map +1 -0
  63. package/dist/skills/runner.d.ts +14 -0
  64. package/dist/skills/runner.d.ts.map +1 -0
  65. package/dist/skills/runner.js +238 -0
  66. package/dist/skills/runner.js.map +1 -0
  67. package/dist/types.d.ts +160 -0
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/utils/prd.d.ts +21 -0
  70. package/dist/utils/prd.d.ts.map +1 -1
  71. package/dist/utils/prd.js +69 -0
  72. package/dist/utils/prd.js.map +1 -1
  73. package/dist/utils/sessionManager.d.ts +63 -0
  74. package/dist/utils/sessionManager.d.ts.map +1 -0
  75. package/dist/utils/sessionManager.js +372 -0
  76. package/dist/utils/sessionManager.js.map +1 -0
  77. package/dist/utils/taskmasterConverter.d.ts +72 -0
  78. package/dist/utils/taskmasterConverter.d.ts.map +1 -0
  79. package/dist/utils/taskmasterConverter.js +401 -0
  80. package/dist/utils/taskmasterConverter.js.map +1 -0
  81. package/dist/utils/taskmasterParser.d.ts +35 -0
  82. package/dist/utils/taskmasterParser.d.ts.map +1 -0
  83. package/dist/utils/taskmasterParser.js +259 -0
  84. package/dist/utils/taskmasterParser.js.map +1 -0
  85. package/package.json +1 -1
  86. package/templates/skills/prd-taskmaster/.taskmaster/docs/prd.md +2571 -0
  87. package/templates/skills/prd-taskmaster/.taskmaster/scripts/execution-state.py +87 -0
  88. package/templates/skills/prd-taskmaster/.taskmaster/scripts/learn-accuracy.py +113 -0
  89. package/templates/skills/prd-taskmaster/.taskmaster/scripts/rollback.sh +71 -0
  90. package/templates/skills/prd-taskmaster/.taskmaster/scripts/security-audit.py +130 -0
  91. package/templates/skills/prd-taskmaster/.taskmaster/scripts/track-time.py +133 -0
  92. package/templates/skills/prd-taskmaster/LICENSE +21 -0
  93. package/templates/skills/prd-taskmaster/README.md +608 -0
  94. package/templates/skills/prd-taskmaster/SKILL.md +1258 -0
  95. package/templates/skills/prd-taskmaster/reference/taskmaster-integration-guide.md +645 -0
  96. package/templates/skills/prd-taskmaster/reference/validation-checklist.md +394 -0
  97. package/templates/skills/prd-taskmaster/scripts/setup-taskmaster.sh +112 -0
  98. package/templates/skills/prd-taskmaster/templates/CLAUDE.md.template +635 -0
  99. package/templates/skills/prd-taskmaster/templates/taskmaster-prd-comprehensive.md +983 -0
  100. package/templates/skills/prd-taskmaster/templates/taskmaster-prd-minimal.md +103 -0
@@ -0,0 +1,372 @@
1
+ /**
2
+ * 암시적 세션 관리 모듈
3
+ *
4
+ * 세션 라이프사이클:
5
+ * 1. 시작: work, auto 명령 실행 시 자동 생성 (서버 연동 시 서버에도 알림)
6
+ * 2. 활동 기록: work, complete, commit 실행 시 자동 기록
7
+ * 3. 종료: 24시간 비활성 후 새 명령 실행 시 자동 종료 (서버에도 요약 전송)
8
+ *
9
+ * 서버 연동:
10
+ * - aiag-adp 서버에 연결된 경우, 세션 시작/종료 시 서버와 동기화
11
+ * - 서버 연결 실패 시에도 로컬 세션은 정상 작동
12
+ */
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import { appendToProgress } from './progress.js';
16
+ import { getProgress } from './featureList.js';
17
+ import { loadConnection } from './connection.js';
18
+ import { getApiClient } from '../api/client.js';
19
+ const AIAG_DIR = '.aiag';
20
+ const SESSION_FILE = 'current_session.json';
21
+ const SESSION_TIMEOUT_HOURS = 24;
22
+ // ============================================================================
23
+ // 세션 파일 I/O
24
+ // ============================================================================
25
+ /**
26
+ * 세션 파일 경로 반환
27
+ */
28
+ function getSessionPath(baseDir) {
29
+ return path.join(baseDir, AIAG_DIR, SESSION_FILE);
30
+ }
31
+ /**
32
+ * 현재 세션 로드
33
+ */
34
+ export function loadSessionState(baseDir) {
35
+ const sessionPath = getSessionPath(baseDir);
36
+ if (!fs.existsSync(sessionPath)) {
37
+ return null;
38
+ }
39
+ try {
40
+ const content = fs.readFileSync(sessionPath, 'utf-8');
41
+ return JSON.parse(content);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * 세션 저장
49
+ */
50
+ function saveSessionState(baseDir, session) {
51
+ const sessionPath = getSessionPath(baseDir);
52
+ const aiagDir = path.join(baseDir, AIAG_DIR);
53
+ // .aiag 디렉토리가 없으면 생성
54
+ if (!fs.existsSync(aiagDir)) {
55
+ fs.mkdirSync(aiagDir, { recursive: true });
56
+ }
57
+ fs.writeFileSync(sessionPath, JSON.stringify(session, null, 2), 'utf-8');
58
+ }
59
+ /**
60
+ * 세션 파일 삭제
61
+ */
62
+ function clearSessionState(baseDir) {
63
+ const sessionPath = getSessionPath(baseDir);
64
+ if (fs.existsSync(sessionPath)) {
65
+ fs.unlinkSync(sessionPath);
66
+ }
67
+ }
68
+ // ============================================================================
69
+ // 세션 ID 생성
70
+ // ============================================================================
71
+ /**
72
+ * 세션 ID 생성 (YYYYMMDD-HHMMSS 형식)
73
+ */
74
+ function generateSessionId(date = new Date()) {
75
+ const y = date.getFullYear();
76
+ const m = String(date.getMonth() + 1).padStart(2, '0');
77
+ const d = String(date.getDate()).padStart(2, '0');
78
+ const h = String(date.getHours()).padStart(2, '0');
79
+ const min = String(date.getMinutes()).padStart(2, '0');
80
+ const s = String(date.getSeconds()).padStart(2, '0');
81
+ return `${y}${m}${d}-${h}${min}${s}`;
82
+ }
83
+ // ============================================================================
84
+ // 세션 만료 체크
85
+ // ============================================================================
86
+ /**
87
+ * 세션 만료 여부 확인
88
+ */
89
+ function isSessionStale(session) {
90
+ const lastActivity = new Date(session.lastActivityAt);
91
+ const now = new Date();
92
+ const hoursDiff = (now.getTime() - lastActivity.getTime()) / (1000 * 60 * 60);
93
+ return hoursDiff > SESSION_TIMEOUT_HOURS;
94
+ }
95
+ // ============================================================================
96
+ // 시간 포맷팅
97
+ // ============================================================================
98
+ /**
99
+ * 두 시간 사이의 duration 계산 (초)
100
+ */
101
+ function calculateDurationSeconds(startIso, endIso) {
102
+ const start = new Date(startIso);
103
+ const end = new Date(endIso);
104
+ return Math.floor((end.getTime() - start.getTime()) / 1000);
105
+ }
106
+ /**
107
+ * 초를 사람이 읽기 쉬운 형식으로 변환
108
+ */
109
+ function formatDuration(seconds) {
110
+ const hours = Math.floor(seconds / 3600);
111
+ const minutes = Math.floor((seconds % 3600) / 60);
112
+ const secs = seconds % 60;
113
+ if (hours > 0) {
114
+ return `${hours}h ${minutes}m`;
115
+ }
116
+ else if (minutes > 0) {
117
+ return `${minutes}m ${secs}s`;
118
+ }
119
+ else {
120
+ return `${secs}s`;
121
+ }
122
+ }
123
+ // ============================================================================
124
+ // 서버 연동
125
+ // ============================================================================
126
+ /**
127
+ * 서버에 세션 시작 알림 (비동기, 실패 시 무시)
128
+ */
129
+ async function notifyServerSessionStart(baseDir, session) {
130
+ const connection = loadConnection(baseDir);
131
+ const client = getApiClient();
132
+ if (!connection || !client) {
133
+ return undefined;
134
+ }
135
+ try {
136
+ const response = await client.startSession(connection.projectId, {
137
+ agentType: 'cli',
138
+ notes: `Session ${session.id} started (mode: ${session.mode})`,
139
+ });
140
+ return response.id;
141
+ }
142
+ catch {
143
+ // 서버 연결 실패 시 무시 - 로컬 세션은 계속 작동
144
+ return undefined;
145
+ }
146
+ }
147
+ /**
148
+ * 서버에 세션 종료 알림 (비동기, 실패 시 무시)
149
+ */
150
+ async function notifyServerSessionEnd(baseDir, session, reason) {
151
+ const connection = loadConnection(baseDir);
152
+ const client = getApiClient();
153
+ // 서버 세션 ID가 없으면 무시
154
+ if (!connection || !client || !session.serverId) {
155
+ return;
156
+ }
157
+ try {
158
+ const duration = calculateDurationSeconds(session.startedAt, session.lastActivityAt);
159
+ const progress = getProgress(baseDir);
160
+ const summary = {
161
+ workDone: session.featuresCompleted.map((id) => `Completed ${id}`),
162
+ commits: session.commits.map((c) => `${c.hash} ${c.message}`),
163
+ nextSteps: session.featuresWorked
164
+ .filter((id) => !session.featuresCompleted.includes(id))
165
+ .map((id) => `Continue work on ${id}`),
166
+ notes: [
167
+ `Mode: ${session.mode}`,
168
+ `Closed by: ${reason}`,
169
+ `Progress: ${session.initialProgress}% → ${progress.percentage}%`,
170
+ ],
171
+ duration,
172
+ };
173
+ await client.endSession(session.serverId, summary);
174
+ }
175
+ catch {
176
+ // 서버 연결 실패 시 무시 - 로컬 요약은 이미 저장됨
177
+ }
178
+ }
179
+ // ============================================================================
180
+ // 세션 생성 및 종료
181
+ // ============================================================================
182
+ /**
183
+ * 새 세션 생성 (동기 버전, 서버 알림은 별도 처리)
184
+ */
185
+ function createNewSession(baseDir, mode = 'manual') {
186
+ const progress = getProgress(baseDir);
187
+ const now = new Date();
188
+ const session = {
189
+ id: generateSessionId(now),
190
+ startedAt: now.toISOString(),
191
+ lastActivityAt: now.toISOString(),
192
+ featuresWorked: [],
193
+ featuresCompleted: [],
194
+ commits: [],
195
+ initialProgress: progress.percentage,
196
+ mode,
197
+ };
198
+ saveSessionState(baseDir, session);
199
+ // 서버 세션 시작 (비동기로 백그라운드 처리)
200
+ notifyServerSessionStart(baseDir, session)
201
+ .then((serverId) => {
202
+ if (serverId) {
203
+ // 서버 ID 저장
204
+ const current = loadSessionState(baseDir);
205
+ if (current && current.id === session.id) {
206
+ current.serverId = serverId;
207
+ saveSessionState(baseDir, current);
208
+ }
209
+ }
210
+ })
211
+ .catch(() => {
212
+ // 무시
213
+ });
214
+ return session;
215
+ }
216
+ /**
217
+ * 세션 종료 처리 (progress.md에 요약 기록 + 서버 알림)
218
+ */
219
+ export function finalizeSession(baseDir, session, reason) {
220
+ const progress = getProgress(baseDir);
221
+ const duration = calculateDurationSeconds(session.startedAt, session.lastActivityAt);
222
+ // 서버에 세션 종료 알림 (비동기, 실패 무시)
223
+ notifyServerSessionEnd(baseDir, session, reason).catch(() => {
224
+ // 무시
225
+ });
226
+ // 세션 요약 생성
227
+ const featuresWorkedList = session.featuresWorked.length > 0
228
+ ? session.featuresWorked.map((id) => `- ${id}`).join('\n')
229
+ : '- (none)';
230
+ const featuresCompletedList = session.featuresCompleted.length > 0
231
+ ? session.featuresCompleted.map((id) => `- [x] ${id}`).join('\n')
232
+ : '- (none)';
233
+ const commitsList = session.commits.length > 0
234
+ ? session.commits.map((c) => `- \`${c.hash}\` ${c.message}`).join('\n')
235
+ : '- (none)';
236
+ // 서버 ID 포함 여부
237
+ const serverSync = session.serverId
238
+ ? `- **Server Session**: ${session.serverId.slice(0, 8)}... (synced)`
239
+ : '- **Server Session**: (not connected)';
240
+ const summary = `
241
+ ---
242
+
243
+ ## Session: ${session.id}
244
+
245
+ ### Metrics
246
+ - **Started**: ${session.startedAt}
247
+ - **Ended**: ${session.lastActivityAt}
248
+ - **Duration**: ${formatDuration(duration)}
249
+ - **Mode**: ${session.mode}
250
+ - **Closed by**: ${reason}
251
+ - **Progress**: ${session.initialProgress}% → ${progress.percentage}%
252
+ ${serverSync}
253
+
254
+ ### Features Worked (${session.featuresWorked.length})
255
+ ${featuresWorkedList}
256
+
257
+ ### Features Completed (${session.featuresCompleted.length})
258
+ ${featuresCompletedList}
259
+
260
+ ### Commits (${session.commits.length})
261
+ ${commitsList}
262
+
263
+ `;
264
+ appendToProgress(baseDir, summary);
265
+ clearSessionState(baseDir);
266
+ }
267
+ // ============================================================================
268
+ // 공개 API
269
+ // ============================================================================
270
+ /**
271
+ * 세션 확보 (없으면 생성, 만료되었으면 갱신)
272
+ *
273
+ * @param baseDir 프로젝트 루트 디렉토리
274
+ * @param mode 세션 모드 (manual: 수동 작업, auto: 자동 모드)
275
+ * @returns 현재 세션 상태
276
+ */
277
+ export function ensureSession(baseDir, mode = 'manual') {
278
+ const existing = loadSessionState(baseDir);
279
+ if (existing) {
280
+ if (isSessionStale(existing)) {
281
+ // 만료된 세션 종료 처리 후 새 세션 생성
282
+ finalizeSession(baseDir, existing, 'timeout');
283
+ return createNewSession(baseDir, mode);
284
+ }
285
+ // 기존 세션 활동 시간 갱신
286
+ existing.lastActivityAt = new Date().toISOString();
287
+ saveSessionState(baseDir, existing);
288
+ return existing;
289
+ }
290
+ return createNewSession(baseDir, mode);
291
+ }
292
+ /**
293
+ * 활동 기록
294
+ *
295
+ * @param baseDir 프로젝트 루트 디렉토리
296
+ * @param type 활동 유형
297
+ * @param data 활동 데이터
298
+ */
299
+ export function recordActivity(baseDir, type, data) {
300
+ const session = ensureSession(baseDir);
301
+ switch (type) {
302
+ case 'work_started':
303
+ if (data.featureId && !session.featuresWorked.includes(data.featureId)) {
304
+ session.featuresWorked.push(data.featureId);
305
+ }
306
+ break;
307
+ case 'completed':
308
+ if (data.featureId && !session.featuresCompleted.includes(data.featureId)) {
309
+ session.featuresCompleted.push(data.featureId);
310
+ }
311
+ break;
312
+ case 'commit':
313
+ if (data.commitHash) {
314
+ const commitRecord = {
315
+ hash: data.commitHash,
316
+ message: data.commitMessage || '',
317
+ timestamp: new Date().toISOString(),
318
+ featureId: data.featureId,
319
+ };
320
+ session.commits.push(commitRecord);
321
+ }
322
+ break;
323
+ }
324
+ session.lastActivityAt = new Date().toISOString();
325
+ saveSessionState(baseDir, session);
326
+ }
327
+ /**
328
+ * 세션 강제 종료
329
+ *
330
+ * @param baseDir 프로젝트 루트 디렉토리
331
+ * @param reason 종료 사유
332
+ * @returns 종료된 세션 (없었으면 null)
333
+ */
334
+ export function closeSession(baseDir, reason = 'manual') {
335
+ const session = loadSessionState(baseDir);
336
+ if (!session) {
337
+ return null;
338
+ }
339
+ finalizeSession(baseDir, session, reason);
340
+ return session;
341
+ }
342
+ /**
343
+ * 현재 세션 존재 여부 확인
344
+ */
345
+ export function hasActiveSession(baseDir) {
346
+ const session = loadSessionState(baseDir);
347
+ return session !== null && !isSessionStale(session);
348
+ }
349
+ /**
350
+ * 세션 통계 조회
351
+ */
352
+ export function getSessionStats(baseDir) {
353
+ const session = loadSessionState(baseDir);
354
+ if (!session) {
355
+ return {
356
+ active: false,
357
+ session: null,
358
+ duration: null,
359
+ progressDelta: null,
360
+ };
361
+ }
362
+ const isActive = !isSessionStale(session);
363
+ const progress = getProgress(baseDir);
364
+ const duration = calculateDurationSeconds(session.startedAt, isActive ? new Date().toISOString() : session.lastActivityAt);
365
+ return {
366
+ active: isActive,
367
+ session,
368
+ duration: formatDuration(duration),
369
+ progressDelta: progress.percentage - session.initialProgress,
370
+ };
371
+ }
372
+ //# sourceMappingURL=sessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../src/utils/sessionManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAShD,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAAqB;IAC9D,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE7C,qBAAqB;IACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAa,IAAI,IAAI,EAAE;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AACvC,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,OAAqB;IAC3C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9E,OAAO,SAAS,GAAG,qBAAqB,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAgB,EAAE,MAAc;IAChE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC;IAE1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,GAAG,CAAC;IACpB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,OAAe,EACf,OAAqB;IAErB,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,EAAE;YAC/D,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,WAAW,OAAO,CAAC,EAAE,mBAAmB,OAAO,CAAC,IAAI,GAAG;SAC/D,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,OAAe,EACf,OAAqB,EACrB,MAA0B;IAE1B,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,mBAAmB;IACnB,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAsB;YACjC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YAClE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC7D,SAAS,EAAE,OAAO,CAAC,cAAc;iBAC9B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;iBACvD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACxC,KAAK,EAAE;gBACL,SAAS,OAAO,CAAC,IAAI,EAAE;gBACvB,cAAc,MAAM,EAAE;gBACtB,aAAa,OAAO,CAAC,eAAe,OAAO,QAAQ,CAAC,UAAU,GAAG;aAClE;YACD,QAAQ;SACT,CAAC;QAEF,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAAe,EACf,OAA0B,QAAQ;IAElC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAiB;QAC5B,EAAE,EAAE,iBAAiB,CAAC,GAAG,CAAC;QAC1B,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,cAAc,EAAE,GAAG,CAAC,WAAW,EAAE;QACjC,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,EAAE;QACrB,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,QAAQ,CAAC,UAAU;QACpC,IAAI;KACL,CAAC;IAEF,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC;SACvC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjB,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW;YACX,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;gBACzC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC5B,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,KAAK;IACP,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,OAAqB,EACrB,MAA0B;IAE1B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAErF,4BAA4B;IAC5B,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAC1D,KAAK;IACP,CAAC,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,kBAAkB,GACtB,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,CAAC,CAAC,UAAU,CAAC;IAEjB,MAAM,qBAAqB,GACzB,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE,CAAC,CAAC,UAAU,CAAC;IAEjB,MAAM,WAAW,GACf,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACvE,CAAC,CAAC,UAAU,CAAC;IAEjB,cAAc;IACd,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ;QACjC,CAAC,CAAC,yBAAyB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc;QACrE,CAAC,CAAC,uCAAuC,CAAC;IAE5C,MAAM,OAAO,GAAG;;;cAGJ,OAAO,CAAC,EAAE;;;iBAGP,OAAO,CAAC,SAAS;eACnB,OAAO,CAAC,cAAc;kBACnB,cAAc,CAAC,QAAQ,CAAC;cAC5B,OAAO,CAAC,IAAI;mBACP,MAAM;kBACP,OAAO,CAAC,eAAe,OAAO,QAAQ,CAAC,UAAU;EACjE,UAAU;;uBAEW,OAAO,CAAC,cAAc,CAAC,MAAM;EAClD,kBAAkB;;0BAEM,OAAO,CAAC,iBAAiB,CAAC,MAAM;EACxD,qBAAqB;;eAER,OAAO,CAAC,OAAO,CAAC,MAAM;EACnC,WAAW;;CAEZ,CAAC;IAEA,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,OAA0B,QAAQ;IAElC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,yBAAyB;YACzB,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9C,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,iBAAiB;QACjB,QAAQ,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnD,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,IAAyB,EACzB,IAIC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,cAAc;YACjB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM;QAER,KAAK,WAAW;YACd,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1E,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC;YACD,MAAM;QAER,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAwB;oBACxC,IAAI,EAAE,IAAI,CAAC,UAAU;oBACrB,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;oBACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC;gBACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACrC,CAAC;YACD,MAAM;IACV,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,SAA6B,QAAQ;IAErC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAM7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,wBAAwB,CACvC,OAAO,CAAC,SAAS,EACjB,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7D,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO;QACP,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;QAClC,aAAa,EAAE,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,eAAe;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Taskmaster → aiag Feature 변환기
3
+ *
4
+ * prd-taskmaster에서 파싱된 TaskmasterRequirement 객체를
5
+ * aiag의 Feature 객체로 변환합니다.
6
+ */
7
+ import type { Feature, FeatureCategory, FeaturePriority, FeatureList, TaskmasterRequirement, TaskmasterPriority, TaskmasterConversionOptions, ParsedPrd } from '../types.js';
8
+ /**
9
+ * 파싱된 PRD를 FeatureList로 변환합니다
10
+ *
11
+ * @param parsedPrd 파싱된 PRD 결과
12
+ * @param options 변환 옵션
13
+ * @returns FeatureList 객체
14
+ */
15
+ export declare function convertPrdToFeatureList(parsedPrd: ParsedPrd, options?: Partial<TaskmasterConversionOptions>): FeatureList;
16
+ /**
17
+ * TaskmasterRequirement 배열을 Feature 배열로 변환합니다
18
+ *
19
+ * @param requirements 파싱된 요구사항 배열
20
+ * @param options 변환 옵션
21
+ * @returns Feature 배열
22
+ */
23
+ export declare function convertToFeatures(requirements: TaskmasterRequirement[], options?: TaskmasterConversionOptions): Feature[];
24
+ /**
25
+ * 제목과 설명에서 카테고리를 추론합니다
26
+ *
27
+ * @param title 요구사항 제목
28
+ * @param description 요구사항 설명
29
+ * @returns 추론된 카테고리
30
+ */
31
+ export declare function inferCategory(title: string, description: string): FeatureCategory;
32
+ /**
33
+ * Taskmaster 우선순위를 aiag 우선순위로 변환합니다
34
+ *
35
+ * @param priority Taskmaster 우선순위 (P0, P1, P2)
36
+ * @returns aiag 우선순위
37
+ */
38
+ export declare function convertPriority(priority: TaskmasterPriority): FeaturePriority;
39
+ /**
40
+ * Feature ID를 생성합니다
41
+ *
42
+ * @param category 카테고리
43
+ * @param index 순서 번호
44
+ * @returns 생성된 ID (예: AUTH-001)
45
+ */
46
+ export declare function generateFeatureId(category: FeatureCategory, index: number): string;
47
+ /**
48
+ * Acceptance Criteria와 카테고리를 기반으로 testCommand를 생성합니다
49
+ *
50
+ * @param criteria Acceptance Criteria 목록
51
+ * @param category 카테고리
52
+ * @returns 생성된 testCommand
53
+ */
54
+ export declare function generateTestCommand(criteria: string[], category: FeatureCategory): string;
55
+ /**
56
+ * 의존성 그래프를 분석하여 순환 의존성을 감지합니다
57
+ *
58
+ * @param features Feature 배열
59
+ * @returns 순환 의존성이 있으면 해당 ID 쌍, 없으면 null
60
+ */
61
+ export declare function detectCircularDependencies(features: Feature[]): [string, string][] | null;
62
+ /**
63
+ * 변환 결과 통계를 반환합니다
64
+ */
65
+ export declare function getConversionStats(features: Feature[]): {
66
+ total: number;
67
+ byCategory: Record<string, number>;
68
+ byPriority: Record<FeaturePriority, number>;
69
+ withDependencies: number;
70
+ withTestCommands: number;
71
+ };
72
+ //# sourceMappingURL=taskmasterConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskmasterConverter.d.ts","sourceRoot":"","sources":["../../src/utils/taskmasterConverter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,SAAS,EACV,MAAM,aAAa,CAAC;AAsJrB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACjD,WAAW,CAcb;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,qBAAqB,EAAE,EACrC,OAAO,GAAE,2BAA6C,GACrD,OAAO,EAAE,CA0BX;AAwCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CA2BjF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,eAAe,GACxB,MAAM,CA4BR;AAmBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,OAAO,EAAE,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CA0C3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAqCA"}