k0ntext 3.7.0 → 3.8.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 +281 -382
- package/dist/agent-system/timestamp-tracker.d.ts +159 -0
- package/dist/agent-system/timestamp-tracker.d.ts.map +1 -0
- package/dist/agent-system/timestamp-tracker.js +405 -0
- package/dist/agent-system/timestamp-tracker.js.map +1 -0
- package/dist/agent-system/todolist-manager.d.ts +244 -0
- package/dist/agent-system/todolist-manager.d.ts.map +1 -0
- package/dist/agent-system/todolist-manager.js +580 -0
- package/dist/agent-system/todolist-manager.js.map +1 -0
- package/dist/cli/commands/snapshot.d.ts +28 -0
- package/dist/cli/commands/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/snapshot.js +408 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/cli/version/comparator.d.ts +1 -0
- package/dist/cli/version/comparator.d.ts.map +1 -1
- package/dist/cli/version/comparator.js +1 -0
- package/dist/cli/version/comparator.js.map +1 -1
- package/dist/db/client.d.ts +5 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +7 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +1 -1
- package/dist/services/snapshot-manager.d.ts +251 -0
- package/dist/services/snapshot-manager.d.ts.map +1 -0
- package/dist/services/snapshot-manager.js +541 -0
- package/dist/services/snapshot-manager.js.map +1 -0
- package/docs/QUICKSTART.md +1 -1
- package/docs/TROUBLESHOOTING.md +51 -76
- package/docs/plans/2026-02-11-context-engineering-enhancement.md +1402 -0
- package/package.json +8 -2
- package/src/agent-system/timestamp-tracker.ts +520 -0
- package/src/agent-system/todolist-manager.ts +753 -0
- package/src/cli/commands/snapshot.ts +471 -0
- package/src/cli/version/comparator.ts +1 -0
- package/src/db/client.ts +8 -0
- package/src/db/migrations/0016_add_context_system_tables.sql +38 -0
- package/src/db/schema.ts +1 -1
- package/src/services/snapshot-manager.ts +719 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo List Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent todo lists that survive context compactions.
|
|
5
|
+
* Uses markdown file storage in .claude/todos/ directory.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import crypto from 'crypto';
|
|
10
|
+
/**
|
|
11
|
+
* Todo List Manager
|
|
12
|
+
*
|
|
13
|
+
* Manages persistent todo lists stored in markdown files.
|
|
14
|
+
*/
|
|
15
|
+
export class TodoListManager {
|
|
16
|
+
db;
|
|
17
|
+
baseDir;
|
|
18
|
+
verbose;
|
|
19
|
+
TODO_DIR = 'todos';
|
|
20
|
+
ACTIVE_SUBDIR = 'active';
|
|
21
|
+
COMPLETED_SUBDIR = 'completed';
|
|
22
|
+
ARCHIVED_SUBDIR = 'archived';
|
|
23
|
+
constructor(db, options = {}) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
this.baseDir = options.baseDir || path.join(process.cwd(), '.claude');
|
|
26
|
+
this.verbose = options.verbose || false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get todos directory path
|
|
30
|
+
*/
|
|
31
|
+
getTodosDir() {
|
|
32
|
+
return path.join(this.baseDir, this.TODO_DIR);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get active todos directory path
|
|
36
|
+
*/
|
|
37
|
+
getActiveDir() {
|
|
38
|
+
return path.join(this.getTodosDir(), this.ACTIVE_SUBDIR);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get completed todos directory path
|
|
42
|
+
*/
|
|
43
|
+
getCompletedDir() {
|
|
44
|
+
return path.join(this.getTodosDir(), this.COMPLETED_SUBDIR);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get archived todos directory path
|
|
48
|
+
*/
|
|
49
|
+
getArchivedDir() {
|
|
50
|
+
return path.join(this.getTodosDir(), this.ARCHIVED_SUBDIR);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Ensure all required directories exist
|
|
54
|
+
*/
|
|
55
|
+
async ensureDirectories() {
|
|
56
|
+
const dirs = [
|
|
57
|
+
this.getTodosDir(),
|
|
58
|
+
this.getActiveDir(),
|
|
59
|
+
this.getCompletedDir(),
|
|
60
|
+
this.getArchivedDir()
|
|
61
|
+
];
|
|
62
|
+
for (const dir of dirs) {
|
|
63
|
+
try {
|
|
64
|
+
await fs.mkdir(dir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Directory might already exist
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate unique session ID
|
|
73
|
+
*/
|
|
74
|
+
generateSessionId() {
|
|
75
|
+
const date = new Date().toISOString().split('T')[0].replace(/-/g, '');
|
|
76
|
+
const random = crypto.randomBytes(4).toString('hex').substring(0, 8);
|
|
77
|
+
return `sess-${date}-${random}`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate unique task ID
|
|
81
|
+
*/
|
|
82
|
+
generateTaskId() {
|
|
83
|
+
return crypto.randomBytes(8).toString('hex');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get current timestamp
|
|
87
|
+
*/
|
|
88
|
+
now() {
|
|
89
|
+
return new Date().toISOString();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a new todo session
|
|
93
|
+
*
|
|
94
|
+
* @param name - Session name
|
|
95
|
+
* @param tasks - Initial tasks (optional)
|
|
96
|
+
* @returns Created session
|
|
97
|
+
*/
|
|
98
|
+
async createSession(name, tasks = []) {
|
|
99
|
+
await this.ensureDirectories();
|
|
100
|
+
const sessionId = this.generateSessionId();
|
|
101
|
+
const now = this.now();
|
|
102
|
+
const sessionTasks = tasks.map(task => ({
|
|
103
|
+
...task,
|
|
104
|
+
id: this.generateTaskId(),
|
|
105
|
+
createdAt: now,
|
|
106
|
+
updatedAt: now
|
|
107
|
+
}));
|
|
108
|
+
const session = {
|
|
109
|
+
id: sessionId,
|
|
110
|
+
name,
|
|
111
|
+
status: 'active',
|
|
112
|
+
tasks: sessionTasks,
|
|
113
|
+
createdAt: now,
|
|
114
|
+
updatedAt: now
|
|
115
|
+
};
|
|
116
|
+
// Save to file
|
|
117
|
+
await this.saveSession(session);
|
|
118
|
+
// Store in database
|
|
119
|
+
this.storeSessionInDatabase(session);
|
|
120
|
+
if (this.verbose) {
|
|
121
|
+
console.log(`Created session: ${sessionId} with ${tasks.length} tasks`);
|
|
122
|
+
}
|
|
123
|
+
return session;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get active session
|
|
127
|
+
*
|
|
128
|
+
* @returns Active session or null if none exists
|
|
129
|
+
*/
|
|
130
|
+
async getActiveSession() {
|
|
131
|
+
await this.ensureDirectories();
|
|
132
|
+
const files = await fs.readdir(this.getActiveDir());
|
|
133
|
+
const mdFiles = files.filter(f => f.endsWith('.md') && !f.startsWith('.'));
|
|
134
|
+
if (mdFiles.length === 0) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// Get most recent session
|
|
138
|
+
const latestFile = mdFiles.sort().reverse()[0];
|
|
139
|
+
const content = await fs.readFile(path.join(this.getActiveDir(), latestFile), 'utf-8');
|
|
140
|
+
return this.parseSession(content);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get session by ID
|
|
144
|
+
*
|
|
145
|
+
* @param sessionId - Session ID
|
|
146
|
+
* @returns Session or null if not found
|
|
147
|
+
*/
|
|
148
|
+
async getSession(sessionId) {
|
|
149
|
+
// Try active directory first
|
|
150
|
+
let sessionPath = path.join(this.getActiveDir(), `${sessionId}.md`);
|
|
151
|
+
try {
|
|
152
|
+
const content = await fs.readFile(sessionPath, 'utf-8');
|
|
153
|
+
return this.parseSession(content);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Try completed directory
|
|
157
|
+
}
|
|
158
|
+
sessionPath = path.join(this.getCompletedDir(), `${sessionId}.md`);
|
|
159
|
+
try {
|
|
160
|
+
const content = await fs.readFile(sessionPath, 'utf-8');
|
|
161
|
+
return this.parseSession(content);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* List all sessions
|
|
169
|
+
*
|
|
170
|
+
* @param status - Filter by status (optional)
|
|
171
|
+
* @returns Array of sessions
|
|
172
|
+
*/
|
|
173
|
+
async listSessions(status) {
|
|
174
|
+
await this.ensureDirectories();
|
|
175
|
+
const sessions = [];
|
|
176
|
+
if (!status || status === 'active') {
|
|
177
|
+
const activeFiles = await fs.readdir(this.getActiveDir());
|
|
178
|
+
for (const file of activeFiles.filter(f => f.endsWith('.md'))) {
|
|
179
|
+
const content = await fs.readFile(path.join(this.getActiveDir(), file), 'utf-8');
|
|
180
|
+
sessions.push(this.parseSession(content));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!status || status === 'completed') {
|
|
184
|
+
const completedFiles = await fs.readdir(this.getCompletedDir());
|
|
185
|
+
for (const file of completedFiles.filter(f => f.endsWith('.md'))) {
|
|
186
|
+
const content = await fs.readFile(path.join(this.getCompletedDir(), file), 'utf-8');
|
|
187
|
+
sessions.push(this.parseSession(content));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Update a task in the active session
|
|
194
|
+
*
|
|
195
|
+
* @param taskId - Task ID
|
|
196
|
+
* @param updates - Fields to update
|
|
197
|
+
* @returns Updated task or null if not found
|
|
198
|
+
*/
|
|
199
|
+
async updateTask(taskId, updates) {
|
|
200
|
+
const session = await this.getActiveSession();
|
|
201
|
+
if (!session)
|
|
202
|
+
return null;
|
|
203
|
+
const task = session.tasks.find(t => t.id === taskId);
|
|
204
|
+
if (!task)
|
|
205
|
+
return null;
|
|
206
|
+
const updatedTask = { ...task, ...updates, updatedAt: this.now() };
|
|
207
|
+
if (updates.status === 'completed' && !task.completedAt) {
|
|
208
|
+
updatedTask.completedAt = this.now();
|
|
209
|
+
}
|
|
210
|
+
session.tasks = session.tasks.map(t => t.id === taskId ? updatedTask : t);
|
|
211
|
+
session.updatedAt = this.now();
|
|
212
|
+
await this.saveSession(session);
|
|
213
|
+
this.storeSessionInDatabase(session);
|
|
214
|
+
return updatedTask;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Add a task to the active session
|
|
218
|
+
*
|
|
219
|
+
* @param task - Task to add (without id)
|
|
220
|
+
* @returns Created task with ID
|
|
221
|
+
*/
|
|
222
|
+
async addTask(task) {
|
|
223
|
+
const session = await this.getActiveSession();
|
|
224
|
+
if (!session) {
|
|
225
|
+
// Create new session if none exists
|
|
226
|
+
const newSession = await this.createSession('New Session', [task]);
|
|
227
|
+
return newSession.tasks[0];
|
|
228
|
+
}
|
|
229
|
+
const newTask = {
|
|
230
|
+
...task,
|
|
231
|
+
id: this.generateTaskId(),
|
|
232
|
+
createdAt: this.now(),
|
|
233
|
+
updatedAt: this.now()
|
|
234
|
+
};
|
|
235
|
+
session.tasks.push(newTask);
|
|
236
|
+
session.updatedAt = this.now();
|
|
237
|
+
await this.saveSession(session);
|
|
238
|
+
this.storeSessionInDatabase(session);
|
|
239
|
+
return newTask;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Complete the active session
|
|
243
|
+
*
|
|
244
|
+
* @returns Completed session or null if no active session
|
|
245
|
+
*/
|
|
246
|
+
async completeSession() {
|
|
247
|
+
const session = await this.getActiveSession();
|
|
248
|
+
if (!session)
|
|
249
|
+
return null;
|
|
250
|
+
const now = this.now();
|
|
251
|
+
session.status = 'completed';
|
|
252
|
+
session.updatedAt = now;
|
|
253
|
+
// Mark incomplete tasks as blocked
|
|
254
|
+
session.tasks = session.tasks.map(t => {
|
|
255
|
+
if (t.status !== 'completed') {
|
|
256
|
+
return { ...t, status: 'blocked' };
|
|
257
|
+
}
|
|
258
|
+
return t;
|
|
259
|
+
});
|
|
260
|
+
await this.saveSession(session);
|
|
261
|
+
// Move from active to completed
|
|
262
|
+
const activePath = path.join(this.getActiveDir(), `${session.id}.md`);
|
|
263
|
+
const completedPath = path.join(this.getCompletedDir(), `${session.id}.md`);
|
|
264
|
+
await fs.rename(activePath, completedPath);
|
|
265
|
+
this.storeSessionInDatabase(session);
|
|
266
|
+
return session;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Archive a session
|
|
270
|
+
*
|
|
271
|
+
* @param sessionId - Session ID to archive
|
|
272
|
+
* @returns True if archived successfully
|
|
273
|
+
*/
|
|
274
|
+
async archiveSession(sessionId) {
|
|
275
|
+
const session = await this.getSession(sessionId);
|
|
276
|
+
if (!session)
|
|
277
|
+
return false;
|
|
278
|
+
// Add to archive file
|
|
279
|
+
const archiveDate = new Date().toISOString().split('T')[0];
|
|
280
|
+
const archivePath = path.join(this.getArchivedDir(), `${archiveDate}.md`);
|
|
281
|
+
const archiveContent = await this.generateArchiveContent(session);
|
|
282
|
+
await fs.appendFile(archivePath, archiveContent + '\n\n---\n\n', 'utf-8');
|
|
283
|
+
// Remove from completed
|
|
284
|
+
const completedPath = path.join(this.getCompletedDir(), `${sessionId}.md`);
|
|
285
|
+
await fs.unlink(completedPath);
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get progress for active session
|
|
290
|
+
*
|
|
291
|
+
* @returns Progress update or null if no active session
|
|
292
|
+
*/
|
|
293
|
+
async getProgress() {
|
|
294
|
+
const session = await this.getActiveSession();
|
|
295
|
+
if (!session)
|
|
296
|
+
return null;
|
|
297
|
+
const total = session.tasks.length;
|
|
298
|
+
const completed = session.tasks.filter(t => t.status === 'completed').length;
|
|
299
|
+
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
300
|
+
return {
|
|
301
|
+
sessionId: session.id,
|
|
302
|
+
total,
|
|
303
|
+
completed,
|
|
304
|
+
percentage
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Save session to markdown file
|
|
309
|
+
*/
|
|
310
|
+
async saveSession(session) {
|
|
311
|
+
const content = await this.generateSessionContent(session);
|
|
312
|
+
const filePath = path.join(session.status === 'active' ? this.getActiveDir() : this.getCompletedDir(), `${session.id}.md`);
|
|
313
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Generate session markdown content
|
|
317
|
+
*/
|
|
318
|
+
async generateSessionContent(session) {
|
|
319
|
+
const statusEmoji = {
|
|
320
|
+
active: '🔄',
|
|
321
|
+
completed: '✅',
|
|
322
|
+
archived: '📦'
|
|
323
|
+
};
|
|
324
|
+
const taskEmoji = (status) => {
|
|
325
|
+
switch (status) {
|
|
326
|
+
case 'pending': return '[ ]';
|
|
327
|
+
case 'in-progress': return '[~]';
|
|
328
|
+
case 'completed': return '[x]';
|
|
329
|
+
case 'blocked': return '[-]';
|
|
330
|
+
case 'cancelled': return '[✗]';
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
let content = `# Session Todo: ${session.name}
|
|
334
|
+
|
|
335
|
+
**Session ID:** ${session.id}
|
|
336
|
+
**Created:** ${session.createdAt}
|
|
337
|
+
**Status:** ${session.status} ${statusEmoji[session.status]}
|
|
338
|
+
|
|
339
|
+
## Tasks
|
|
340
|
+
|
|
341
|
+
`;
|
|
342
|
+
for (const task of session.tasks) {
|
|
343
|
+
content += `${taskEmoji(task.status)} Task ${task.id.substring(0, 8)}: ${task.subject}\n`;
|
|
344
|
+
if (task.description) {
|
|
345
|
+
content += ` ${task.description}\n`;
|
|
346
|
+
}
|
|
347
|
+
if (task.dependencies && task.dependencies.length > 0) {
|
|
348
|
+
content += ` Dependencies: ${task.dependencies.join(', ')}\n`;
|
|
349
|
+
}
|
|
350
|
+
content += '\n';
|
|
351
|
+
}
|
|
352
|
+
return content;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Generate archive entry content
|
|
356
|
+
*/
|
|
357
|
+
async generateArchiveContent(session) {
|
|
358
|
+
const total = session.tasks.length;
|
|
359
|
+
const completed = session.tasks.filter(t => t.status === 'completed').length;
|
|
360
|
+
const duration = new Date(session.updatedAt).getTime() - new Date(session.createdAt).getTime();
|
|
361
|
+
const durationMinutes = Math.round(duration / 60000);
|
|
362
|
+
return `## Session: ${session.name}
|
|
363
|
+
|
|
364
|
+
**Session ID:** ${session.id}
|
|
365
|
+
**Status:** Completed ✅
|
|
366
|
+
**Duration:** ${durationMinutes}m
|
|
367
|
+
**Tasks:** ${completed}/${total} completed (${Math.round((completed / total) * 100)}%)
|
|
368
|
+
|
|
369
|
+
**Summary:**
|
|
370
|
+
All tasks for "${session.name}" completed at ${session.updatedAt}.
|
|
371
|
+
`;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Parse session from markdown content
|
|
375
|
+
*/
|
|
376
|
+
parseSession(content) {
|
|
377
|
+
const lines = content.split('\n');
|
|
378
|
+
let id = '';
|
|
379
|
+
let name = 'Unknown Session';
|
|
380
|
+
let status = 'active';
|
|
381
|
+
let createdAt = new Date().toISOString();
|
|
382
|
+
let updatedAt = new Date().toISOString();
|
|
383
|
+
const tasks = [];
|
|
384
|
+
for (const line of lines) {
|
|
385
|
+
// Parse session metadata
|
|
386
|
+
const sessionMatch = line.match(/^\*\*Session ID:\s*(.+)$/);
|
|
387
|
+
if (sessionMatch)
|
|
388
|
+
id = sessionMatch[1];
|
|
389
|
+
const nameMatch = line.match(/^#\s+Session Todo:\s*(.+)$/);
|
|
390
|
+
if (nameMatch)
|
|
391
|
+
name = nameMatch[1];
|
|
392
|
+
const statusMatch = line.match(/^\*\*Status:\s*(\w+)\s/);
|
|
393
|
+
if (statusMatch) {
|
|
394
|
+
if (statusMatch[1].includes('active'))
|
|
395
|
+
status = 'active';
|
|
396
|
+
else if (statusMatch[1].includes('completed'))
|
|
397
|
+
status = 'completed';
|
|
398
|
+
else
|
|
399
|
+
status = 'archived';
|
|
400
|
+
}
|
|
401
|
+
const createdMatch = line.match(/^\*\*Created:\s*(.+)$/);
|
|
402
|
+
if (createdMatch)
|
|
403
|
+
createdAt = createdMatch[1];
|
|
404
|
+
// Parse tasks
|
|
405
|
+
const taskMatch = line.match(/^[\[\~x\s\-\]]\s+Task\s+([a-f0-9]+):\s*(.+)$/);
|
|
406
|
+
if (taskMatch) {
|
|
407
|
+
const taskId = taskMatch[1];
|
|
408
|
+
const subject = taskMatch[2];
|
|
409
|
+
const taskStatus = line.includes('[x]') ? 'completed' :
|
|
410
|
+
line.includes('[~]') ? 'in-progress' :
|
|
411
|
+
line.includes('[-]') ? 'blocked' :
|
|
412
|
+
line.includes('[✗]') ? 'cancelled' :
|
|
413
|
+
'pending';
|
|
414
|
+
tasks.push({
|
|
415
|
+
id: taskId,
|
|
416
|
+
subject,
|
|
417
|
+
status: taskStatus,
|
|
418
|
+
createdAt,
|
|
419
|
+
updatedAt
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return {
|
|
424
|
+
id,
|
|
425
|
+
name,
|
|
426
|
+
status,
|
|
427
|
+
tasks,
|
|
428
|
+
createdAt,
|
|
429
|
+
updatedAt
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Store session in database
|
|
434
|
+
*
|
|
435
|
+
* Uses todo_sessions and todo_tasks tables for efficient querying.
|
|
436
|
+
*/
|
|
437
|
+
storeSessionInDatabase(session) {
|
|
438
|
+
try {
|
|
439
|
+
// Check if schema supports todo tables
|
|
440
|
+
this.db.prepare('INSERT OR REPLACE INTO todo_sessions (id, name, created_at, updated_at, parent_session, metadata) VALUES (?, ?, ?, ?, ?, ?)').run(session.id, session.name, session.createdAt, session.updatedAt, session.parentSession, JSON.stringify(session.metadata || {}));
|
|
441
|
+
// Store tasks
|
|
442
|
+
for (const task of session.tasks) {
|
|
443
|
+
this.db.prepare('INSERT OR REPLACE INTO todo_tasks (id, session_id, subject, description, status, dependencies, assigned_to, created_at, updated_at, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)').run(task.id, session.id, task.subject, task.description || '', task.status, JSON.stringify(task.dependencies || []), task.assignedTo || '', task.createdAt, task.updatedAt, task.completedAt);
|
|
444
|
+
}
|
|
445
|
+
if (this.verbose) {
|
|
446
|
+
console.log(`Stored session ${session.id} in database with ${session.tasks.length} tasks`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
// Database might not have todo tables yet (migration 0016)
|
|
451
|
+
if (this.verbose) {
|
|
452
|
+
console.warn(`Could not store session in database: ${error}`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Get session from database
|
|
458
|
+
*
|
|
459
|
+
* @param sessionId - Session ID
|
|
460
|
+
* @returns Session with tasks or null
|
|
461
|
+
*/
|
|
462
|
+
getSessionFromDatabase(sessionId) {
|
|
463
|
+
try {
|
|
464
|
+
const sessionRow = this.db.prepare('SELECT * FROM todo_sessions WHERE id = ?').get(sessionId);
|
|
465
|
+
if (!sessionRow)
|
|
466
|
+
return null;
|
|
467
|
+
const session = sessionRow;
|
|
468
|
+
const tasksRows = this.db.prepare('SELECT * FROM todo_tasks WHERE session_id = ? ORDER BY created_at ASC').all(sessionId);
|
|
469
|
+
return {
|
|
470
|
+
id: typeof session.id === 'string' ? session.id : sessionId,
|
|
471
|
+
name: typeof session.name === 'string' ? session.name : 'Unknown',
|
|
472
|
+
status: (typeof session.status === 'string' && ['active', 'completed', 'archived'].includes(session.status))
|
|
473
|
+
? session.status : 'active',
|
|
474
|
+
createdAt: typeof session.created_at === 'string' ? session.created_at : new Date().toISOString(),
|
|
475
|
+
updatedAt: typeof session.updated_at === 'string' ? session.updated_at : new Date().toISOString(),
|
|
476
|
+
parentSession: typeof session.parent_session === 'string' ? session.parent_session : undefined,
|
|
477
|
+
metadata: typeof session.metadata === 'string' ? JSON.parse(session.metadata) :
|
|
478
|
+
(session.metadata && typeof session.metadata === 'object') ? session.metadata : undefined,
|
|
479
|
+
tasks: tasksRows.map((t) => {
|
|
480
|
+
const task = t;
|
|
481
|
+
return {
|
|
482
|
+
id: typeof task.id === 'string' ? task.id : this.generateTaskId(),
|
|
483
|
+
subject: typeof task.subject === 'string' ? task.subject : '',
|
|
484
|
+
description: typeof task.description === 'string' ? task.description : undefined,
|
|
485
|
+
status: (typeof task.status === 'string' && ['pending', 'in-progress', 'completed', 'blocked', 'cancelled'].includes(task.status))
|
|
486
|
+
? task.status : 'pending',
|
|
487
|
+
dependencies: typeof task.dependencies === 'string' ? JSON.parse(task.dependencies) :
|
|
488
|
+
(task.dependencies && Array.isArray(task.dependencies)) ? task.dependencies : undefined,
|
|
489
|
+
assignedTo: typeof task.assigned_to === 'string' ? task.assigned_to : undefined,
|
|
490
|
+
createdAt: typeof task.created_at === 'string' ? task.created_at : new Date().toISOString(),
|
|
491
|
+
updatedAt: typeof task.updated_at === 'string' ? task.updated_at : new Date().toISOString(),
|
|
492
|
+
completedAt: typeof task.completed_at === 'string' ? task.completed_at : undefined
|
|
493
|
+
};
|
|
494
|
+
})
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
if (this.verbose) {
|
|
499
|
+
console.warn(`Could not read session from database: ${error}`);
|
|
500
|
+
}
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Export session as markdown
|
|
506
|
+
*
|
|
507
|
+
* @param sessionId - Session ID
|
|
508
|
+
* @returns Markdown content
|
|
509
|
+
*/
|
|
510
|
+
async exportSession(sessionId) {
|
|
511
|
+
const session = await this.getSession(sessionId);
|
|
512
|
+
if (!session)
|
|
513
|
+
return null;
|
|
514
|
+
return await this.generateSessionContent(session);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Import tasks from markdown
|
|
518
|
+
*
|
|
519
|
+
* @param markdownContent - Markdown content
|
|
520
|
+
* @returns Created session
|
|
521
|
+
*/
|
|
522
|
+
async importTasks(markdownContent, sessionName) {
|
|
523
|
+
const imported = this.parseSession(markdownContent);
|
|
524
|
+
const tasks = imported.tasks.map(t => ({
|
|
525
|
+
subject: t.subject,
|
|
526
|
+
description: t.description,
|
|
527
|
+
status: t.status
|
|
528
|
+
}));
|
|
529
|
+
return await this.createSession(sessionName || 'Imported Session', tasks);
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Clean up old archived sessions
|
|
533
|
+
*
|
|
534
|
+
* @param daysOld - Remove archives older than this many days
|
|
535
|
+
* @returns Number of archives removed
|
|
536
|
+
*/
|
|
537
|
+
async cleanupOldArchives(daysOld = 30) {
|
|
538
|
+
const archiveDir = this.getArchivedDir();
|
|
539
|
+
const files = await fs.readdir(archiveDir);
|
|
540
|
+
const cutoff = Date.now() - (daysOld * 24 * 60 * 60 * 1000);
|
|
541
|
+
let removed = 0;
|
|
542
|
+
for (const file of files) {
|
|
543
|
+
if (!file.endsWith('.md'))
|
|
544
|
+
continue;
|
|
545
|
+
const filePath = path.join(archiveDir, file);
|
|
546
|
+
const stats = await fs.stat(filePath);
|
|
547
|
+
if (stats.mtime.getTime() < cutoff) {
|
|
548
|
+
await fs.unlink(filePath);
|
|
549
|
+
removed++;
|
|
550
|
+
if (this.verbose) {
|
|
551
|
+
console.log(`Removed old archive: ${file}`);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return removed;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Get all sessions for reporting
|
|
559
|
+
*
|
|
560
|
+
* @returns Summary of all sessions
|
|
561
|
+
*/
|
|
562
|
+
async getSummary() {
|
|
563
|
+
const allSessions = await this.listSessions();
|
|
564
|
+
const activeCount = allSessions.filter(s => s.status === 'active').length;
|
|
565
|
+
const completedCount = allSessions.filter(s => s.status === 'completed').length;
|
|
566
|
+
let totalTasks = 0;
|
|
567
|
+
let completedTasks = 0;
|
|
568
|
+
for (const session of allSessions) {
|
|
569
|
+
totalTasks += session.tasks.length;
|
|
570
|
+
completedTasks += session.tasks.filter(t => t.status === 'completed').length;
|
|
571
|
+
}
|
|
572
|
+
return {
|
|
573
|
+
active: activeCount,
|
|
574
|
+
completed: completedCount,
|
|
575
|
+
totalTasks,
|
|
576
|
+
completedTasks
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=todolist-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todolist-manager.js","sourceRoot":"","sources":["../../src/agent-system/todolist-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Commands
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for managing database snapshots.
|
|
5
|
+
* Supports create, restore, list, and diff operations.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
/**
|
|
9
|
+
* Snapshot create command
|
|
10
|
+
*/
|
|
11
|
+
export declare const snapshotCreateCommand: Command;
|
|
12
|
+
/**
|
|
13
|
+
* Snapshot restore command
|
|
14
|
+
*/
|
|
15
|
+
export declare const snapshotRestoreCommand: Command;
|
|
16
|
+
/**
|
|
17
|
+
* Snapshot list command
|
|
18
|
+
*/
|
|
19
|
+
export declare const snapshotListCommand: Command;
|
|
20
|
+
/**
|
|
21
|
+
* Snapshot diff command
|
|
22
|
+
*/
|
|
23
|
+
export declare const snapshotDiffCommand: Command;
|
|
24
|
+
/**
|
|
25
|
+
* Snapshot delete command
|
|
26
|
+
*/
|
|
27
|
+
export declare const snapshotDeleteCommand: Command;
|
|
28
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgEpC;;GAEG;AACH,eAAO,MAAM,qBAAqB,SA8D9B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,sBAAsB,SA0G/B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,mBAAmB,SAoF5B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,mBAAmB,SA6E5B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,qBAAqB,SA+C9B,CAAC"}
|