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.
@@ -1,26 +1,259 @@
1
- import { updateLastUpdated } from '../utils/progress.js';
1
+ /**
2
+ * 세션 명령어 (재정의)
3
+ *
4
+ * 암시적 세션 관리 도입으로 session start/end는 deprecated.
5
+ * 새로운 역할: 세션 상태 조회 및 유틸리티
6
+ *
7
+ * 사용법:
8
+ * aiag session # 현재 세션 상태 표시
9
+ * aiag session list # 최근 세션 목록 (progress.md에서)
10
+ * aiag session close # 현재 세션 강제 종료
11
+ *
12
+ * Deprecated (하위 호환성):
13
+ * aiag session start # → work 명령 사용 권장
14
+ * aiag session end # → session close 또는 자동 종료
15
+ */
16
+ import { updateLastUpdated, readProgress } from '../utils/progress.js';
2
17
  import { getProgress, getNextFeature } from '../utils/featureList.js';
3
- import { printHeader, printSection, colors, icons, printInfo, printSuccess, printWarning } from '../utils/output.js';
18
+ import { printHeader, printSection, colors, icons, printInfo, printSuccess, printWarning, printError, } from '../utils/output.js';
4
19
  import { clearSessionContext, hasInterruptedWork } from '../utils/sessionContext.js';
5
- import { loadConnection, saveCurrentSession, loadCurrentSession, clearCurrentSession, } from '../utils/connection.js';
20
+ import { loadConnection, saveCurrentSession } from '../utils/connection.js';
6
21
  import { getApiClient } from '../api/client.js';
