claude-session-continuity-mcp 1.17.0 → 1.17.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # claude-session-continuity-mcp
2
2
 
3
- > **Never re-explain your project to your AI coding agent again.** 100% local session memory for **Claude Code & OpenAI Codex CLI** — auto context injection, semantic search, and error→solution recall. Zero config, zero API cost.
3
+ > **Never re-explain your project to your AI coding agent again.** 100% local session memory for **Claude Code, OpenAI Codex CLI & Google Gemini CLI** — auto context injection, semantic search, and error→solution recall. Zero config, zero API cost.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/claude-session-continuity-mcp.svg)](https://www.npmjs.com/package/claude-session-continuity-mcp)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/claude-session-continuity-mcp.svg)](https://www.npmjs.com/package/claude-session-continuity-mcp)
@@ -11,9 +11,11 @@
11
11
 
12
12
  ![Session continuity demo — Claude auto-restores your project context on session start](assets/demo.gif)
13
13
 
14
+ > **Name note:** the package is called `claude-session-continuity-mcp` for historical reasons, but it is **agent-agnostic** — Claude Code, Codex CLI, and Gemini CLI are first-class and share one local memory.
15
+
14
16
  ## The Problem
15
17
 
16
- Every new Claude Code session:
18
+ Every new session — whether you're in Claude Code, Codex CLI, or Gemini CLI:
17
19
 
18
20
  ```
19
21
  "This is a Next.js 15 project with App Router..."
@@ -26,7 +28,7 @@ Every new Claude Code session:
26
28
 
27
29
  ## The Solution
28
30
 
29
- **Fully automatic.** Lifecycle hooks handle everything without manual calls — on **Claude Code** and **OpenAI Codex CLI**, sharing one local memory so context carries across both:
31
+ **Fully automatic.** Lifecycle hooks handle everything without manual calls — on **Claude Code**, **OpenAI Codex CLI**, and **Google Gemini CLI**, sharing one local memory so context carries across all three:
30
32
 
31
33
  ```bash
32
34
  # Session start → Auto-loads relevant context + recent session history
@@ -90,13 +92,13 @@ There's also a great class of **local search** tools (e.g. [ctx](https://github.
90
92
  | **How you use it** | **Automatic** — context appears on session start, no command | You (or the agent) run a search query |
91
93
  | **Compaction** | **PreCompact hook re-injects a handover** → 0 context re-explained after a compact | Not its job (it's a search index) |
92
94
  | **Best at** | *Never losing your thread* across sessions & compacts, hands-off | *Finding* a specific past decision/command on demand |
93
- | **Coverage** | Claude Code + Codex CLI (where auto-injection is possible) | Often 30+ agents indexed for search |
95
+ | **Coverage** | Claude Code + Codex CLI + Gemini CLI (where auto-injection is possible) | Often 30+ agents indexed for search |
94
96
 
95
97
  Use search when you want to *look something up*. Use this when you want your context to *follow you* without asking.
96
98
 
97
99
  ---
98
100
 
99
- ## Works with Codex CLI too (v1.16.0+)
101
+ ## Codex CLI support (v1.16.0+)
100
102
 
101
103
  Beyond Claude Code, this also supports **OpenAI Codex CLI**. If `~/.codex` exists,
102
104
  the installer registers the same hooks in `~/.codex/hooks.json` (SessionStart,
@@ -114,7 +116,7 @@ interface (it can be null at startup), so host detection uses an installer-injec
114
116
 
115
117
  ---
116
118
 
117
- ## Works with Gemini CLI too (v1.17.0+)
119
+ ## Gemini CLI support (v1.17.0+)
118
120
 
119
121
  Also supports **Google Gemini CLI**. If `~/.gemini` exists, the installer registers
120
122
  the hooks in `~/.gemini/settings.json` (SessionStart, BeforeAgent, PreCompress,
@@ -136,6 +138,12 @@ not this tool. Session continuity still works via the saved history.
136
138
 
137
139
  ## Quick Start
138
140
 
141
+ > **Requires Node.js 22+.** The native `better-sqlite3` dependency only ships
142
+ > prebuilt binaries for Node 22, 24, and 26 (the currently supported lines —
143
+ > Node 18 and 20 are both end-of-life). On older Node it falls back to compiling
144
+ > from source, which fails without build tools. Node 22 and up install cleanly
145
+ > with no compiler needed.
146
+
139
147
  ### Recommended: Global Installation
140
148
 
141
149
  ```bash
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/index.js CHANGED
@@ -20,7 +20,8 @@ import { ListToolsRequestSchema, CallToolRequestSchema, ListPromptsRequestSchema
20
20
  import * as fs from 'fs/promises';
21
21
  import { mkdirSync, existsSync } from 'fs';
22
22
  import * as path from 'path';
23
- import { execSync } from 'child_process';
23
+ import { execSync, spawnSync } from 'child_process';
24
+ import { fileURLToPath } from 'url';
24
25
  import Database from 'better-sqlite3';
25
26
  import { tokenizeQuery, buildFtsQuery } from './utils/tokenize.js';
26
27
  // @xenova/transformers - 동적 import (sharp 의존성 문제 방지)
@@ -2173,4 +2174,25 @@ async function main() {
2173
2174
  await server.connect(transport);
2174
2175
  console.error('Project Manager MCP v5 started (24 tools + 3 prompts for auto-injection)');
2175
2176
  }
2176
- main().catch(console.error);
2177
+ // CLI subcommands (install/uninstall/status/help) → delegate to the hooks installer.
2178
+ // Without this, `npx claude-session-continuity-mcp install` runs the default bin
2179
+ // (the MCP server), which ignores the arg and hangs on stdio — looks broken to users.
2180
+ const CLI_COMMANDS = new Set(['install', 'uninstall', 'remove', 'status']);
2181
+ const cliArg = process.argv[2];
2182
+ if (cliArg && (CLI_COMMANDS.has(cliArg) || cliArg === 'help' || cliArg === '--help' || cliArg === '-h')) {
2183
+ if (cliArg === 'help' || cliArg === '--help' || cliArg === '-h') {
2184
+ console.log('Usage: npx claude-session-continuity-mcp [install|uninstall|status]');
2185
+ console.log(' install Register lifecycle hooks for Claude Code / Codex CLI / Gemini CLI');
2186
+ console.log(' uninstall Remove the hooks');
2187
+ console.log(' status Show installed hooks');
2188
+ console.log(' (no arg) Start the MCP server (stdio) — used by the hook runtime');
2189
+ process.exit(0);
2190
+ }
2191
+ const here = path.dirname(fileURLToPath(import.meta.url));
2192
+ const installerPath = path.join(here, 'hooks', 'install.js');
2193
+ const result = spawnSync(process.execPath, [installerPath, cliArg], { stdio: 'inherit' });
2194
+ process.exit(result.status ?? 0);
2195
+ }
2196
+ else {
2197
+ main().catch(console.error);
2198
+ }
package/dist/schemas.d.ts CHANGED
@@ -21,15 +21,15 @@ export declare const ContextUpdateSchema: z.ZodObject<{
21
21
  project: string;
22
22
  currentState: string;
23
23
  verification?: "passed" | "failed" | undefined;
24
- recentFiles?: string[] | undefined;
25
24
  blockers?: string | undefined;
25
+ recentFiles?: string[] | undefined;
26
26
  architectureDecision?: string | undefined;
27
27
  }, {
28
28
  project: string;
29
29
  currentState: string;
30
30
  verification?: "passed" | "failed" | undefined;
31
- recentFiles?: string[] | undefined;
32
31
  blockers?: string | undefined;
32
+ recentFiles?: string[] | undefined;
33
33
  architectureDecision?: string | undefined;
34
34
  }>;
35
35
  export declare const MemoryStoreSchema: z.ZodObject<{
@@ -40,15 +40,15 @@ export declare const MemoryStoreSchema: z.ZodObject<{
40
40
  importance: z.ZodDefault<z.ZodNumber>;
41
41
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
42
42
  }, "strip", z.ZodTypeAny, {
43
- type: "error" | "observation" | "decision" | "learning" | "pattern" | "preference";
44
43
  content: string;
44
+ type: "pattern" | "observation" | "decision" | "learning" | "error" | "preference";
45
45
  importance: number;
46
46
  project?: string | undefined;
47
47
  tags?: string[] | undefined;
48
48
  metadata?: Record<string, unknown> | undefined;
49
49
  }, {
50
- type: "error" | "observation" | "decision" | "learning" | "pattern" | "preference";
51
50
  content: string;
51
+ type: "pattern" | "observation" | "decision" | "learning" | "error" | "preference";
52
52
  project?: string | undefined;
53
53
  tags?: string[] | undefined;
54
54
  importance?: number | undefined;
@@ -63,20 +63,20 @@ export declare const MemorySearchSchema: z.ZodObject<{
63
63
  minImportance: z.ZodDefault<z.ZodNumber>;
64
64
  detail: z.ZodDefault<z.ZodBoolean>;
65
65
  }, "strip", z.ZodTypeAny, {
66
- limit: number;
67
66
  query: string;
68
- minImportance: number;
67
+ limit: number;
69
68
  semantic: boolean;
69
+ minImportance: number;
70
70
  detail: boolean;
71
71
  project?: string | undefined;
72
- type?: "error" | "observation" | "decision" | "learning" | "pattern" | "preference" | undefined;
72
+ type?: "pattern" | "observation" | "decision" | "learning" | "error" | "preference" | undefined;
73
73
  }, {
74
74
  query: string;
75
75
  project?: string | undefined;
76
- type?: "error" | "observation" | "decision" | "learning" | "pattern" | "preference" | undefined;
77
76
  limit?: number | undefined;
78
- minImportance?: number | undefined;
79
77
  semantic?: boolean | undefined;
78
+ type?: "pattern" | "observation" | "decision" | "learning" | "error" | "preference" | undefined;
79
+ minImportance?: number | undefined;
80
80
  detail?: boolean | undefined;
81
81
  }>;
82
82
  export declare const MemoryGetSchema: z.ZodObject<{
@@ -103,30 +103,30 @@ export declare const TaskManageSchema: z.ZodObject<{
103
103
  status: z.ZodOptional<z.ZodEnum<["pending", "in_progress", "done", "blocked"]>>;
104
104
  }, "strip", z.ZodTypeAny, {
105
105
  project: string;
106
- action: "update" | "list" | "add" | "complete";
107
- title?: string | undefined;
108
- status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
106
+ action: "update" | "add" | "list" | "complete";
109
107
  description?: string | undefined;
108
+ title?: string | undefined;
110
109
  taskId?: number | undefined;
111
110
  priority?: number | undefined;
111
+ status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
112
112
  }, {
113
113
  project: string;
114
- action: "update" | "list" | "add" | "complete";
115
- title?: string | undefined;
116
- status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
114
+ action: "update" | "add" | "list" | "complete";
117
115
  description?: string | undefined;
116
+ title?: string | undefined;
118
117
  taskId?: number | undefined;
119
118
  priority?: number | undefined;
119
+ status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
120
120
  }>;
121
121
  export declare const VerifySchema: z.ZodObject<{
122
122
  project: z.ZodString;
123
123
  gates: z.ZodDefault<z.ZodArray<z.ZodEnum<["build", "test", "lint"]>, "many">>;
124
124
  }, "strip", z.ZodTypeAny, {
125
125
  project: string;
126
- gates: ("build" | "test" | "lint")[];
126
+ gates: ("test" | "build" | "lint")[];
127
127
  }, {
128
128
  project: string;
129
- gates?: ("build" | "test" | "lint")[] | undefined;
129
+ gates?: ("test" | "build" | "lint")[] | undefined;
130
130
  }>;
131
131
  export declare const LearnSchema: z.ZodObject<{
132
132
  project: z.ZodString;
@@ -145,32 +145,32 @@ export declare const LearnSchema: z.ZodObject<{
145
145
  toVersion: z.ZodOptional<z.ZodString>;
146
146
  }, "strip", z.ZodTypeAny, {
147
147
  project: string;
148
- type: "decision" | "pattern" | "dependency" | "fix";
149
148
  content: string;
149
+ type: "fix" | "pattern" | "decision" | "dependency";
150
+ solution?: string | undefined;
151
+ action?: "remove" | "add" | "upgrade" | "downgrade" | undefined;
152
+ dependency?: string | undefined;
150
153
  reason?: string | undefined;
151
- alternatives?: string[] | undefined;
152
154
  files?: string[] | undefined;
153
- solution?: string | undefined;
155
+ alternatives?: string[] | undefined;
154
156
  preventionTip?: string | undefined;
155
157
  example?: string | undefined;
156
158
  appliesTo?: string | undefined;
157
- dependency?: string | undefined;
158
- action?: "add" | "remove" | "upgrade" | "downgrade" | undefined;
159
159
  fromVersion?: string | undefined;
160
160
  toVersion?: string | undefined;
161
161
  }, {
162
162
  project: string;
163
- type: "decision" | "pattern" | "dependency" | "fix";
164
163
  content: string;
164
+ type: "fix" | "pattern" | "decision" | "dependency";
165
+ solution?: string | undefined;
166
+ action?: "remove" | "add" | "upgrade" | "downgrade" | undefined;
167
+ dependency?: string | undefined;
165
168
  reason?: string | undefined;
166
- alternatives?: string[] | undefined;
167
169
  files?: string[] | undefined;
168
- solution?: string | undefined;
170
+ alternatives?: string[] | undefined;
169
171
  preventionTip?: string | undefined;
170
172
  example?: string | undefined;
171
173
  appliesTo?: string | undefined;
172
- dependency?: string | undefined;
173
- action?: "add" | "remove" | "upgrade" | "downgrade" | undefined;
174
174
  fromVersion?: string | undefined;
175
175
  toVersion?: string | undefined;
176
176
  }>;
@@ -210,15 +210,15 @@ export declare const ToolSchemas: {
210
210
  project: string;
211
211
  currentState: string;
212
212
  verification?: "passed" | "failed" | undefined;
213
- recentFiles?: string[] | undefined;
214
213
  blockers?: string | undefined;
214
+ recentFiles?: string[] | undefined;
215
215
  architectureDecision?: string | undefined;
216
216
  }, {
217
217
  project: string;
218
218
  currentState: string;
219
219
  verification?: "passed" | "failed" | undefined;
220
- recentFiles?: string[] | undefined;
221
220
  blockers?: string | undefined;
221
+ recentFiles?: string[] | undefined;
222
222
  architectureDecision?: string | undefined;
223
223
  }>;
224
224
  readonly memory_store: z.ZodObject<{
@@ -229,15 +229,15 @@ export declare const ToolSchemas: {
229
229
  importance: z.ZodDefault<z.ZodNumber>;
230
230
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
231
231
  }, "strip", z.ZodTypeAny, {
232
- type: "error" | "observation" | "decision" | "learning" | "pattern" | "preference";
233
232
  content: string;
233
+ type: "pattern" | "observation" | "decision" | "learning" | "error" | "preference";
234
234
  importance: number;
235
235
  project?: string | undefined;
236
236
  tags?: string[] | undefined;
237
237
  metadata?: Record<string, unknown> | undefined;
238
238
  }, {
239
- type: "error" | "observation" | "decision" | "learning" | "pattern" | "preference";
240
239
  content: string;
240
+ type: "pattern" | "observation" | "decision" | "learning" | "error" | "preference";
241
241
  project?: string | undefined;
242
242
  tags?: string[] | undefined;
243
243
  importance?: number | undefined;
@@ -252,20 +252,20 @@ export declare const ToolSchemas: {
252
252
  minImportance: z.ZodDefault<z.ZodNumber>;
253
253
  detail: z.ZodDefault<z.ZodBoolean>;
254
254
  }, "strip", z.ZodTypeAny, {
255
- limit: number;
256
255
  query: string;
257
- minImportance: number;
256
+ limit: number;
258
257
  semantic: boolean;
258
+ minImportance: number;
259
259
  detail: boolean;
260
260
  project?: string | undefined;
261
- type?: "error" | "observation" | "decision" | "learning" | "pattern" | "preference" | undefined;
261
+ type?: "pattern" | "observation" | "decision" | "learning" | "error" | "preference" | undefined;
262
262
  }, {
263
263
  query: string;
264
264
  project?: string | undefined;
265
- type?: "error" | "observation" | "decision" | "learning" | "pattern" | "preference" | undefined;
266
265
  limit?: number | undefined;
267
- minImportance?: number | undefined;
268
266
  semantic?: boolean | undefined;
267
+ type?: "pattern" | "observation" | "decision" | "learning" | "error" | "preference" | undefined;
268
+ minImportance?: number | undefined;
269
269
  detail?: boolean | undefined;
270
270
  }>;
271
271
  readonly memory_get: z.ZodObject<{
@@ -293,30 +293,30 @@ export declare const ToolSchemas: {
293
293
  status: z.ZodOptional<z.ZodEnum<["pending", "in_progress", "done", "blocked"]>>;
294
294
  }, "strip", z.ZodTypeAny, {
295
295
  project: string;
296
- action: "update" | "list" | "add" | "complete";
297
- title?: string | undefined;
298
- status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
296
+ action: "update" | "add" | "list" | "complete";
299
297
  description?: string | undefined;
298
+ title?: string | undefined;
300
299
  taskId?: number | undefined;
301
300
  priority?: number | undefined;
301
+ status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
302
302
  }, {
303
303
  project: string;
304
- action: "update" | "list" | "add" | "complete";
305
- title?: string | undefined;
306
- status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
304
+ action: "update" | "add" | "list" | "complete";
307
305
  description?: string | undefined;
306
+ title?: string | undefined;
308
307
  taskId?: number | undefined;
309
308
  priority?: number | undefined;
309
+ status?: "pending" | "in_progress" | "done" | "blocked" | undefined;
310
310
  }>;
311
311
  readonly verify: z.ZodObject<{
312
312
  project: z.ZodString;
313
313
  gates: z.ZodDefault<z.ZodArray<z.ZodEnum<["build", "test", "lint"]>, "many">>;
314
314
  }, "strip", z.ZodTypeAny, {
315
315
  project: string;
316
- gates: ("build" | "test" | "lint")[];
316
+ gates: ("test" | "build" | "lint")[];
317
317
  }, {
318
318
  project: string;
319
- gates?: ("build" | "test" | "lint")[] | undefined;
319
+ gates?: ("test" | "build" | "lint")[] | undefined;
320
320
  }>;
321
321
  readonly learn: z.ZodObject<{
322
322
  project: z.ZodString;
@@ -335,32 +335,32 @@ export declare const ToolSchemas: {
335
335
  toVersion: z.ZodOptional<z.ZodString>;
336
336
  }, "strip", z.ZodTypeAny, {
337
337
  project: string;
338
- type: "decision" | "pattern" | "dependency" | "fix";
339
338
  content: string;
339
+ type: "fix" | "pattern" | "decision" | "dependency";
340
+ solution?: string | undefined;
341
+ action?: "remove" | "add" | "upgrade" | "downgrade" | undefined;
342
+ dependency?: string | undefined;
340
343
  reason?: string | undefined;
341
- alternatives?: string[] | undefined;
342
344
  files?: string[] | undefined;
343
- solution?: string | undefined;
345
+ alternatives?: string[] | undefined;
344
346
  preventionTip?: string | undefined;
345
347
  example?: string | undefined;
346
348
  appliesTo?: string | undefined;
347
- dependency?: string | undefined;
348
- action?: "add" | "remove" | "upgrade" | "downgrade" | undefined;
349
349
  fromVersion?: string | undefined;
350
350
  toVersion?: string | undefined;
351
351
  }, {
352
352
  project: string;
353
- type: "decision" | "pattern" | "dependency" | "fix";
354
353
  content: string;
354
+ type: "fix" | "pattern" | "decision" | "dependency";
355
+ solution?: string | undefined;
356
+ action?: "remove" | "add" | "upgrade" | "downgrade" | undefined;
357
+ dependency?: string | undefined;
355
358
  reason?: string | undefined;
356
- alternatives?: string[] | undefined;
357
359
  files?: string[] | undefined;
358
- solution?: string | undefined;
360
+ alternatives?: string[] | undefined;
359
361
  preventionTip?: string | undefined;
360
362
  example?: string | undefined;
361
363
  appliesTo?: string | undefined;
362
- dependency?: string | undefined;
363
- action?: "add" | "remove" | "upgrade" | "downgrade" | undefined;
364
364
  fromVersion?: string | undefined;
365
365
  toVersion?: string | undefined;
366
366
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-session-continuity-mcp",
3
- "version": "1.17.0",
3
+ "version": "1.17.2",
4
4
  "description": "Session continuity for Claude Code, OpenAI Codex CLI & Google Gemini CLI - never re-explain your project again. 100% local, zero config, auto context injection.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,8 +21,6 @@
21
21
  "test": "vitest run",
22
22
  "test:watch": "vitest",
23
23
  "test:coverage": "vitest run --coverage",
24
- "dashboard": "node dist/dashboard.js",
25
- "dashboard:v2": "node dist/dashboard-v2.js",
26
24
  "postinstall": "node dist/hooks/install.js install 2>/dev/null || true",
27
25
  "prepublishOnly": "npm run build && npm test"
28
26
  },
@@ -62,7 +60,7 @@
62
60
  "LICENSE"
63
61
  ],
64
62
  "engines": {
65
- "node": ">=18.0.0"
63
+ "node": ">=22.0.0"
66
64
  },
67
65
  "dependencies": {
68
66
  "@modelcontextprotocol/sdk": "^1.0.0",
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Project Manager MCP Dashboard v2
4
- * Modern dashboard with:
5
- * - Tailwind-inspired design (CSS-only, no build step)
6
- * - Real-time updates
7
- * - Project timeline view
8
- * - Memory graph visualization
9
- * - Context snapshot viewer
10
- */
11
- export {};