code-session-memory 0.3.2 → 0.4.1

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,482 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * sessions sub-commands for code-session-memory CLI
5
+ *
6
+ * sessions [list] Browse sessions (interactive TUI)
7
+ * sessions list --filter Browse with filter step first
8
+ * sessions print [id] Print all chunks of a session to stdout
9
+ * sessions print --filter Pick session interactively with filter, then print
10
+ * sessions delete [id] Delete a session from the DB
11
+ * sessions delete --filter Pick session interactively with filter, then delete
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.cmdSessionsList = cmdSessionsList;
48
+ exports.cmdSessionsPrint = cmdSessionsPrint;
49
+ exports.cmdSessionsDelete = cmdSessionsDelete;
50
+ exports.cmdSessions = cmdSessions;
51
+ const clack = __importStar(require("@clack/prompts"));
52
+ const database_1 = require("./database");
53
+ const database_2 = require("./database");
54
+ // ---------------------------------------------------------------------------
55
+ // Formatting helpers
56
+ // ---------------------------------------------------------------------------
57
+ function bold(s) { return `\x1b[1m${s}\x1b[0m`; }
58
+ function green(s) { return `\x1b[32m${s}\x1b[0m`; }
59
+ function red(s) { return `\x1b[31m${s}\x1b[0m`; }
60
+ function dim(s) { return `\x1b[2m${s}\x1b[0m`; }
61
+ function cyan(s) { return `\x1b[36m${s}\x1b[0m`; }
62
+ function yellow(s) { return `\x1b[33m${s}\x1b[0m`; }
63
+ function fmtDate(unixMs) {
64
+ if (!unixMs)
65
+ return dim("unknown date");
66
+ return new Date(unixMs).toISOString().slice(0, 10);
67
+ }
68
+ function fmtSource(source) {
69
+ return source === "opencode" ? cyan("opencode") : yellow("claude-code");
70
+ }
71
+ function fmtTitle(title) {
72
+ return title || dim("(untitled)");
73
+ }
74
+ function fmtProject(project) {
75
+ if (!project)
76
+ return dim("—");
77
+ const parts = project.replace(/\\/g, "/").split("/").filter(Boolean);
78
+ return parts.length > 2 ? dim("…/" + parts.slice(-2).join("/")) : dim(project);
79
+ }
80
+ function hr(char = "─", width = 72) {
81
+ return char.repeat(width);
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // DB helpers (open/close around each command)
85
+ // ---------------------------------------------------------------------------
86
+ function withDb(fn) {
87
+ const dbPath = (0, database_1.resolveDbPath)();
88
+ const db = (0, database_1.openDatabase)({ dbPath });
89
+ try {
90
+ return fn(db);
91
+ }
92
+ finally {
93
+ db.close();
94
+ }
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Label builder for the session picker
98
+ // ---------------------------------------------------------------------------
99
+ function sessionLabel(s) {
100
+ const date = fmtDate(s.updated_at);
101
+ const chunks = `${s.chunk_count} chunk${s.chunk_count !== 1 ? "s" : ""}`;
102
+ const title = fmtTitle(s.session_title).padEnd(40);
103
+ return `${title} ${date} ${chunks}`;
104
+ }
105
+ function sessionHint(s) {
106
+ return `${fmtSource(s.source)} ${fmtProject(s.project)}`;
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Filter step (shown when --filter flag is present)
110
+ // ---------------------------------------------------------------------------
111
+ async function runFilterStep() {
112
+ clack.intro(bold("Filter sessions"));
113
+ const sourceAnswer = await clack.select({
114
+ message: "Source",
115
+ options: [
116
+ { value: "all", label: "All tools" },
117
+ { value: "opencode", label: "OpenCode" },
118
+ { value: "claude-code", label: "Claude Code" },
119
+ ],
120
+ initialValue: "all",
121
+ });
122
+ if (clack.isCancel(sourceAnswer)) {
123
+ clack.cancel("Cancelled.");
124
+ process.exit(0);
125
+ }
126
+ const dateAnswer = await clack.select({
127
+ message: "Date range",
128
+ options: [
129
+ { value: "all", label: "All time" },
130
+ { value: "7d", label: "Last 7 days" },
131
+ { value: "30d", label: "Last 30 days" },
132
+ { value: "90d", label: "Last 90 days" },
133
+ { value: "recent", label: "Last N days", hint: "enter a number" },
134
+ { value: "older", label: "Older than N days", hint: "enter a number" },
135
+ ],
136
+ initialValue: "all",
137
+ });
138
+ if (clack.isCancel(dateAnswer)) {
139
+ clack.cancel("Cancelled.");
140
+ process.exit(0);
141
+ }
142
+ const filter = {};
143
+ if (sourceAnswer !== "all") {
144
+ filter.source = sourceAnswer;
145
+ }
146
+ const nowMs = Date.now();
147
+ const DAY_MS = 86400 * 1000;
148
+ if (dateAnswer === "7d") {
149
+ filter.fromDate = nowMs - 7 * DAY_MS;
150
+ }
151
+ else if (dateAnswer === "30d") {
152
+ filter.fromDate = nowMs - 30 * DAY_MS;
153
+ }
154
+ else if (dateAnswer === "90d") {
155
+ filter.fromDate = nowMs - 90 * DAY_MS;
156
+ }
157
+ else if (dateAnswer === "recent") {
158
+ const nAnswer = await clack.text({
159
+ message: "Show sessions from the last how many days?",
160
+ placeholder: "14",
161
+ validate(v) {
162
+ if (!v || isNaN(Number(v)) || Number(v) <= 0)
163
+ return "Please enter a positive number.";
164
+ },
165
+ });
166
+ if (clack.isCancel(nAnswer)) {
167
+ clack.cancel("Cancelled.");
168
+ process.exit(0);
169
+ }
170
+ filter.fromDate = nowMs - Number(nAnswer) * DAY_MS;
171
+ }
172
+ else if (dateAnswer === "older") {
173
+ const nAnswer = await clack.text({
174
+ message: "Show sessions older than how many days?",
175
+ placeholder: "30",
176
+ validate(v) {
177
+ if (!v || isNaN(Number(v)) || Number(v) <= 0)
178
+ return "Please enter a positive number.";
179
+ },
180
+ });
181
+ if (clack.isCancel(nAnswer)) {
182
+ clack.cancel("Cancelled.");
183
+ process.exit(0);
184
+ }
185
+ filter.toDate = nowMs - Number(nAnswer) * DAY_MS;
186
+ }
187
+ return filter;
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Shared session picker
191
+ // Returns the chosen SessionRow, or null if the user cancelled / exited.
192
+ // When withFilter is true, runs the filter step first.
193
+ // ---------------------------------------------------------------------------
194
+ async function pickSession(withFilter) {
195
+ let filter = {};
196
+ if (withFilter) {
197
+ filter = await runFilterStep();
198
+ console.log();
199
+ }
200
+ const sessions = withDb((db) => (0, database_2.listSessions)(db, filter));
201
+ if (sessions.length === 0) {
202
+ clack.log.warn("No sessions match the current filter.");
203
+ return null;
204
+ }
205
+ const chosen = await clack.select({
206
+ message: `${sessions.length} session${sessions.length !== 1 ? "s" : ""}${withFilter ? dim(" (filtered)") : ""} — pick one`,
207
+ options: [
208
+ ...sessions.map((s) => ({
209
+ value: s.session_id,
210
+ label: sessionLabel(s),
211
+ hint: sessionHint(s),
212
+ })),
213
+ { value: "__cancel__", label: dim("Cancel") },
214
+ ],
215
+ maxItems: 12,
216
+ });
217
+ if (clack.isCancel(chosen) || chosen === "__cancel__")
218
+ return null;
219
+ return sessions.find((s) => s.session_id === chosen) ?? null;
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ // Action loop for a selected session (used by sessions list)
223
+ // ---------------------------------------------------------------------------
224
+ async function sessionActionLoop(session) {
225
+ while (true) {
226
+ clack.log.message([
227
+ `${bold(fmtTitle(session.session_title))}`,
228
+ `${fmtSource(session.source)} ${fmtDate(session.updated_at)} ${session.chunk_count} chunks`,
229
+ `Project: ${session.project || dim("—")}`,
230
+ `ID: ${dim(session.session_id)}`,
231
+ ].join("\n"), { symbol: "○" });
232
+ const action = await clack.select({
233
+ message: "What would you like to do?",
234
+ options: [
235
+ { value: "print", label: "Print session", hint: "output all chunks to stdout" },
236
+ { value: "delete", label: "Delete session", hint: "remove from DB" },
237
+ { value: "back", label: "Back to list" },
238
+ ],
239
+ });
240
+ if (clack.isCancel(action) || action === "back")
241
+ return "back";
242
+ if (action === "print") {
243
+ clack.outro(dim("Printing session…"));
244
+ printSession(session.session_id);
245
+ return "exit";
246
+ }
247
+ if (action === "delete") {
248
+ const confirmed = await clack.confirm({
249
+ message: `Delete "${fmtTitle(session.session_title)}" (${session.chunk_count} chunks)?`,
250
+ initialValue: false,
251
+ });
252
+ if (clack.isCancel(confirmed) || !confirmed) {
253
+ clack.log.info("Deletion cancelled.");
254
+ continue;
255
+ }
256
+ const deleted = withDb((db) => (0, database_2.deleteSession)(db, session.session_id));
257
+ clack.log.success(`Deleted ${deleted} chunks.`);
258
+ clack.log.warn("Note: if this session's source files still exist, it will be re-indexed on the next agent turn.");
259
+ return "back";
260
+ }
261
+ }
262
+ }
263
+ // ---------------------------------------------------------------------------
264
+ // sessions list
265
+ // ---------------------------------------------------------------------------
266
+ async function cmdSessionsList(args) {
267
+ const withFilter = args.includes("--filter");
268
+ if (!withFilter) {
269
+ clack.intro(bold("Sessions"));
270
+ }
271
+ // Main browse loop — re-shown after back/delete so the user can keep browsing
272
+ let filter = {};
273
+ let filterResolved = false;
274
+ while (true) {
275
+ // Run filter step once (first iteration only, if --filter was passed)
276
+ if (withFilter && !filterResolved) {
277
+ filter = await runFilterStep();
278
+ filterResolved = true;
279
+ console.log();
280
+ }
281
+ const sessions = withDb((db) => (0, database_2.listSessions)(db, filter));
282
+ if (sessions.length === 0) {
283
+ clack.log.warn("No sessions match the current filter.");
284
+ clack.outro("Done.");
285
+ return;
286
+ }
287
+ const chosen = await clack.select({
288
+ message: `${sessions.length} session${sessions.length !== 1 ? "s" : ""} ${withFilter ? dim("(filtered)") : ""}`,
289
+ options: [
290
+ ...sessions.map((s) => ({
291
+ value: s.session_id,
292
+ label: sessionLabel(s),
293
+ hint: sessionHint(s),
294
+ })),
295
+ { value: "__exit__", label: dim("Exit") },
296
+ ],
297
+ maxItems: 12,
298
+ });
299
+ if (clack.isCancel(chosen) || chosen === "__exit__") {
300
+ clack.outro("Done.");
301
+ return;
302
+ }
303
+ const session = sessions.find((s) => s.session_id === chosen);
304
+ const result = await sessionActionLoop(session);
305
+ if (result === "exit")
306
+ return;
307
+ // result === "back" → loop again, refresh session list
308
+ }
309
+ }
310
+ // ---------------------------------------------------------------------------
311
+ // sessions print [id]
312
+ // ---------------------------------------------------------------------------
313
+ async function cmdSessionsPrint(sessionId, args = []) {
314
+ const withFilter = args.includes("--filter");
315
+ if (!sessionId) {
316
+ // No ID given — launch interactive picker
317
+ clack.intro(bold("Print session"));
318
+ const session = await pickSession(withFilter);
319
+ if (!session) {
320
+ clack.outro("Cancelled.");
321
+ return;
322
+ }
323
+ clack.outro(dim("Printing session…"));
324
+ printSession(session.session_id);
325
+ return;
326
+ }
327
+ printSession(sessionId);
328
+ }
329
+ function printSession(sessionId) {
330
+ const { session, chunks } = withDb((db) => {
331
+ const rows = (0, database_2.listSessions)(db, {});
332
+ const session = rows.find((s) => s.session_id === sessionId);
333
+ const chunks = (0, database_2.getSessionChunksOrdered)(db, sessionId);
334
+ return { session, chunks };
335
+ });
336
+ if (!session && chunks.length === 0) {
337
+ console.error(`No session found with ID: ${sessionId}`);
338
+ process.exit(1);
339
+ }
340
+ const useTty = process.stdout.isTTY;
341
+ const b = (s) => useTty ? bold(s) : s;
342
+ const d = (s) => useTty ? dim(s) : s;
343
+ const c = (s) => useTty ? cyan(s) : s;
344
+ const y = (s) => useTty ? yellow(s) : s;
345
+ const title = session?.session_title || "(untitled)";
346
+ const source = session?.source || "unknown";
347
+ const date = session ? fmtDate(session.updated_at) : "unknown";
348
+ const project = session?.project || "—";
349
+ console.log(hr());
350
+ console.log(`${b("Session:")} ${title}`);
351
+ console.log(`${b("Source:")} ${source === "opencode" ? c(source) : y(source)} ${d(date)}`);
352
+ console.log(`${b("Project:")} ${project}`);
353
+ console.log(`${b("ID:")} ${d(sessionId)}`);
354
+ console.log(`${b("Chunks:")} ${chunks.length}`);
355
+ console.log(hr());
356
+ const total = chunks.length;
357
+ for (let i = 0; i < chunks.length; i++) {
358
+ const chunk = chunks[i];
359
+ console.log();
360
+ console.log(b(`## Chunk ${i + 1}/${total}`) + ` ${d("—")} Section: ${chunk.section || d("(none)")}`);
361
+ console.log();
362
+ console.log(chunk.content);
363
+ }
364
+ console.log();
365
+ console.log(hr());
366
+ }
367
+ // ---------------------------------------------------------------------------
368
+ // sessions delete [id]
369
+ // ---------------------------------------------------------------------------
370
+ async function cmdSessionsDelete(sessionId, args = []) {
371
+ const withFilter = args.includes("--filter");
372
+ clack.intro(bold("Delete session"));
373
+ let session = null;
374
+ if (!sessionId) {
375
+ // No ID given — launch interactive picker
376
+ session = await pickSession(withFilter);
377
+ if (!session) {
378
+ clack.outro("Cancelled.");
379
+ return;
380
+ }
381
+ }
382
+ else {
383
+ session = withDb((db) => {
384
+ const rows = (0, database_2.listSessions)(db, {});
385
+ return rows.find((s) => s.session_id === sessionId) ?? null;
386
+ });
387
+ if (!session) {
388
+ console.error(`No session found with ID: ${sessionId}`);
389
+ process.exit(1);
390
+ }
391
+ }
392
+ clack.log.message([
393
+ `${bold(fmtTitle(session.session_title))}`,
394
+ `${fmtSource(session.source)} ${fmtDate(session.updated_at)} ${session.chunk_count} chunks`,
395
+ `Project: ${session.project || dim("—")}`,
396
+ `ID: ${dim(session.session_id)}`,
397
+ ].join("\n"), { symbol: "○" });
398
+ const confirmed = await clack.confirm({
399
+ message: `Delete this session (${session.chunk_count} chunks)?`,
400
+ initialValue: false,
401
+ });
402
+ if (clack.isCancel(confirmed) || !confirmed) {
403
+ clack.cancel("Deletion cancelled — database was not modified.");
404
+ return;
405
+ }
406
+ const deleted = withDb((db) => (0, database_2.deleteSession)(db, session.session_id));
407
+ clack.log.success(`Deleted ${deleted} chunks.`);
408
+ clack.log.warn("Note: if this session's source files still exist, it will be re-indexed on the next agent turn.");
409
+ clack.outro("Done.");
410
+ }
411
+ // ---------------------------------------------------------------------------
412
+ // Help
413
+ // ---------------------------------------------------------------------------
414
+ function sessionsHelp() {
415
+ const b = (s) => `\x1b[1m${s}\x1b[0m`;
416
+ console.log(`
417
+ ${b("sessions")} — Browse, inspect, and delete indexed sessions
418
+
419
+ ${b("Usage:")}
420
+ npx code-session-memory sessions Browse sessions interactively
421
+ npx code-session-memory sessions --filter Apply source/date filters before browsing
422
+ npx code-session-memory sessions list Same as above (explicit sub-command)
423
+ npx code-session-memory sessions list --filter Same with filter step
424
+
425
+ npx code-session-memory sessions print Pick a session interactively, then print
426
+ npx code-session-memory sessions print --filter Pick with filter, then print
427
+ npx code-session-memory sessions print <id> Print all chunks of a session directly
428
+
429
+ npx code-session-memory sessions delete Pick a session interactively, then delete
430
+ npx code-session-memory sessions delete --filter Pick with filter, then delete
431
+ npx code-session-memory sessions delete <id> Delete a session directly
432
+
433
+ ${b("Filter options")} (with --filter):
434
+ Source: All tools / OpenCode / Claude Code
435
+ Date range: Last 7 / 30 / 90 days, last N days (custom), older than N days (custom)
436
+
437
+ ${b("Notes:")}
438
+ - Deleting a session only removes it from the DB. If the source files still
439
+ exist, the session will be re-indexed on the next agent turn.
440
+ - "sessions print" output is pipe-friendly (no ANSI when stdout is not a TTY).
441
+ `);
442
+ }
443
+ // ---------------------------------------------------------------------------
444
+ // Entry point: dispatch sessions sub-commands
445
+ // ---------------------------------------------------------------------------
446
+ async function cmdSessions(argv) {
447
+ const sub = argv[0] ?? "list";
448
+ // Help flag anywhere in argv
449
+ if (argv.includes("--help") || argv.includes("-h")) {
450
+ sessionsHelp();
451
+ return;
452
+ }
453
+ switch (sub) {
454
+ case "list":
455
+ await cmdSessionsList(argv.slice(1));
456
+ break;
457
+ case "print": {
458
+ // argv[1] is either an ID or a flag (--filter) or absent
459
+ const maybeId = argv[1] && !argv[1].startsWith("-") ? argv[1] : undefined;
460
+ const restArgs = maybeId ? argv.slice(2) : argv.slice(1);
461
+ await cmdSessionsPrint(maybeId, restArgs);
462
+ break;
463
+ }
464
+ case "delete": {
465
+ const maybeId = argv[1] && !argv[1].startsWith("-") ? argv[1] : undefined;
466
+ const restArgs = maybeId ? argv.slice(2) : argv.slice(1);
467
+ await cmdSessionsDelete(maybeId, restArgs);
468
+ break;
469
+ }
470
+ default:
471
+ // Treat unknown first arg as implicit "list" (e.g. `sessions --filter`)
472
+ if (sub.startsWith("-")) {
473
+ await cmdSessionsList(argv);
474
+ }
475
+ else {
476
+ console.error(`Unknown sessions sub-command: ${sub}`);
477
+ console.error('Run "npx code-session-memory sessions --help" for usage.');
478
+ process.exit(1);
479
+ }
480
+ }
481
+ }
482
+ //# sourceMappingURL=cli-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-sessions.js","sourceRoot":"","sources":["../../src/cli-sessions.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.d.ts CHANGED
@@ -3,9 +3,11 @@
3
3
  * code-session-memory CLI
4
4
  *
5
5
  * Usage:
6
- * npx code-session-memory install — install for OpenCode + Claude Code
7
- * npx code-session-memory status — show installation status
8
- * npx code-session-memory uninstall — remove all installed components
6
+ * npx code-session-memory install — install for OpenCode + Claude Code
7
+ * npx code-session-memory status — show installation status
8
+ * npx code-session-memory uninstall — remove all installed components
9
+ * npx code-session-memory reset-db — wipe the database (with confirmation)
10
+ * npx code-session-memory sessions — browse / print / delete sessions
9
11
  */
10
12
  export {};
11
13
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
package/dist/src/cli.js CHANGED
@@ -4,9 +4,11 @@
4
4
  * code-session-memory CLI
5
5
  *
6
6
  * Usage:
7
- * npx code-session-memory install — install for OpenCode + Claude Code
8
- * npx code-session-memory status — show installation status
9
- * npx code-session-memory uninstall — remove all installed components
7
+ * npx code-session-memory install — install for OpenCode + Claude Code
8
+ * npx code-session-memory status — show installation status
9
+ * npx code-session-memory uninstall — remove all installed components
10
+ * npx code-session-memory reset-db — wipe the database (with confirmation)
11
+ * npx code-session-memory sessions — browse / print / delete sessions
10
12
  */
11
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -16,6 +18,7 @@ const fs_1 = __importDefault(require("fs"));
16
18
  const path_1 = __importDefault(require("path"));
17
19
  const os_1 = __importDefault(require("os"));
18
20
  const database_1 = require("./database");
21
+ const cli_sessions_1 = require("./cli-sessions");
19
22
  // ---------------------------------------------------------------------------
20
23
  // Paths — OpenCode
21
24
  // ---------------------------------------------------------------------------
@@ -186,13 +189,13 @@ function installClaudeHook(indexerCliClaudePath) {
186
189
  else {
187
190
  hooks.Stop = [];
188
191
  }
189
- // Add our hook
192
+ // Add our hook (synchronous — must NOT be async so the JSONL is fully
193
+ // written by Claude Code before we read it)
190
194
  hooks.Stop.push({
191
195
  hooks: [
192
196
  {
193
197
  type: "command",
194
198
  command: `node ${indexerCliClaudePath}`,
195
- async: true,
196
199
  },
197
200
  ],
198
201
  });
@@ -552,15 +555,64 @@ function uninstall() {
552
555
  ${dim(`To delete it: rm "${(0, database_1.resolveDbPath)()}"`)}
553
556
  `);
554
557
  }
558
+ function resetDb() {
559
+ console.log(bold("\ncode-session-memory reset-db\n"));
560
+ const dbPath = (0, database_1.resolveDbPath)();
561
+ if (!fs_1.default.existsSync(dbPath)) {
562
+ console.log(` ${dim("Database not found:")} ${dbPath}`);
563
+ console.log(` Nothing to reset.\n`);
564
+ return;
565
+ }
566
+ // Show current stats before asking
567
+ try {
568
+ const db = (0, database_1.openDatabase)({ dbPath });
569
+ const chunks = db.prepare("SELECT COUNT(*) as n FROM vec_items").get().n;
570
+ const sessions = db.prepare("SELECT COUNT(*) as n FROM sessions_meta").get().n;
571
+ db.close();
572
+ console.log(` Database: ${dim(dbPath)}`);
573
+ console.log(` Indexed chunks: ${chunks}`);
574
+ console.log(` Sessions tracked: ${sessions}\n`);
575
+ }
576
+ catch {
577
+ console.log(` Database: ${dim(dbPath)}\n`);
578
+ }
579
+ // Prompt for confirmation
580
+ process.stdout.write(` ${red("This will permanently delete all indexed data.")} Confirm? [y/N] `);
581
+ const response = (() => {
582
+ try {
583
+ // Read a single line synchronously from stdin
584
+ const buf = Buffer.alloc(64);
585
+ const n = fs_1.default.readSync(0, buf, 0, buf.length, null);
586
+ return buf.slice(0, n).toString("utf8").trim().toLowerCase();
587
+ }
588
+ catch {
589
+ return "";
590
+ }
591
+ })();
592
+ if (response !== "y" && response !== "yes") {
593
+ console.log(`\n ${dim("Aborted — database was not modified.")}\n`);
594
+ return;
595
+ }
596
+ fs_1.default.unlinkSync(dbPath);
597
+ // Re-initialise an empty DB
598
+ const db = (0, database_1.openDatabase)({ dbPath });
599
+ db.close();
600
+ console.log(`\n ${green("Done.")} Database reset — all indexed data removed.\n`);
601
+ }
555
602
  function help() {
556
603
  console.log(`
557
604
  ${bold("code-session-memory")} — Shared vector memory for OpenCode and Claude Code sessions
558
605
 
559
606
  ${bold("Usage:")}
560
- npx code-session-memory install Install all components (OpenCode + Claude Code)
561
- npx code-session-memory status Show installation status and DB stats
562
- npx code-session-memory uninstall Remove all installed components (keeps DB)
563
- npx code-session-memory help Show this help
607
+ npx code-session-memory install Install all components (OpenCode + Claude Code)
608
+ npx code-session-memory status Show installation status and DB stats
609
+ npx code-session-memory uninstall Remove all installed components (keeps DB)
610
+ npx code-session-memory reset-db Delete all indexed data (keeps installation)
611
+ npx code-session-memory sessions Browse sessions interactively
612
+ npx code-session-memory sessions --filter Browse with source/date filter step
613
+ npx code-session-memory sessions print <id> Print all chunks of a session to stdout
614
+ npx code-session-memory sessions delete <id> Delete a session from the DB
615
+ npx code-session-memory help Show this help
564
616
 
565
617
  ${bold("Environment variables:")}
566
618
  OPENAI_API_KEY Required for embedding generation
@@ -583,6 +635,15 @@ switch (cmd) {
583
635
  case "uninstall":
584
636
  uninstall();
585
637
  break;
638
+ case "reset-db":
639
+ resetDb();
640
+ break;
641
+ case "sessions":
642
+ (0, cli_sessions_1.cmdSessions)(process.argv.slice(3)).catch((err) => {
643
+ console.error(err instanceof Error ? err.message : String(err));
644
+ process.exit(1);
645
+ });
646
+ break;
586
647
  case "help":
587
648
  case "--help":
588
649
  case "-h":