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.
- 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 +30 -7
- 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/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/types.d.ts +33 -0
- package/dist/types.d.ts.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/package.json +1 -1
package/dist/commands/session.js
CHANGED
|
@@ -1,26 +1,259 @@
|
|
|
1
|
-
|
|
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
|
|
20
|
+
import { loadConnection, saveCurrentSession } from '../utils/connection.js';
|
|
6
21
|
import { getApiClient } from '../api/client.js';
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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(
|
|
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
|
|
49
|
-
printWarning('서버 세션 등록 실패
|
|
273
|
+
catch {
|
|
274
|
+
printWarning('서버 세션 등록 실패');
|
|
50
275
|
}
|
|
51
276
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
console.log(` ${
|
|
56
|
-
|
|
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('
|
|
121
|
-
console.log(colors.
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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":"AAAA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EACL,cAAc,EAEd,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAkB,EAAE,UAA+B,EAAE;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,WAAW,CAAC,eAAe,CAAC,CAAC;IAE7B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IAExD,wBAAwB;IACxB,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CACT,KAAK,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,uBAAuB,QAAQ,CAAC,UAAU,IAAI,CACxF,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,YAAY,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,UAAU,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,EAAE;gBAClE,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,cAAc;YACd,kBAAkB,CAAC;gBACjB,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,SAAS,EAAE,KAAK;aACjB,EAAE,OAAO,CAAC,CAAC;YAEZ,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAEvE,cAAc;YACd,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE;oBAC9B,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,+BAA+B,SAAS,EAAE;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,0BAA0B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,YAAY;IACZ,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,0BAA0B,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,wBAAwB,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,gBAAgB,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,wBAAwB,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC/D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,WAAW,CAAC,aAAa,CAAC,CAAC;IAE3B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,gCAAgC;IAEhE,iDAAiD;IACjD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,kBAAkB,EAAE,CAAC;QACvB,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,YAAY,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CACT,eAAe,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,cAAc,QAAQ,CAAC,UAAU,IAAI,CACzF,CAAC;IAEF,wBAAwB;IACxB,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAEnD,IAAI,UAAU,IAAI,MAAM,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CACnE,CAAC;YAEF,WAAW;YACX,MAAM,OAAO,GAAsB;gBACjC,QAAQ,EAAE,EAAE,EAAE,4BAA4B;gBAC1C,OAAO,EAAE,EAAE,EAAG,qBAAqB;gBACnC,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,eAAe;aAC1B,CAAC;YAEF,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACpD,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAErE,cAAc;YACd,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,YAAY;IACZ,YAAY,CAAC,uBAAuB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,kCAAkC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,sBAAsB,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,4BAA4B,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,wBAAwB,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,mBAAmB,CAAC,CAAC;IAE9D,sBAAsB;IACtB,iBAAiB,EAAE,CAAC;IAEpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,SAAS,CAAC,2DAA2D,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,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,MAAM,OAAO,GAAG,CAAC;IAClC,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"}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/sync.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -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
|