claude-session-continuity-mcp 1.16.2 → 1.17.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.
- package/README.md +43 -2
- package/dist/hooks/install.js +62 -0
- package/dist/hooks/post-tool-use.js +0 -0
- package/dist/hooks/pre-compact.js +0 -0
- package/dist/hooks/session-end.js +104 -60
- package/dist/hooks/session-start.js +4 -3
- package/dist/hooks/user-prompt-submit.js +0 -0
- package/dist/index.js +0 -0
- package/dist/schemas.d.ts +54 -54
- package/dist/utils/logger.d.ts +10 -2
- package/dist/utils/logger.js +20 -3
- package/package.json +6 -5
- package/dist/dashboard-v2.d.ts +0 -11
- package/dist/dashboard-v2.js +0 -1321
- package/dist/dashboard.d.ts +0 -2
- package/dist/dashboard.js +0 -1196
- package/dist/index-old.d.ts +0 -2
- package/dist/index-old.js +0 -3426
- package/dist/index-v3.d.ts +0 -16
- package/dist/index-v3.js +0 -1024
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
|
-
|
|
67
|
+
limit: number;
|
|
69
68
|
semantic: boolean;
|
|
69
|
+
minImportance: number;
|
|
70
70
|
detail: boolean;
|
|
71
71
|
project?: string | undefined;
|
|
72
|
-
type?: "
|
|
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" | "
|
|
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" | "
|
|
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: ("
|
|
126
|
+
gates: ("test" | "build" | "lint")[];
|
|
127
127
|
}, {
|
|
128
128
|
project: string;
|
|
129
|
-
gates?: ("
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
256
|
+
limit: number;
|
|
258
257
|
semantic: boolean;
|
|
258
|
+
minImportance: number;
|
|
259
259
|
detail: boolean;
|
|
260
260
|
project?: string | undefined;
|
|
261
|
-
type?: "
|
|
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" | "
|
|
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" | "
|
|
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: ("
|
|
316
|
+
gates: ("test" | "build" | "lint")[];
|
|
317
317
|
}, {
|
|
318
318
|
project: string;
|
|
319
|
-
gates?: ("
|
|
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
|
-
|
|
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
|
-
|
|
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/dist/utils/logger.d.ts
CHANGED
|
@@ -37,9 +37,17 @@ export declare function logHookError(hook: string, err: unknown): void;
|
|
|
37
37
|
*/
|
|
38
38
|
export declare function isCodexHost(transcriptPath?: string): boolean;
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* Detect whether the hook is running under Gemini CLI (Google), 2026-07-10.
|
|
41
|
+
* Same two-signal approach as Codex — Gemini's transcript_path can be null/stubbed
|
|
42
|
+
* at SessionStart (google-gemini/gemini-cli#14715), so the installer-injected
|
|
43
|
+
* "--gemini" argv marker is the reliable signal; the ~/.gemini/tmp/.../chats path
|
|
44
|
+
* is the fallback for later events.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isGeminiHost(transcriptPath?: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Emit context to stdout in the host's expected format.
|
|
41
49
|
* - Claude Code injects raw stdout text directly.
|
|
42
|
-
* - Codex CLI
|
|
50
|
+
* - Codex CLI and Gemini CLI both expect {hookSpecificOutput:{hookEventName, additionalContext}}.
|
|
43
51
|
*/
|
|
44
52
|
export declare function emitContext(context: string, hookEventName: string, transcriptPath?: string): void;
|
|
45
53
|
export {};
|
package/dist/utils/logger.js
CHANGED
|
@@ -156,12 +156,29 @@ export function isCodexHost(transcriptPath) {
|
|
|
156
156
|
return transcriptPath.includes('/.codex/sessions/') || /rollout-.*\.jsonl$/.test(transcriptPath);
|
|
157
157
|
}
|
|
158
158
|
/**
|
|
159
|
-
*
|
|
159
|
+
* Detect whether the hook is running under Gemini CLI (Google), 2026-07-10.
|
|
160
|
+
* Same two-signal approach as Codex — Gemini's transcript_path can be null/stubbed
|
|
161
|
+
* at SessionStart (google-gemini/gemini-cli#14715), so the installer-injected
|
|
162
|
+
* "--gemini" argv marker is the reliable signal; the ~/.gemini/tmp/.../chats path
|
|
163
|
+
* is the fallback for later events.
|
|
164
|
+
*/
|
|
165
|
+
export function isGeminiHost(transcriptPath) {
|
|
166
|
+
if (process.argv.includes('--gemini'))
|
|
167
|
+
return true;
|
|
168
|
+
if (!transcriptPath)
|
|
169
|
+
return false;
|
|
170
|
+
// Gemini stores chats at ~/.gemini/tmp/<hash>/chats/*.jsonl. Match that specific
|
|
171
|
+
// path, NOT a bare "/.gemini/" — a Claude session run from a dir containing
|
|
172
|
+
// ".gemini" would otherwise be misclassified (audit-3 2026-07-10 finding).
|
|
173
|
+
return transcriptPath.includes('/.gemini/tmp/');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Emit context to stdout in the host's expected format.
|
|
160
177
|
* - Claude Code injects raw stdout text directly.
|
|
161
|
-
* - Codex CLI
|
|
178
|
+
* - Codex CLI and Gemini CLI both expect {hookSpecificOutput:{hookEventName, additionalContext}}.
|
|
162
179
|
*/
|
|
163
180
|
export function emitContext(context, hookEventName, transcriptPath) {
|
|
164
|
-
if (isCodexHost(transcriptPath)) {
|
|
181
|
+
if (isCodexHost(transcriptPath) || isGeminiHost(transcriptPath)) {
|
|
165
182
|
process.stdout.write(JSON.stringify({
|
|
166
183
|
hookSpecificOutput: { hookEventName, additionalContext: context },
|
|
167
184
|
}));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-session-continuity-mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Session continuity for Claude Code
|
|
3
|
+
"version": "1.17.1",
|
|
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",
|
|
7
7
|
"bin": {
|
|
@@ -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
|
},
|
|
@@ -34,6 +32,9 @@
|
|
|
34
32
|
"codex",
|
|
35
33
|
"codex-cli",
|
|
36
34
|
"openai",
|
|
35
|
+
"gemini",
|
|
36
|
+
"gemini-cli",
|
|
37
|
+
"google",
|
|
37
38
|
"ai",
|
|
38
39
|
"context",
|
|
39
40
|
"memory",
|
|
@@ -59,7 +60,7 @@
|
|
|
59
60
|
"LICENSE"
|
|
60
61
|
],
|
|
61
62
|
"engines": {
|
|
62
|
-
"node": ">=
|
|
63
|
+
"node": ">=22.0.0"
|
|
63
64
|
},
|
|
64
65
|
"dependencies": {
|
|
65
66
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
package/dist/dashboard-v2.d.ts
DELETED
|
@@ -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 {};
|