@zeliper/zscode-mcp-server 1.0.8 โ†’ 2.0.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.
Files changed (43) hide show
  1. package/dist/state/manager.d.ts +240 -2
  2. package/dist/state/manager.d.ts.map +1 -1
  3. package/dist/state/manager.js +1055 -2
  4. package/dist/state/manager.js.map +1 -1
  5. package/dist/state/schema.d.ts +6535 -545
  6. package/dist/state/schema.d.ts.map +1 -1
  7. package/dist/state/schema.js +340 -0
  8. package/dist/state/schema.js.map +1 -1
  9. package/dist/state/types.d.ts +62 -1
  10. package/dist/state/types.d.ts.map +1 -1
  11. package/dist/state/types.js.map +1 -1
  12. package/dist/templates/index.d.ts +79 -0
  13. package/dist/templates/index.d.ts.map +1 -0
  14. package/dist/templates/index.js +472 -0
  15. package/dist/templates/index.js.map +1 -0
  16. package/dist/tools/bulk.d.ts +6 -0
  17. package/dist/tools/bulk.d.ts.map +1 -0
  18. package/dist/tools/bulk.js +273 -0
  19. package/dist/tools/bulk.js.map +1 -0
  20. package/dist/tools/index.d.ts.map +1 -1
  21. package/dist/tools/index.js +15 -0
  22. package/dist/tools/index.js.map +1 -1
  23. package/dist/tools/navigate.d.ts +6 -0
  24. package/dist/tools/navigate.d.ts.map +1 -0
  25. package/dist/tools/navigate.js +334 -0
  26. package/dist/tools/navigate.js.map +1 -0
  27. package/dist/tools/rollback.d.ts +6 -0
  28. package/dist/tools/rollback.d.ts.map +1 -0
  29. package/dist/tools/rollback.js +278 -0
  30. package/dist/tools/rollback.js.map +1 -0
  31. package/dist/tools/search.d.ts +6 -0
  32. package/dist/tools/search.d.ts.map +1 -0
  33. package/dist/tools/search.js +252 -0
  34. package/dist/tools/search.js.map +1 -0
  35. package/dist/tools/template.d.ts +6 -0
  36. package/dist/tools/template.d.ts.map +1 -0
  37. package/dist/tools/template.js +348 -0
  38. package/dist/tools/template.js.map +1 -0
  39. package/dist/utils/format.d.ts +173 -0
  40. package/dist/utils/format.d.ts.map +1 -1
  41. package/dist/utils/format.js +336 -0
  42. package/dist/utils/format.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,334 @@
