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.
- package/README.md +72 -37
- package/dist/api/client.d.ts +9 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +20 -0
- package/dist/api/client.js.map +1 -1
- package/dist/api/endpoints.d.ts +2 -0
- package/dist/api/endpoints.d.ts.map +1 -1
- package/dist/api/endpoints.js +2 -0
- package/dist/api/endpoints.js.map +1 -1
- package/dist/api/types.d.ts +34 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli.js +60 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/commit.d.ts.map +1 -1
- package/dist/commands/commit.js +37 -1
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +11 -1
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/feature.d.ts +11 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +153 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -78
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prd.d.ts +12 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +179 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/session.d.ts +29 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +270 -120
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/sync.d.ts +10 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +95 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +13 -1
- package/dist/commands/work.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/prd.d.ts +28 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +105 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/skills/index.d.ts +12 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +12 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/installer.d.ts +38 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +153 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/loader.d.ts +34 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +134 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/runner.d.ts +14 -0
- package/dist/skills/runner.d.ts.map +1 -0
- package/dist/skills/runner.js +238 -0
- package/dist/skills/runner.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prd.d.ts +21 -0
- package/dist/utils/prd.d.ts.map +1 -1
- package/dist/utils/prd.js +69 -0
- package/dist/utils/prd.js.map +1 -1
- package/dist/utils/sessionManager.d.ts +63 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +372 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/dist/utils/taskmasterConverter.d.ts +72 -0
- package/dist/utils/taskmasterConverter.d.ts.map +1 -0
- package/dist/utils/taskmasterConverter.js +401 -0
- package/dist/utils/taskmasterConverter.js.map +1 -0
- package/dist/utils/taskmasterParser.d.ts +35 -0
- package/dist/utils/taskmasterParser.d.ts.map +1 -0
- package/dist/utils/taskmasterParser.js +259 -0
- package/dist/utils/taskmasterParser.js.map +1 -0
- package/package.json +1 -1
- package/templates/skills/prd-taskmaster/.taskmaster/docs/prd.md +2571 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/execution-state.py +87 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/learn-accuracy.py +113 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/rollback.sh +71 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/security-audit.py +130 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/track-time.py +133 -0
- package/templates/skills/prd-taskmaster/LICENSE +21 -0
- package/templates/skills/prd-taskmaster/README.md +608 -0
- package/templates/skills/prd-taskmaster/SKILL.md +1258 -0
- package/templates/skills/prd-taskmaster/reference/taskmaster-integration-guide.md +645 -0
- package/templates/skills/prd-taskmaster/reference/validation-checklist.md +394 -0
- package/templates/skills/prd-taskmaster/scripts/setup-taskmaster.sh +112 -0
- package/templates/skills/prd-taskmaster/templates/CLAUDE.md.template +635 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-comprehensive.md +983 -0
- 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":"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"}
|
|
@@ -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"}
|