aiag-cli 2.3.0 → 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.
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiag-cli",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "AI Agent Harness CLI - Long-running agent development tool powered by Claude Agent SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",