1
+ import { z } from "zod";
2
+ import { StateManager } from "../state/manager.js";
3
+ import { withErrorHandling, ProjectNotInitializedError, } from "../errors/index.js";
4
+ // ============ Human-Readable Formatters ============
5
+ function formatPlansList(result) {
6
+ const lines = [];
7
+ const { items, pagination } = result;
8
+ lines.push(`๐Ÿ“‹ **Plans** (${pagination.page}/${pagination.totalPages}, total: ${pagination.totalItems})`);
9
+ lines.push("");
10
+ if (items.length === 0) {
11
+ lines.push("No plans found.");
12
+ return lines.join("\n");
13
+ }
14
+ for (const plan of items) {
15
+ const statusIcon = getStatusIcon(plan.status);
16
+ lines.push(`${statusIcon} **${plan.title}** (${plan.id})`);
17
+ lines.push(` Status: ${plan.status} | Stagings: ${plan.stagings.length}`);
18
+ if (plan.description) {
19
+ lines.push(` ${plan.description.substring(0, 80)}${plan.description.length > 80 ? "..." : ""}`);
20
+ }
21
+ lines.push("");
22
+ }
23
+ if (pagination.hasNext) {
24
+ lines.push(`๐Ÿ“„ Next page: ${pagination.page + 1}`);
25
+ }
26
+ return lines.join("\n");
27
+ }
28
+ function formatTasksList(result) {
29
+ const lines = [];
30
+ const { items, pagination } = result;
31
+ lines.push(`โœ… **Tasks** (${pagination.page}/${pagination.totalPages}, total: ${pagination.totalItems})`);
32
+ lines.push("");
33
+ if (items.length === 0) {
34
+ lines.push("No tasks found.");
35
+ return lines.join("\n");
36
+ }
37
+ for (const task of items) {
38
+ const statusIcon = getTaskStatusIcon(task.status);
39
+ const priorityBadge = getPriorityBadge(task.priority);
40
+ lines.push(`${statusIcon} ${task.title} ${priorityBadge}`);
41
+ lines.push(` ID: ${task.id} | Staging: ${task.stagingId}`);
42
+ if (task.model)
43
+ lines.push(` Model: ${task.model}`);
44
+ lines.push("");
45
+ }
46
+ if (pagination.hasNext) {
47
+ lines.push(`๐Ÿ“„ Next page: ${pagination.page + 1}`);
48
+ }
49
+ return lines.join("\n");
50
+ }
51
+ function formatTemplatesList(result) {
52
+ const lines = [];
53
+ const { items, pagination } = result;
54
+ lines.push(`๐Ÿ“„ **Templates** (${pagination.page}/${pagination.totalPages}, total: ${pagination.totalItems})`);
55
+ lines.push("");
56
+ if (items.length === 0) {
57
+ lines.push("No templates found.");
58
+ return lines.join("\n");
59
+ }
60
+ for (const tpl of items) {
61
+ const builtIn = tpl.isBuiltIn ? " โญ" : "";
62
+ lines.push(`๐Ÿ“„ **${tpl.name}**${builtIn} (${tpl.id})`);
63
+ lines.push(` Category: ${tpl.category} | Usage: ${tpl.usageCount} times`);
64
+ if (tpl.description) {
65
+ lines.push(` ${tpl.description.substring(0, 80)}${tpl.description.length > 80 ? "..." : ""}`);
66
+ }
67
+ lines.push("");
68
+ }
69
+ if (pagination.hasNext) {
70
+ lines.push(`๐Ÿ“„ Next page: ${pagination.page + 1}`);
71
+ }
72
+ return lines.join("\n");
73
+ }
74
+ function getStatusIcon(status) {
75
+ switch (status) {
76
+ case "draft": return "๐Ÿ“";
77
+ case "active": return "๐Ÿ”„";
78
+ case "completed": return "โœ…";
79
+ case "archived": return "๐Ÿ“ฆ";
80
+ case "cancelled": return "๐Ÿšซ";
81
+ default: return "โ€ข";
82
+ }
83
+ }
84
+ function getTaskStatusIcon(status) {
85
+ switch (status) {
86
+ case "pending": return "โณ";
87
+ case "in_progress": return "๐Ÿ”„";
88
+ case "done": return "โœ…";
89
+ case "blocked": return "๐Ÿšง";
90
+ case "cancelled": return "๐Ÿšซ";
91
+ default: return "โ€ข";
92
+ }
93
+ }
94
+ function getPriorityBadge(priority) {
95
+ switch (priority) {
96
+ case "high": return "[HIGH]";
97
+ case "low": return "[low]";
98
+ default: return "";
99
+ }
100
+ }
101
+ /**
102
+ * Register navigation/pagination tools for quick browsing
103
+ */
104
+ export function registerNavigateTools(server) {
105
+ // ============ get_plans_paginated ============
106
+ server.tool("get_plans_paginated", "Get plans with pagination support. Fast way to browse through plans.", {
107
+ status: z.enum(["draft", "active", "completed", "archived", "cancelled"]).optional()
108
+ .describe("Filter by status"),
109
+ page: z.number().int().min(1).default(1).describe("Page number (1-indexed)"),
110
+ pageSize: z.number().int().min(1).max(50).default(10).describe("Items per page"),
111
+ sortBy: z.enum(["createdAt", "updatedAt", "title"]).default("updatedAt")
112
+ .describe("Sort field"),
113
+ sortDir: z.enum(["asc", "desc"]).default("desc").describe("Sort direction"),
114
+ }, async (args) => {
115
+ const result = await withErrorHandling(async () => {
116
+ const manager = StateManager.getInstance();
117
+ if (!manager.isInitialized()) {
118
+ throw new ProjectNotInitializedError();
119
+ }
120
+ const paginatedResult = manager.getPlansWithPagination({
121
+ status: args.status,
122
+ page: args.page,
123
+ pageSize: args.pageSize,
124
+ sortBy: args.sortBy,
125
+ sortOrder: args.sortDir,
126
+ });
127
+ return { success: true, result: paginatedResult };
128
+ }, "get_plans_paginated");
129
+ if (result.success) {
130
+ const text = formatPlansList(result.data.result);
131
+ return { content: [{ type: "text", text }] };
132
+ }
133
+ else {
134
+ return {
135
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
136
+ isError: true,
137
+ };
138
+ }
139
+ });
140
+ // ============ get_tasks_paginated ============
141
+ server.tool("get_tasks_paginated", "Get tasks with pagination support. Fast way to browse through tasks.", {
142
+ status: z.enum(["pending", "in_progress", "done", "blocked", "cancelled"]).optional()
143
+ .describe("Filter by status"),
144
+ priority: z.enum(["high", "medium", "low"]).optional().describe("Filter by priority"),
145
+ planId: z.string().optional().describe("Filter by plan ID"),
146
+ stagingId: z.string().optional().describe("Filter by staging ID"),
147
+ page: z.number().int().min(1).default(1).describe("Page number (1-indexed)"),
148
+ pageSize: z.number().int().min(1).max(50).default(10).describe("Items per page"),
149
+ sortBy: z.enum(["createdAt", "updatedAt", "priority", "title"]).default("updatedAt")
150
+ .describe("Sort field"),
151
+ sortDir: z.enum(["asc", "desc"]).default("desc").describe("Sort direction"),
152
+ }, async (args) => {
153
+ const result = await withErrorHandling(async () => {
154
+ const manager = StateManager.getInstance();
155
+ if (!manager.isInitialized()) {
156
+ throw new ProjectNotInitializedError();
157
+ }
158
+ const paginatedResult = manager.getTasksWithPagination({
159
+ status: args.status,
160
+ priority: args.priority,
161
+ planId: args.planId,
162
+ stagingId: args.stagingId,
163
+ page: args.page,
164
+ pageSize: args.pageSize,
165
+ sortBy: args.sortBy,
166
+ sortOrder: args.sortDir,
167
+ });
168
+ return { success: true, result: paginatedResult };
169
+ }, "get_tasks_paginated");
170
+ if (result.success) {
171
+ const text = formatTasksList(result.data.result);
172
+ return { content: [{ type: "text", text }] };
173
+ }
174
+ else {
175
+ return {
176
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
177
+ isError: true,
178
+ };
179
+ }
180
+ });
181
+ // ============ get_templates_paginated ============
182
+ server.tool("get_templates_paginated", "Get templates with pagination support. Fast way to browse through templates.", {
183
+ category: z.enum(["feature", "bugfix", "refactoring", "review", "deployment", "testing", "custom"])
184
+ .optional().describe("Filter by category"),
185
+ page: z.number().int().min(1).default(1).describe("Page number (1-indexed)"),
186
+ pageSize: z.number().int().min(1).max(50).default(10).describe("Items per page"),
187
+ sortBy: z.enum(["createdAt", "updatedAt", "name", "usageCount"]).default("usageCount")
188
+ .describe("Sort field"),
189
+ sortDir: z.enum(["asc", "desc"]).default("desc").describe("Sort direction"),
190
+ }, async (args) => {
191
+ const result = await withErrorHandling(async () => {
192
+ const manager = StateManager.getInstance();
193
+ if (!manager.isInitialized()) {
194
+ throw new ProjectNotInitializedError();
195
+ }
196
+ const paginatedResult = manager.getTemplatesWithPagination({
197
+ category: args.category,
198
+ page: args.page,
199
+ pageSize: args.pageSize,
200
+ sortBy: args.sortBy,
201
+ sortOrder: args.sortDir,
202
+ });
203
+ return { success: true, result: paginatedResult };
204
+ }, "get_templates_paginated");
205
+ if (result.success) {
206
+ const text = formatTemplatesList(result.data.result);
207
+ return { content: [{ type: "text", text }] };
208
+ }
209
+ else {
210
+ return {
211
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
212
+ isError: true,
213
+ };
214
+ }
215
+ });
216
+ // ============ quick_tasks ============
217
+ server.tool("quick_tasks", "Quickly list tasks by common filters without pagination.", {
218
+ filter: z.enum(["pending", "in_progress", "blocked", "high_priority", "recent"])
219
+ .describe("Quick filter preset"),
220
+ limit: z.number().int().min(1).max(50).default(10).describe("Maximum items to return"),
221
+ }, async (args) => {
222
+ const result = await withErrorHandling(async () => {
223
+ const manager = StateManager.getInstance();
224
+ if (!manager.isInitialized()) {
225
+ throw new ProjectNotInitializedError();
226
+ }
227
+ let options = {
228
+ page: 1,
229
+ pageSize: args.limit,
230
+ sortBy: "updatedAt",
231
+ sortDir: "desc",
232
+ };
233
+ switch (args.filter) {
234
+ case "pending":
235
+ options.status = "pending";
236
+ break;
237
+ case "in_progress":
238
+ options.status = "in_progress";
239
+ break;
240
+ case "blocked":
241
+ options.status = "blocked";
242
+ break;
243
+ case "high_priority":
244
+ options.priority = "high";
245
+ break;
246
+ case "recent":
247
+ // Default sort by updatedAt desc
248
+ break;
249
+ }
250
+ const paginatedResult = manager.getTasksWithPagination(options);
251
+ return { success: true, result: paginatedResult, filter: args.filter };
252
+ }, "quick_tasks");
253
+ if (result.success) {
254
+ const lines = [];
255
+ lines.push(`โšก **Quick Tasks: ${result.data.filter}**`);
256
+ lines.push("");
257
+ const items = result.data.result.items;
258
+ if (items.length === 0) {
259
+ lines.push("No tasks found.");
260
+ }
261
+ else {
262
+ for (const task of items) {
263
+ const statusIcon = getTaskStatusIcon(task.status);
264
+ lines.push(`${statusIcon} ${task.title} (${task.id})`);
265
+ }
266
+ }
267
+ return { content: [{ type: "text", text: lines.join("\n") }] };
268
+ }
269
+ else {
270
+ return {
271
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
272
+ isError: true,
273
+ };
274
+ }
275
+ });
276
+ // ============ quick_plans ============
277
+ server.tool("quick_plans", "Quickly list plans by common filters without pagination.", {
278
+ filter: z.enum(["active", "draft", "completed", "recent"])
279
+ .describe("Quick filter preset"),
280
+ limit: z.number().int().min(1).max(20).default(5).describe("Maximum items to return"),
281
+ }, async (args) => {
282
+ const result = await withErrorHandling(async () => {
283
+ const manager = StateManager.getInstance();
284
+ if (!manager.isInitialized()) {
285
+ throw new ProjectNotInitializedError();
286
+ }
287
+ let options = {
288
+ page: 1,
289
+ pageSize: args.limit,
290
+ sortBy: "updatedAt",
291
+ sortDir: "desc",
292
+ };
293
+ switch (args.filter) {
294
+ case "active":
295
+ options.status = "active";
296
+ break;
297
+ case "draft":
298
+ options.status = "draft";
299
+ break;
300
+ case "completed":
301
+ options.status = "completed";
302
+ break;
303
+ case "recent":
304
+ // Default sort by updatedAt desc
305
+ break;
306
+ }
307
+ const paginatedResult = manager.getPlansWithPagination(options);
308
+ return { success: true, result: paginatedResult, filter: args.filter };
309
+ }, "quick_plans");
310
+ if (result.success) {
311
+ const lines = [];
312
+ lines.push(`โšก **Quick Plans: ${result.data.filter}**`);
313
+ lines.push("");
314
+ const items = result.data.result.items;
315
+ if (items.length === 0) {
316
+ lines.push("No plans found.");
317
+ }
318
+ else {
319
+ for (const plan of items) {
320
+ const statusIcon = getStatusIcon(plan.status);
321
+ lines.push(`${statusIcon} ${plan.title} (${plan.id})`);
322
+ }
323
+ }
324
+ return { content: [{ type: "text", text: lines.join("\n") }] };
325
+ }
326
+ else {
327
+ return {
328
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
329
+ isError: true,
330
+ };
331
+ }
332
+ });
333
+ }
334
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register rollback/snapshot-related tools
4
+ */
5
+ export declare function registerRollbackTools(server: McpServer): void;
6
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/tools/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoFpE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwQ7D"}
@@ -0,0 +1,278 @@
1
+ import { z } from "zod";
2
+ import { StateManager } from "../state/manager.js";
3
+ import { withErrorHandling, ProjectNotInitializedError, ValidationError, } from "../errors/index.js";
4
+ // ============ Human-Readable Formatters ============
5
+ function formatSnapshot(snapshot) {
6
+ const lines = [];
7
+ lines.push(`๐Ÿ“ธ **${snapshot.name}** (${snapshot.id})`);
8
+ lines.push(` Type: ${snapshot.type} | Trigger: ${snapshot.trigger}`);
9
+ if (snapshot.description)
10
+ lines.push(` ${snapshot.description}`);
11
+ const dataInfo = [];
12
+ if (snapshot.data.plans)
13
+ dataInfo.push(`${snapshot.data.plans.length} plans`);
14
+ if (snapshot.data.stagings)
15
+ dataInfo.push(`${snapshot.data.stagings.length} stagings`);
16
+ if (snapshot.data.tasks)
17
+ dataInfo.push(`${snapshot.data.tasks.length} tasks`);
18
+ if (snapshot.data.memories)
19
+ dataInfo.push(`${snapshot.data.memories.length} memories`);
20
+ if (snapshot.data.templates)
21
+ dataInfo.push(`${snapshot.data.templates.length} templates`);
22
+ lines.push(` Contains: ${dataInfo.join(", ") || "empty"}`);
23
+ lines.push(` Created: ${new Date(snapshot.createdAt).toLocaleString()}`);
24
+ if (snapshot.expiresAt) {
25
+ lines.push(` Expires: ${new Date(snapshot.expiresAt).toLocaleString()}`);
26
+ }
27
+ return lines.join("\n");
28
+ }
29
+ function formatSnapshotList(snapshots) {
30
+ if (snapshots.length === 0) {
31
+ return "No snapshots found.";
32
+ }
33
+ const lines = [];
34
+ lines.push(`๐Ÿ“ธ **Snapshots** (${snapshots.length})`);
35
+ lines.push("");
36
+ // Group by type
37
+ const byType = new Map();
38
+ for (const s of snapshots) {
39
+ const list = byType.get(s.type) || [];
40
+ list.push(s);
41
+ byType.set(s.type, list);
42
+ }
43
+ for (const [type, snaps] of byType) {
44
+ lines.push(`**${type.charAt(0).toUpperCase() + type.slice(1)}:**`);
45
+ for (const s of snaps) {
46
+ const expired = s.expiresAt && new Date(s.expiresAt) < new Date() ? " โš ๏ธ expired" : "";
47
+ lines.push(` โ€ข ${s.name}${expired} (${s.id})`);
48
+ lines.push(` ${new Date(s.createdAt).toLocaleString()} | ${s.trigger}`);
49
+ }
50
+ lines.push("");
51
+ }
52
+ return lines.join("\n");
53
+ }
54
+ function formatRestoreResult(snapshotId, restoredItems, backupSnapshotId) {
55
+ const lines = [];
56
+ lines.push(`โœ… **Snapshot Restored Successfully**`);
57
+ lines.push(` Snapshot: ${snapshotId}`);
58
+ lines.push("");
59
+ lines.push("**Restored:**");
60
+ for (const [key, count] of Object.entries(restoredItems)) {
61
+ if (count > 0) {
62
+ lines.push(` โ€ข ${key}: ${count}`);
63
+ }
64
+ }
65
+ if (backupSnapshotId) {
66
+ lines.push("");
67
+ lines.push(`โš ๏ธ Backup created: ${backupSnapshotId}`);
68
+ }
69
+ return lines.join("\n");
70
+ }
71
+ /**
72
+ * Register rollback/snapshot-related tools
73
+ */
74
+ export function registerRollbackTools(server) {
75
+ // ============ create_snapshot ============
76
+ server.tool("create_snapshot", "Create a snapshot of current state for backup/rollback purposes.", {
77
+ name: z.string().min(1).describe("Snapshot name"),
78
+ description: z.string().optional().describe("Description of why this snapshot was created"),
79
+ type: z.enum(["full", "plan", "staging"]).default("full").describe("Snapshot type: full (all state), plan (single plan), or staging"),
80
+ trigger: z.enum(["manual", "auto", "pre_operation"]).default("manual").describe("What triggered this snapshot"),
81
+ planId: z.string().optional().describe("Plan ID (required for plan/staging type)"),
82
+ stagingId: z.string().optional().describe("Staging ID (required for staging type)"),
83
+ expiresInDays: z.number().int().min(1).max(365).optional().describe("Expiration in days (optional, default: no expiration)"),
84
+ }, async (args) => {
85
+ const result = await withErrorHandling(async () => {
86
+ const manager = StateManager.getInstance();
87
+ if (!manager.isInitialized()) {
88
+ throw new ProjectNotInitializedError();
89
+ }
90
+ // Validate type-specific requirements
91
+ if ((args.type === "plan" || args.type === "staging") && !args.planId) {
92
+ throw new ValidationError(`planId is required for ${args.type} snapshot type`);
93
+ }
94
+ if (args.type === "staging" && !args.stagingId) {
95
+ throw new ValidationError("stagingId is required for staging snapshot type");
96
+ }
97
+ // Calculate expiration date if provided
98
+ let expiresAt;
99
+ if (args.expiresInDays) {
100
+ const expDate = new Date();
101
+ expDate.setDate(expDate.getDate() + args.expiresInDays);
102
+ expiresAt = expDate.toISOString();
103
+ }
104
+ const snapshot = await manager.createSnapshot({
105
+ name: args.name,
106
+ description: args.description,
107
+ type: args.type,
108
+ trigger: args.trigger,
109
+ planId: args.planId,
110
+ stagingId: args.stagingId,
111
+ expiresAt,
112
+ });
113
+ return { success: true, snapshot };
114
+ }, "create_snapshot");
115
+ if (result.success) {
116
+ const text = `โœ… **Snapshot Created**\n${formatSnapshot(result.data.snapshot)}`;
117
+ return { content: [{ type: "text", text }] };
118
+ }
119
+ else {
120
+ return {
121
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
122
+ isError: true,
123
+ };
124
+ }
125
+ });
126
+ // ============ list_snapshots ============
127
+ server.tool("list_snapshots", "List all snapshots, optionally filtered by type or plan.", {
128
+ type: z.enum(["full", "plan", "staging"]).optional().describe("Filter by snapshot type"),
129
+ planId: z.string().optional().describe("Filter by plan ID"),
130
+ includeExpired: z.boolean().default(false).describe("Include expired snapshots"),
131
+ }, async (args) => {
132
+ const result = await withErrorHandling(async () => {
133
+ const manager = StateManager.getInstance();
134
+ if (!manager.isInitialized()) {
135
+ throw new ProjectNotInitializedError();
136
+ }
137
+ let snapshots = manager.listSnapshots({
138
+ type: args.type,
139
+ planId: args.planId,
140
+ });
141
+ // Filter expired snapshots if not included
142
+ if (!args.includeExpired) {
143
+ const now = new Date();
144
+ snapshots = snapshots.filter(s => !s.expiresAt || new Date(s.expiresAt) >= now);
145
+ }
146
+ return { success: true, snapshots, count: snapshots.length };
147
+ }, "list_snapshots");
148
+ if (result.success) {
149
+ const text = formatSnapshotList(result.data.snapshots);
150
+ return { content: [{ type: "text", text }] };
151
+ }
152
+ else {
153
+ return {
154
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
155
+ isError: true,
156
+ };
157
+ }
158
+ });
159
+ // ============ get_snapshot ============
160
+ server.tool("get_snapshot", "Get detailed information about a specific snapshot.", {
161
+ snapshotId: z.string().describe("Snapshot ID to retrieve"),
162
+ }, async (args) => {
163
+ const result = await withErrorHandling(async () => {
164
+ const manager = StateManager.getInstance();
165
+ if (!manager.isInitialized()) {
166
+ throw new ProjectNotInitializedError();
167
+ }
168
+ const snapshot = manager.getSnapshot(args.snapshotId);
169
+ if (!snapshot) {
170
+ throw new ValidationError(`Snapshot not found: ${args.snapshotId}`);
171
+ }
172
+ return { success: true, snapshot };
173
+ }, "get_snapshot");
174
+ if (result.success) {
175
+ const text = formatSnapshot(result.data.snapshot);
176
+ return { content: [{ type: "text", text }] };
177
+ }
178
+ else {
179
+ return {
180
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
181
+ isError: true,
182
+ };
183
+ }
184
+ });
185
+ // ============ restore_snapshot ============
186
+ server.tool("restore_snapshot", "Restore state from a snapshot. Creates a backup before restoring by default.", {
187
+ snapshotId: z.string().describe("Snapshot ID to restore from"),
188
+ createBackup: z.boolean().default(true).describe("Create a backup snapshot before restoring"),
189
+ restorePlans: z.boolean().default(true).describe("Restore plans"),
190
+ restoreStagings: z.boolean().default(true).describe("Restore stagings"),
191
+ restoreTasks: z.boolean().default(true).describe("Restore tasks"),
192
+ restoreMemories: z.boolean().default(false).describe("Restore memories"),
193
+ restoreTemplates: z.boolean().default(false).describe("Restore templates"),
194
+ }, async (args) => {
195
+ const result = await withErrorHandling(async () => {
196
+ const manager = StateManager.getInstance();
197
+ if (!manager.isInitialized()) {
198
+ throw new ProjectNotInitializedError();
199
+ }
200
+ const restoreResult = await manager.restoreSnapshot(args.snapshotId, {
201
+ createBackup: args.createBackup,
202
+ restorePlans: args.restorePlans,
203
+ restoreStagings: args.restoreStagings,
204
+ restoreTasks: args.restoreTasks,
205
+ restoreMemories: args.restoreMemories,
206
+ restoreTemplates: args.restoreTemplates,
207
+ });
208
+ return {
209
+ success: true,
210
+ snapshotId: args.snapshotId,
211
+ ...restoreResult,
212
+ };
213
+ }, "restore_snapshot");
214
+ if (result.success) {
215
+ const text = formatRestoreResult(result.data.snapshotId, result.data.restoredItems, result.data.backupSnapshotId);
216
+ return { content: [{ type: "text", text }] };
217
+ }
218
+ else {
219
+ return {
220
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
221
+ isError: true,
222
+ };
223
+ }
224
+ });
225
+ // ============ delete_snapshot ============
226
+ server.tool("delete_snapshot", "Delete a snapshot permanently.", {
227
+ snapshotId: z.string().describe("Snapshot ID to delete"),
228
+ }, async (args) => {
229
+ const result = await withErrorHandling(async () => {
230
+ const manager = StateManager.getInstance();
231
+ if (!manager.isInitialized()) {
232
+ throw new ProjectNotInitializedError();
233
+ }
234
+ const snapshot = manager.getSnapshot(args.snapshotId);
235
+ if (!snapshot) {
236
+ throw new ValidationError(`Snapshot not found: ${args.snapshotId}`);
237
+ }
238
+ const snapshotName = snapshot.name;
239
+ await manager.deleteSnapshot(args.snapshotId);
240
+ return { success: true, snapshotName, snapshotId: args.snapshotId };
241
+ }, "delete_snapshot");
242
+ if (result.success) {
243
+ const text = `๐Ÿ—‘๏ธ **Snapshot Deleted**: ${result.data.snapshotName}\n ID: ${result.data.snapshotId}`;
244
+ return { content: [{ type: "text", text }] };
245
+ }
246
+ else {
247
+ return {
248
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
249
+ isError: true,
250
+ };
251
+ }
252
+ });
253
+ // ============ cleanup_snapshots ============
254
+ server.tool("cleanup_snapshots", "Clean up expired snapshots. Returns count of deleted snapshots.", {}, async () => {
255
+ const result = await withErrorHandling(async () => {
256
+ const manager = StateManager.getInstance();
257
+ if (!manager.isInitialized()) {
258
+ throw new ProjectNotInitializedError();
259
+ }
260
+ const deletedCount = await manager.cleanupExpiredSnapshots();
261
+ return { success: true, deletedCount };
262
+ }, "cleanup_snapshots");
263
+ if (result.success) {
264
+ const count = result.data.deletedCount;
265
+ const text = count > 0
266
+ ? `๐Ÿงน **Cleaned Up ${count} Expired Snapshot(s)**`
267
+ : "No expired snapshots to clean up.";
268
+ return { content: [{ type: "text", text }] };
269
+ }
270
+ else {
271
+ return {
272
+ content: [{ type: "text", text: `โŒ ${result.error.message}` }],
273
+ isError: true,
274
+ };
275
+ }
276
+ });
277
+ }
278
+ //# sourceMappingURL=rollback.js.map