7
- export async function sessionStart(featureId, options = {}) {
22
+ import { syncProgressToServer } from './sync.js';
23
+ import { loadSessionState, closeSession, getSessionStats, } from '../utils/sessionManager.js';
24
+ /**
25
+ * 세션 상태 표시 (기본 명령)
26
+ */
27
+ export async function session(subcommand, options = {}) {
8
28
  const baseDir = process.cwd();
9
- printHeader('Session Start');
10
- const progress = getProgress();
11
- const nextFeature = featureId ? null : getNextFeature();
12
- // Display current state
13
- printSection('Current Progress');
14
- console.log(` ${progress.completed}/${progress.total} features complete (${progress.percentage}%)`);
15
- if (featureId) {
16
- printSection('Target Feature');
17
- console.log(` ${icons.arrow} ${featureId}`);
29
+ switch (subcommand) {
30
+ case undefined:
31
+ case 'status':
32
+ await showSessionStatus(baseDir);
33
+ break;
34
+ case 'list':
35
+ await listRecentSessions(baseDir, options.count || 5);
36
+ break;
37
+ case 'close':
38
+ await closeCurrentSession(baseDir, options.force);
39
+ break;
40
+ // Deprecated 명령어 (하위 호환성)
41
+ case 'start':
42
+ printWarning('⚠ "session start" is deprecated.');
43
+ console.log(colors.dim(' 세션은 work/auto 명령 실행 시 자동으로 시작됩니다.'));
44
+ console.log(colors.dim(' 작업을 시작하려면: aiag work'));
45
+ console.log('');
46
+ break;
47
+ case 'end':
48
+ printWarning('⚠ "session end" is deprecated.');
49
+ console.log(colors.dim(' 세션은 24시간 비활성 후 자동으로 종료됩니다.'));
50
+ console.log(colors.dim(' 강제 종료가 필요하면: aiag session close'));
51
+ console.log('');
52
+ // 하위 호환성을 위해 close 실행
53
+ await closeCurrentSession(baseDir, options.force);
54
+ break;
55
+ default:
56
+ printError(`Unknown subcommand: ${subcommand}`);
57
+ console.log('');
58
+ console.log('Usage:');
59
+ console.log(' aiag session 현재 세션 상태 표시');
60
+ console.log(' aiag session list 최근 세션 목록');
61
+ console.log(' aiag session close 현재 세션 강제 종료');
62
+ console.log('');
18
63
  }
19
- else if (nextFeature) {
20
- printSection('Recommended Feature');
21
- console.log(` ${icons.arrow} ${nextFeature.id}: ${nextFeature.description}`);
64
+ }
65
+ /**
66
+ * 현재 세션 상태 표시
67
+ */
68
+ async function showSessionStatus(baseDir) {
69
+ const stats = getSessionStats(baseDir);
70
+ const progress = getProgress(baseDir);
71
+ printHeader('Session Status');
72
+ console.log('');
73
+ if (!stats.session) {
74
+ console.log(colors.dim('No active session.'));
75
+ console.log('');
76
+ console.log(colors.dim('세션은 다음 명령 실행 시 자동으로 시작됩니다:'));
77
+ console.log(colors.info(' aiag work'));
78
+ console.log(colors.info(' aiag auto'));
79
+ console.log('');
80
+ return;
81
+ }
82
+ const session = stats.session;
83
+ const statusIcon = stats.active ? colors.success('●') : colors.warning('○');
84
+ const statusText = stats.active ? 'Active' : 'Stale (will close on next command)';
85
+ // 세션 정보
86
+ printSection('Current Session');
87
+ console.log(` ${colors.bold('ID:')} ${session.id}`);
88
+ console.log(` ${colors.bold('Status:')} ${statusIcon} ${statusText}`);
89
+ console.log(` ${colors.bold('Mode:')} ${session.mode}`);
90
+ console.log(` ${colors.bold('Started:')} ${formatRelativeTime(session.startedAt)}`);
91
+ console.log(` ${colors.bold('Duration:')} ${stats.duration}`);
92
+ console.log('');
93
+ // 작업 통계
94
+ printSection('Activity');
95
+ console.log(` ${colors.bold('Features worked:')} ${session.featuresWorked.length}`);
96
+ console.log(` ${colors.bold('Features completed:')} ${session.featuresCompleted.length}`);
97
+ console.log(` ${colors.bold('Commits:')} ${session.commits.length}`);
98
+ console.log('');
99
+ // 진행률 변화
100
+ const progressDelta = stats.progressDelta || 0;
101
+ const deltaText = progressDelta > 0
102
+ ? colors.success(`+${progressDelta}%`)
103
+ : progressDelta < 0
104
+ ? colors.error(`${progressDelta}%`)
105
+ : colors.dim('0%');
106
+ printSection('Progress');
107
+ console.log(` ${session.initialProgress}% → ${progress.percentage}% (${deltaText})`);
108
+ console.log('');
109
+ // 작업한 features
110
+ if (session.featuresWorked.length > 0) {
111
+ printSection('Features Worked');
112
+ session.featuresWorked.forEach((id) => {
113
+ const completed = session.featuresCompleted.includes(id);
114
+ const icon = completed ? icons.success : icons.arrow;
115
+ console.log(` ${icon} ${id}`);
116
+ });
117
+ console.log('');
118
+ }
119
+ // 커밋
120
+ if (session.commits.length > 0) {
121
+ printSection('Commits');
122
+ session.commits.slice(-5).forEach((commit) => {
123
+ console.log(` ${colors.dim(commit.hash)} ${commit.message.substring(0, 50)}`);
124
+ });
125
+ if (session.commits.length > 5) {
126
+ console.log(colors.dim(` ... and ${session.commits.length - 5} more`));
127
+ }
128
+ console.log('');
129
+ }
130
+ // 중단된 작업 확인
131
+ if (hasInterruptedWork(baseDir)) {
132
+ printWarning('⚠ There is interrupted work in session_context.md');
133
+ console.log(colors.dim(' Resume with: aiag work'));
134
+ console.log(colors.dim(' Or clear with: aiag session close --force'));
135
+ console.log('');
136
+ }
137
+ }
138
+ /**
139
+ * 최근 세션 목록 표시
140
+ */
141
+ async function listRecentSessions(baseDir, count) {
142
+ const progressContent = readProgress(baseDir);
143
+ if (!progressContent) {
144
+ printError('No progress.md found.');
145
+ return;
146
+ }
147
+ printHeader('Recent Sessions');
148
+ console.log('');
149
+ // progress.md에서 세션 파싱
150
+ const sessionPattern = /## Session: (\S+)\s*\n([\s\S]*?)(?=\n## Session:|\n---\s*$|$)/g;
151
+ const sessions = [];
152
+ let match;
153
+ while ((match = sessionPattern.exec(progressContent)) !== null) {
154
+ sessions.push({
155
+ id: match[1],
156
+ content: match[2],
157
+ });
158
+ }
159
+ if (sessions.length === 0) {
160
+ console.log(colors.dim('No session history found.'));
161
+ console.log('');
162
+ return;
163
+ }
164
+ // 최근 N개 세션 표시
165
+ const recentSessions = sessions.slice(0, count);
166
+ recentSessions.forEach((session, index) => {
167
+ // 메트릭 파싱
168
+ const durationMatch = session.content.match(/\*\*Duration\*\*:\s*(.+)/);
169
+ const progressMatch = session.content.match(/\*\*Progress\*\*:\s*(.+)/);
170
+ const modeMatch = session.content.match(/\*\*Mode\*\*:\s*(.+)/);
171
+ const completedMatch = session.content.match(/Features Completed \((\d+)\)/);
172
+ const duration = durationMatch ? durationMatch[1] : 'unknown';
173
+ const progressChange = progressMatch ? progressMatch[1] : '-';
174
+ const mode = modeMatch ? modeMatch[1] : '-';
175
+ const completedCount = completedMatch ? completedMatch[1] : '0';
176
+ console.log(`${colors.bold(`${index + 1}. ${session.id}`)}`);
177
+ console.log(` Duration: ${duration} | Mode: ${mode} | Completed: ${completedCount}`);
178
+ console.log(` Progress: ${progressChange}`);
179
+ console.log('');
180
+ });
181
+ if (sessions.length > count) {
182
+ console.log(colors.dim(`... and ${sessions.length - count} more sessions in progress.md`));
183
+ console.log('');
184
+ }
185
+ }
186
+ /**
187
+ * 현재 세션 강제 종료
188
+ *
189
+ * 참고: 서버 세션 종료는 sessionManager.ts의 finalizeSession()에서 자동 처리
190
+ */
191
+ async function closeCurrentSession(baseDir, force) {
192
+ const session = loadSessionState(baseDir);
193
+ if (!session) {
194
+ printInfo('No active session to close.');
195
+ return;
196
+ }
197
+ printHeader('Closing Session');
198
+ console.log('');
199
+ // 세션 종료 (서버 알림 포함)
200
+ closeSession(baseDir, 'manual');
201
+ const serverSynced = session.serverId ? ' (server synced)' : '';
202
+ printSuccess(`Session ${session.id} closed.${serverSynced}`);
203
+ console.log(colors.dim(' Session summary recorded in progress.md'));
204
+ console.log('');
205
+ // Progress 자동 동기화 (연결된 경우)
206
+ const connection = loadConnection(baseDir);
207
+ const client = getApiClient();
208
+ if (connection && client) {
209
+ await syncProgressToServer(client, connection.projectId, undefined, true).catch(() => {
210
+ // 동기화 실패 시 무시 - 다음 sync 명령에서 재시도
211
+ });
212
+ }
213
+ // 중단된 작업 클리어 (force 옵션)
214
+ if (force && hasInterruptedWork(baseDir)) {
215
+ clearSessionContext(baseDir);
216
+ printSuccess('Cleared interrupted work from session_context.md');
217
+ console.log('');
218
+ }
219
+ updateLastUpdated(baseDir);
220
+ }
221
+ // ============================================================================
222
+ // 유틸리티 함수
223
+ // ============================================================================
224
+ /**
225
+ * 상대 시간 포맷팅
226
+ */
227
+ function formatRelativeTime(isoString) {
228
+ const date = new Date(isoString);
229
+ const now = new Date();
230
+ const diffMs = now.getTime() - date.getTime();
231
+ const diffSeconds = Math.floor(diffMs / 1000);
232
+ const diffMinutes = Math.floor(diffSeconds / 60);
233
+ const diffHours = Math.floor(diffMinutes / 60);
234
+ const diffDays = Math.floor(diffHours / 24);
235
+ if (diffDays > 0) {
236
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
237
+ }
238
+ else if (diffHours > 0) {
239
+ return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
240
+ }
241
+ else if (diffMinutes > 0) {
242
+ return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
243
+ }
244
+ else {
245
+ return 'just now';
22
246
  }
23
- // 서버에 세션 시작 알림 (연결된 경우)
247
+ }
248
+ /**
249
+ * @deprecated Use `aiag work` instead. Sessions start automatically.
250
+ */
251
+ export async function sessionStart(featureId, options = {}) {
252
+ printWarning('⚠ sessionStart() is deprecated.');
253
+ console.log(colors.dim(' 세션은 work/auto 명령 실행 시 자동으로 시작됩니다.'));
254
+ console.log('');
255
+ const baseDir = process.cwd();
256
+ // 하위 호환성: 서버 세션은 여전히 시작
24
257
  const connection = loadConnection(baseDir);
25
258
  const client = getApiClient();
26
259
  if (connection && client && !options.offline) {
@@ -29,124 +262,41 @@ export async function sessionStart(featureId, options = {}) {
29
262
  agentType: 'cli',
30
263
  notes: options.notes,
31
264
  });
32
- // 현재 세션 정보 저장
33
265
  saveCurrentSession({
34
266
  id: sessionInfo.id,
35
267
  projectId: sessionInfo.projectId,
36
268
  startedAt: sessionInfo.startedAt,
37
269
  agentType: 'cli',
38
270
  }, baseDir);
39
- printInfo(colors.dim(`세션 시작됨 (ID: ${sessionInfo.id.slice(0, 8)}...)`));
40
- // 세션 시작 로그 전송
41
- if (featureId) {
42
- await client.sendLog(featureId, {
43
- type: 'started',
44
- message: `Session started for feature ${featureId}`,
45
- });
46
- }
271
+ printInfo(colors.dim(`서버 세션 시작됨 (ID: ${sessionInfo.id.slice(0, 8)}...)`));
47
272
  }
48
- catch (error) {
49
- printWarning('서버 세션 등록 실패 (로컬 세션으로 계속)');
273
+ catch {
274
+ printWarning('서버 세션 등록 실패');
50
275
  }
51
276
  }
52
- // Checklist
53
- printSection('Session Start Checklist');
54
- console.log(` ${icons.checkbox.checked} pwd - Confirm directory`);
55
- console.log(` ${icons.checkbox.checked} Read progress.md`);
56
- console.log(` ${icons.checkbox.checked} Read feature_list.json`);
57
- console.log(` ${icons.checkbox.unchecked} git log --oneline -10`);
58
- console.log(` ${icons.checkbox.unchecked} .aiag/init.sh`);
59
- console.log(` ${icons.checkbox.unchecked} Identify next feature`);
60
- console.log('');
61
- printInfo('Session started. Remember: ONE feature at a time!');
62
- if (connection) {
63
- console.log(colors.dim(` 연결된 프로젝트: ${connection.projectName}`));
64
- }
65
- console.log('');
66
- }
67
- export async function sessionEnd(options = {}) {
68
- const baseDir = process.cwd();
69
- printHeader('Session End');
70
- const progress = getProgress();
71
- const startProgress = progress; // 세션 시작 시점의 진행률 (실제로는 저장해두어야 함)
72
- // Check if there's interrupted work and clear it
73
- const hadInterruptedWork = hasInterruptedWork(baseDir);
74
- if (hadInterruptedWork) {
75
- clearSessionContext(baseDir);
76
- console.log('');
77
- printSuccess('✓ Cleared interrupted work from session context');
277
+ const progress = getProgress(baseDir);
278
+ const nextFeature = featureId ? null : getNextFeature();
279
+ printSection('Current Progress');
280
+ console.log(` ${progress.completed}/${progress.total} features (${progress.percentage}%)`);
281
+ if (nextFeature) {
78
282
  console.log('');
283
+ console.log(colors.dim('Next recommended feature:'));
284
+ console.log(` ${icons.arrow} ${nextFeature.id}: ${nextFeature.description}`);
79
285
  }
80
- // Get session summary
81
- printSection('Session Summary');
82
- console.log(` Progress: ${progress.completed}/${progress.total} features (${progress.percentage}%)`);
83
- // 서버에 세션 종료 알림 (연결된 경우)
84
- const connection = loadConnection(baseDir);
85
- const client = getApiClient();
86
- const currentSession = loadCurrentSession(baseDir);
87
- if (connection && client && currentSession && !options.offline) {
88
- try {
89
- const sessionDuration = Math.floor((Date.now() - new Date(currentSession.startedAt).getTime()) / 1000);
90
- // 세션 요약 생성
91
- const summary = {
92
- workDone: [], // 실제로는 progress.md에서 파싱해야 함
93
- commits: [], // git log에서 가져올 수 있음
94
- nextSteps: [],
95
- notes: [],
96
- duration: sessionDuration,
97
- };
98
- await client.endSession(currentSession.id, summary);
99
- printInfo(colors.dim(`세션 종료됨 (${formatDuration(sessionDuration)})`));
100
- // 현재 세션 정보 삭제
101
- clearCurrentSession(baseDir);
102
- }
103
- catch (error) {
104
- printWarning('서버 세션 종료 알림 실패');
105
- }
106
- }
107
- // Checklist
108
- printSection('Session End Checklist');
109
- console.log(` ${icons.checkbox.unchecked} Feature complete OR clean state`);
110
- console.log(` ${icons.checkbox.unchecked} All tests passing`);
111
- console.log(` ${icons.checkbox.unchecked} progress.md updated`);
112
- console.log(` ${icons.checkbox.unchecked} feature_list.json updated`);
113
- console.log(` ${icons.checkbox.unchecked} All changes committed`);
114
- console.log(` ${icons.checkbox.unchecked} git status clean`);
115
- // Update last updated
116
- updateLastUpdated();
117
- console.log('');
118
- printInfo('Remember to update progress.md with your session summary!');
119
286
  console.log('');
120
- console.log(colors.dim('Template for progress.md:'));
121
- console.log(colors.dim('---'));
122
- console.log(colors.dim(`## Session: ${new Date().toISOString()}`));
123
- console.log(colors.dim(''));
124
- console.log(colors.dim('### Work Done'));
125
- console.log(colors.dim('- [x] Completed task'));
126
- console.log(colors.dim(''));
127
- console.log(colors.dim('### Commits'));
128
- console.log(colors.dim('- `hash` commit message'));
129
- console.log(colors.dim(''));
130
- console.log(colors.dim('### Next Session'));
131
- console.log(colors.dim('- Continue with FEATURE-ID'));
132
- console.log(colors.dim('---'));
287
+ console.log(colors.dim('To start working:'));
288
+ console.log(colors.info(' aiag work'));
133
289
  console.log('');
134
290
  }
135
291
  /**
136
- * 시간 포맷팅
292
+ * @deprecated Use `aiag session close` instead. Sessions end automatically after 24h inactivity.
137
293
  */
138
- function formatDuration(seconds) {
139
- const hours = Math.floor(seconds / 3600);
140
- const minutes = Math.floor((seconds % 3600) / 60);
141
- const secs = seconds % 60;
142
- if (hours > 0) {
143
- return `${hours}시간 ${minutes}분`;
144
- }
145
- else if (minutes > 0) {
146
- return `${minutes}분 ${secs}초`;
147
- }
148
- else {
149
- return `${secs}초`;
150
- }
294
+ export async function sessionEnd(options = {}) {
295
+ printWarning('⚠ sessionEnd() is deprecated.');
296
+ console.log(colors.dim(' 세션은 24시간 비활성 자동으로 종료됩니다.'));
297
+ console.log(colors.dim(' 강제 종료: aiag session close'));
298
+ console.log('');
299
+ const baseDir = process.cwd();
300
+ await closeCurrentSession(baseDir, true);
151
301
  }
152
302
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@
15
15
  * - --pull: 서버 상태를 로컬에 반영
16
16
  * - 양방향: 충돌 감지 및 해결 옵션 제공
17
17
  */
18
+ import { Ora } from 'ora';
18
19
  /**
19
20
  * sync 명령어 옵션
20
21
  */
@@ -29,5 +30,14 @@ export interface SyncOptions {
29
30
  * sync 명령어 실행
30
31
  */
31
32
  export declare function sync(options: SyncOptions): Promise<void>;
33
+ /**
34
+ * Progress.md를 서버에 동기화
35
+ *
36
+ * @param client API 클라이언트
37
+ * @param projectId 프로젝트 ID
38
+ * @param spinner 로딩 스피너 (선택)
39
+ * @param silent 출력 억제 (자동 동기화 시 사용)
40
+ */
41
+ export declare function syncProgressToServer(client: import('../api/client.js').ApiClient, projectId: string, spinner?: Ora, silent?: boolean): Promise<boolean>;
32
42
  export default sync;
33
43
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkCH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA6BD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB9D;AAwkBD,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAmC/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA6BD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB9D;AA+kBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,OAAO,kBAAkB,EAAE,SAAS,EAC5C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,GAAG,EACb,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,OAAO,CAAC,CA0DlB;AAiCD,eAAe,IAAI,CAAC"}
@@ -19,9 +19,10 @@ import chalk from 'chalk';
19
19
  import ora from 'ora';
20
20
  import { isLoggedIn } from '../auth/credentials.js';
21
21
  import { isConnected, loadConnection, updateLastSyncAt, isProjectInitialized, loadPendingSync, clearPendingSync, getPendingSyncCount, } from '../utils/connection.js';
22
- import { readFeatureList, writeFeatureList, } from '../utils/featureList.js';
22
+ import { readFeatureList, writeFeatureList, getProgress, } from '../utils/featureList.js';
23
+ import { readProgress } from '../utils/progress.js';
23
24
  import { getApiClient, ApiError, NetworkError } from '../api/client.js';
24
- import { printError, printInfo } from '../utils/output.js';
25
+ import { printError, printWarning, printInfo } from '../utils/output.js';
25
26
  import { messages } from '../utils/messages.js';
26
27
  import { SSEClient, formatSSEEvent } from '../utils/sseClient.js';
27
28
  // ============================================
@@ -130,6 +131,8 @@ async function handlePushSync(options) {
130
131
  if (response.serverFeatures.length > 0) {
131
132
  updateLocalFromServer(featureList, response.serverFeatures);
132
133
  }
134
+ // Progress.md 동기화
135
+ await syncProgressToServer(client, connection.projectId, spinner);
133
136
  // 마지막 동기화 시간 업데이트
134
137
  updateLastSyncAt();
135
138
  // 미동기화 항목 정리
@@ -551,5 +554,95 @@ function formatDate(isoString) {
551
554
  minute: '2-digit',
552
555
  });
553
556
  }
557
+ // ============================================
558
+ // Progress.md 동기화
559
+ // ============================================
560
+ /**
561
+ * Progress.md를 서버에 동기화
562
+ *
563
+ * @param client API 클라이언트
564
+ * @param projectId 프로젝트 ID
565
+ * @param spinner 로딩 스피너 (선택)
566
+ * @param silent 출력 억제 (자동 동기화 시 사용)
567
+ */
568
+ export async function syncProgressToServer(client, projectId, spinner, silent = false) {
569
+ const baseDir = process.cwd();
570
+ const progressContent = readProgress(baseDir);
571
+ if (!progressContent) {
572
+ // progress.md가 없으면 무시
573
+ return true;
574
+ }
575
+ // 64KB 제한 확인
576
+ const MAX_SIZE = 64 * 1024; // 64KB
577
+ let contentToSync = progressContent;
578
+ if (progressContent.length > MAX_SIZE) {
579
+ // 크기 초과 시 최근 세션만 추출
580
+ contentToSync = truncateProgressContent(progressContent, MAX_SIZE);
581
+ if (!silent) {
582
+ printWarning('progress.md가 64KB를 초과하여 최근 내용만 동기화됩니다.');
583
+ }
584
+ }
585
+ // 요약 정보 생성
586
+ const progressStats = getProgress(baseDir);
587
+ const summary = {
588
+ total: progressStats.total,
589
+ completed: progressStats.completed,
590
+ percentage: progressStats.percentage,
591
+ byCategory: progressStats.byCategory,
592
+ };
593
+ try {
594
+ if (spinner) {
595
+ spinner.text = 'progress.md 동기화 중...';
596
+ }
597
+ const request = {
598
+ content: contentToSync,
599
+ summary,
600
+ localUpdatedAt: new Date().toISOString(),
601
+ };
602
+ await client.syncProgress(projectId, request);
603
+ if (!silent) {
604
+ console.log(` ${chalk.green('✓')} progress.md 동기화됨`);
605
+ }
606
+ return true;
607
+ }
608
+ catch (error) {
609
+ if (!silent) {
610
+ if (error instanceof Error) {
611
+ printWarning(`progress.md 동기화 실패: ${error.message}`);
612
+ }
613
+ else {
614
+ printWarning('progress.md 동기화 실패');
615
+ }
616
+ }
617
+ return false;
618
+ }
619
+ }
620
+ /**
621
+ * progress.md 내용을 최대 크기 이내로 자르기 (최근 세션 유지)
622
+ */
623
+ function truncateProgressContent(content, maxSize) {
624
+ // 세션 구분자(---)로 분리
625
+ const sections = content.split(/\n---\n/);
626
+ if (sections.length <= 1) {
627
+ // 세션이 하나뿐이면 앞부분 자르기
628
+ return content.slice(-maxSize);
629
+ }
630
+ // 헤더 (첫 번째 섹션) 유지
631
+ const header = sections[0] + '\n---\n';
632
+ let result = header;
633
+ let currentSize = header.length;
634
+ // 최근 세션부터 역순으로 추가
635
+ for (let i = sections.length - 1; i >= 1; i--) {
636
+ const section = '\n---\n' + sections[i];
637
+ if (currentSize + section.length <= maxSize) {
638
+ result = header + section.slice(5) + result.slice(header.length);
639
+ currentSize += section.length;
640
+ }
641
+ else {
642
+ break;
643
+ }
644
+ }
645
+ return result;
646
+ }
554
647
  export default sync;
555
648
  //# sourceMappingURL=sync.js.map