@telora/mcp-products 0.22.2 → 0.22.3
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/dist/handlers/focusHandlers.js +1 -9
- package/dist/handlers/focusHandlers.js.map +1 -1
- package/dist/handlers/index.d.ts +0 -5
- package/dist/handlers/index.js +0 -5
- package/dist/handlers/index.js.map +1 -1
- package/dist/index.js +2 -92
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/handlers/componentHandlers.d.ts +0 -3
- package/dist/handlers/componentHandlers.js +0 -128
- package/dist/handlers/componentHandlers.js.map +0 -1
- package/dist/handlers/ideaHandlers.d.ts +0 -3
- package/dist/handlers/ideaHandlers.js +0 -245
- package/dist/handlers/ideaHandlers.js.map +0 -1
- package/dist/handlers/okrHandlers.d.ts +0 -3
- package/dist/handlers/okrHandlers.js +0 -194
- package/dist/handlers/okrHandlers.js.map +0 -1
- package/dist/handlers/pmHandlers.d.ts +0 -3
- package/dist/handlers/pmHandlers.js +0 -441
- package/dist/handlers/pmHandlers.js.map +0 -1
- package/dist/handlers/savePointHandlers.d.ts +0 -3
- package/dist/handlers/savePointHandlers.js +0 -333
- package/dist/handlers/savePointHandlers.js.map +0 -1
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// Save point MCP tool handler (consolidated):
|
|
3
|
-
// telora_save_point (create | list | get | delete | view | close)
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
import { execFileSync } from "node:child_process";
|
|
6
|
-
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import { callProductApi, successResult, validationError, wrapHandler, } from "../shared.js";
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Git helpers (local operations for worktree management)
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
function getRepoPath() {
|
|
14
|
-
const repoPath = process.env.TELORA_REPO_PATH || process.cwd();
|
|
15
|
-
return repoPath;
|
|
16
|
-
}
|
|
17
|
-
function runGit(args, cwd) {
|
|
18
|
-
try {
|
|
19
|
-
const output = execFileSync("git", args, {
|
|
20
|
-
cwd,
|
|
21
|
-
encoding: "utf-8",
|
|
22
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
23
|
-
timeout: 30_000,
|
|
24
|
-
});
|
|
25
|
-
return { success: true, output: output.trim() };
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
const e = err;
|
|
29
|
-
return { success: false, output: "", error: e.stderr || e.message || String(err) };
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function createSavePointWorktree(repoPath, commitSha, savePointId) {
|
|
33
|
-
const worktreeDir = join(repoPath, ".telora", "save-point-worktrees");
|
|
34
|
-
if (!existsSync(worktreeDir)) {
|
|
35
|
-
mkdirSync(worktreeDir, { recursive: true });
|
|
36
|
-
}
|
|
37
|
-
const worktreePath = join(worktreeDir, `sp-${savePointId.slice(0, 8)}`);
|
|
38
|
-
// Clean up if already exists
|
|
39
|
-
if (existsSync(worktreePath)) {
|
|
40
|
-
runGit(["worktree", "remove", "--force", worktreePath], repoPath);
|
|
41
|
-
}
|
|
42
|
-
// Prune stale entries
|
|
43
|
-
runGit(["worktree", "prune"], repoPath);
|
|
44
|
-
// Create worktree with detached HEAD at the commit SHA
|
|
45
|
-
const result = runGit(["worktree", "add", "--detach", worktreePath, commitSha], repoPath);
|
|
46
|
-
if (!result.success) {
|
|
47
|
-
throw new Error(`Failed to create worktree: ${result.error}`);
|
|
48
|
-
}
|
|
49
|
-
return worktreePath;
|
|
50
|
-
}
|
|
51
|
-
function removeSavePointWorktree(repoPath, worktreePath) {
|
|
52
|
-
if (!existsSync(worktreePath)) {
|
|
53
|
-
runGit(["worktree", "prune"], repoPath);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const result = runGit(["worktree", "remove", "--force", worktreePath], repoPath);
|
|
57
|
-
if (!result.success) {
|
|
58
|
-
// Fallback: manual removal
|
|
59
|
-
rmSync(worktreePath, { recursive: true, force: true });
|
|
60
|
-
runGit(["worktree", "prune"], repoPath);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const restoreTokens = new Map();
|
|
64
|
-
const RESTORE_TOKEN_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
65
|
-
function generateRestoreToken(savePointId, commitSha, productId) {
|
|
66
|
-
// Clean expired tokens
|
|
67
|
-
const now = Date.now();
|
|
68
|
-
for (const [key, token] of restoreTokens) {
|
|
69
|
-
if (now - token.createdAt > RESTORE_TOKEN_TTL_MS) {
|
|
70
|
-
restoreTokens.delete(key);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const token = `rst_${savePointId.slice(0, 8)}_${Date.now().toString(36)}`;
|
|
74
|
-
restoreTokens.set(token, { savePointId, commitSha, productId, createdAt: now });
|
|
75
|
-
return token;
|
|
76
|
-
}
|
|
77
|
-
function validateRestoreToken(token, savePointId) {
|
|
78
|
-
const entry = restoreTokens.get(token);
|
|
79
|
-
if (!entry)
|
|
80
|
-
return null;
|
|
81
|
-
if (entry.savePointId !== savePointId)
|
|
82
|
-
return null;
|
|
83
|
-
if (Date.now() - entry.createdAt > RESTORE_TOKEN_TTL_MS) {
|
|
84
|
-
restoreTokens.delete(token);
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
return entry;
|
|
88
|
-
}
|
|
89
|
-
function consumeRestoreToken(token) {
|
|
90
|
-
restoreTokens.delete(token);
|
|
91
|
-
}
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// Tool registration
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
export function registerSavePointTools(server, getCreds) {
|
|
96
|
-
server.tool("telora_save_point", "Product save points: named snapshots of git commits at meaningful moments. " +
|
|
97
|
-
"Save points capture a commit SHA with metadata (name, description) so you can revisit, " +
|
|
98
|
-
"view in a worktree, or restore to that point later. " +
|
|
99
|
-
"Actions: create, list, get, delete, view (create worktree), close (remove worktree), " +
|
|
100
|
-
"restore_preflight (check safety, get token), restore_confirm (execute restore with token).", {
|
|
101
|
-
action: z.enum(["create", "list", "get", "delete", "view", "close", "restore_preflight", "restore_confirm"]).describe("Action to perform"),
|
|
102
|
-
productId: z.string().uuid().optional().describe("Product UUID (required for create, list)"),
|
|
103
|
-
savePointId: z.string().uuid().optional().describe("Save point UUID (required for get, delete, view, close, restore_preflight, restore_confirm)"),
|
|
104
|
-
name: z.string().max(200).optional().describe("Human-readable label, e.g. 'Before auth refactor' (required for create)"),
|
|
105
|
-
commitSha: z.string().regex(/^[0-9a-f]{7,40}$/i, "Must be a valid git SHA (7-40 hex chars)").optional().describe("Full 40-char git SHA (required for create)"),
|
|
106
|
-
description: z.string().max(2000).nullable().optional().describe("Optional longer notes about what this save point captures"),
|
|
107
|
-
restoreToken: z.string().max(100).optional().describe("Token from restore_preflight (required for restore_confirm)"),
|
|
108
|
-
autoSaveCurrent: z.boolean().optional().describe("Create a save point of current HEAD before restoring (restore_confirm)"),
|
|
109
|
-
limit: z.number().int().min(1).max(500).optional().describe("Max results (default 50)"),
|
|
110
|
-
offset: z.number().int().min(0).optional().describe("Skip N results (default 0)"),
|
|
111
|
-
}, wrapHandler(async (params) => {
|
|
112
|
-
switch (params.action) {
|
|
113
|
-
case "create": {
|
|
114
|
-
if (!params.productId)
|
|
115
|
-
return validationError("productId required for create");
|
|
116
|
-
if (!params.name)
|
|
117
|
-
return validationError("name required for create");
|
|
118
|
-
if (!params.commitSha)
|
|
119
|
-
return validationError("commitSha required for create");
|
|
120
|
-
const fields = {
|
|
121
|
-
name: params.name,
|
|
122
|
-
commitSha: params.commitSha,
|
|
123
|
-
};
|
|
124
|
-
if (params.description !== undefined)
|
|
125
|
-
fields.description = params.description;
|
|
126
|
-
const result = await callProductApi(getCreds(), {
|
|
127
|
-
action: "save_point_create",
|
|
128
|
-
productId: params.productId,
|
|
129
|
-
fields,
|
|
130
|
-
});
|
|
131
|
-
return successResult(result.savePoint);
|
|
132
|
-
}
|
|
133
|
-
case "list": {
|
|
134
|
-
if (!params.productId)
|
|
135
|
-
return validationError("productId required for list");
|
|
136
|
-
const body = {
|
|
137
|
-
action: "save_point_list",
|
|
138
|
-
productId: params.productId,
|
|
139
|
-
};
|
|
140
|
-
if (params.limit !== undefined)
|
|
141
|
-
body.limit = params.limit;
|
|
142
|
-
if (params.offset !== undefined)
|
|
143
|
-
body.offset = params.offset;
|
|
144
|
-
const result = await callProductApi(getCreds(), body);
|
|
145
|
-
return successResult({ items: result.savePoints, totalCount: result.totalCount });
|
|
146
|
-
}
|
|
147
|
-
case "get": {
|
|
148
|
-
if (!params.savePointId)
|
|
149
|
-
return validationError("savePointId required for get");
|
|
150
|
-
const result = await callProductApi(getCreds(), {
|
|
151
|
-
action: "save_point_get",
|
|
152
|
-
savePointId: params.savePointId,
|
|
153
|
-
});
|
|
154
|
-
return successResult(result.savePoint);
|
|
155
|
-
}
|
|
156
|
-
case "delete": {
|
|
157
|
-
if (!params.savePointId)
|
|
158
|
-
return validationError("savePointId required for delete");
|
|
159
|
-
await callProductApi(getCreds(), {
|
|
160
|
-
action: "save_point_delete",
|
|
161
|
-
savePointId: params.savePointId,
|
|
162
|
-
});
|
|
163
|
-
return successResult({ deleted: true });
|
|
164
|
-
}
|
|
165
|
-
case "view": {
|
|
166
|
-
if (!params.savePointId)
|
|
167
|
-
return validationError("savePointId required for view");
|
|
168
|
-
// Fetch save point to get commit SHA
|
|
169
|
-
const getResult = await callProductApi(getCreds(), {
|
|
170
|
-
action: "save_point_get",
|
|
171
|
-
savePointId: params.savePointId,
|
|
172
|
-
});
|
|
173
|
-
const sp = getResult.savePoint;
|
|
174
|
-
if (sp.worktreePath) {
|
|
175
|
-
return successResult({
|
|
176
|
-
...sp,
|
|
177
|
-
message: "Worktree already active",
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
// Create worktree locally
|
|
181
|
-
const repoPath = getRepoPath();
|
|
182
|
-
const worktreePath = createSavePointWorktree(repoPath, sp.commitSha, params.savePointId);
|
|
183
|
-
// Update DB with worktree path
|
|
184
|
-
const updateResult = await callProductApi(getCreds(), {
|
|
185
|
-
action: "save_point_update_worktree",
|
|
186
|
-
savePointId: params.savePointId,
|
|
187
|
-
fields: { worktreePath },
|
|
188
|
-
});
|
|
189
|
-
return successResult({
|
|
190
|
-
...updateResult.savePoint,
|
|
191
|
-
message: `Worktree created at ${worktreePath}`,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
case "close": {
|
|
195
|
-
if (!params.savePointId)
|
|
196
|
-
return validationError("savePointId required for close");
|
|
197
|
-
// Fetch save point to get worktree path
|
|
198
|
-
const getResult = await callProductApi(getCreds(), {
|
|
199
|
-
action: "save_point_get",
|
|
200
|
-
savePointId: params.savePointId,
|
|
201
|
-
});
|
|
202
|
-
const sp = getResult.savePoint;
|
|
203
|
-
if (!sp.worktreePath) {
|
|
204
|
-
return successResult({ ...sp, message: "No active worktree" });
|
|
205
|
-
}
|
|
206
|
-
// Remove worktree locally
|
|
207
|
-
const repoPath = getRepoPath();
|
|
208
|
-
removeSavePointWorktree(repoPath, sp.worktreePath);
|
|
209
|
-
// Clear worktree path in DB
|
|
210
|
-
const updateResult = await callProductApi(getCreds(), {
|
|
211
|
-
action: "save_point_update_worktree",
|
|
212
|
-
savePointId: params.savePointId,
|
|
213
|
-
fields: { worktreePath: null },
|
|
214
|
-
});
|
|
215
|
-
return successResult({
|
|
216
|
-
...updateResult.savePoint,
|
|
217
|
-
message: "Worktree removed",
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
case "restore_preflight": {
|
|
221
|
-
if (!params.savePointId)
|
|
222
|
-
return validationError("savePointId required for restore_preflight");
|
|
223
|
-
// Get preflight info from API (active sessions, focuses, worktrees)
|
|
224
|
-
const preflightResult = await callProductApi(getCreds(), {
|
|
225
|
-
action: "save_point_restore_preflight",
|
|
226
|
-
savePointId: params.savePointId,
|
|
227
|
-
});
|
|
228
|
-
const pf = preflightResult.preflight;
|
|
229
|
-
// Generate a restore token
|
|
230
|
-
const token = generateRestoreToken(pf.savePointId, pf.commitSha, pf.productId);
|
|
231
|
-
return successResult({
|
|
232
|
-
...pf,
|
|
233
|
-
restoreToken: token,
|
|
234
|
-
tokenExpiresInSeconds: Math.floor(RESTORE_TOKEN_TTL_MS / 1000),
|
|
235
|
-
message: pf.warnings.length > 0
|
|
236
|
-
? `WARNING: ${pf.warnings.join("; ")}. Pass restoreToken to restore_confirm to proceed.`
|
|
237
|
-
: "No active sessions or agents detected. Pass restoreToken to restore_confirm to proceed.",
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
case "restore_confirm": {
|
|
241
|
-
if (!params.savePointId)
|
|
242
|
-
return validationError("savePointId required for restore_confirm");
|
|
243
|
-
if (!params.restoreToken)
|
|
244
|
-
return validationError("restoreToken required for restore_confirm");
|
|
245
|
-
// Validate the restore token
|
|
246
|
-
const tokenData = validateRestoreToken(params.restoreToken, params.savePointId);
|
|
247
|
-
if (!tokenData) {
|
|
248
|
-
return validationError("Invalid or expired restore token. Run restore_preflight again.");
|
|
249
|
-
}
|
|
250
|
-
const repoPath = getRepoPath();
|
|
251
|
-
const targetSha = tokenData.commitSha;
|
|
252
|
-
// Optionally auto-save current HEAD before restoring
|
|
253
|
-
if (params.autoSaveCurrent) {
|
|
254
|
-
const headResult = runGit(["rev-parse", "HEAD"], repoPath);
|
|
255
|
-
if (headResult.success && headResult.output !== targetSha) {
|
|
256
|
-
try {
|
|
257
|
-
await callProductApi(getCreds(), {
|
|
258
|
-
action: "save_point_create",
|
|
259
|
-
productId: tokenData.productId,
|
|
260
|
-
fields: {
|
|
261
|
-
name: `Auto-save before restore to ${params.savePointId.slice(0, 8)}`,
|
|
262
|
-
commitSha: headResult.output,
|
|
263
|
-
description: `Automatic save of main HEAD before restoring to save point ${params.savePointId}`,
|
|
264
|
-
},
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
catch {
|
|
268
|
-
// Non-fatal: auto-save failure should not block restore
|
|
269
|
-
// (may fail if this SHA already has a save point)
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// Execute restore: reset main to target SHA
|
|
274
|
-
// 1. Fetch the target commit to ensure it exists locally
|
|
275
|
-
const fetchResult = runGit(["fetch", "origin"], repoPath);
|
|
276
|
-
if (!fetchResult.success) {
|
|
277
|
-
return validationError(`Failed to fetch from origin: ${fetchResult.error}`);
|
|
278
|
-
}
|
|
279
|
-
// 2. Checkout main
|
|
280
|
-
const checkoutResult = runGit(["checkout", "main"], repoPath);
|
|
281
|
-
if (!checkoutResult.success) {
|
|
282
|
-
return validationError(`Failed to checkout main: ${checkoutResult.error}`);
|
|
283
|
-
}
|
|
284
|
-
// 3. Reset main to target SHA
|
|
285
|
-
const resetResult = runGit(["reset", "--hard", targetSha], repoPath);
|
|
286
|
-
if (!resetResult.success) {
|
|
287
|
-
return validationError(`Failed to reset main to ${targetSha}: ${resetResult.error}`);
|
|
288
|
-
}
|
|
289
|
-
// 4. Force push main
|
|
290
|
-
const pushResult = runGit(["push", "--force-with-lease", "origin", "main"], repoPath);
|
|
291
|
-
if (!pushResult.success) {
|
|
292
|
-
return validationError(`Failed to push main: ${pushResult.error}`);
|
|
293
|
-
}
|
|
294
|
-
// 5. Sync integration branch to match new main
|
|
295
|
-
const integrationBranch = "integration";
|
|
296
|
-
const intBranchResult = runGit(["branch", "-f", integrationBranch, targetSha], repoPath);
|
|
297
|
-
const intPushResult = intBranchResult.success
|
|
298
|
-
? runGit(["push", "--force-with-lease", "origin", integrationBranch], repoPath)
|
|
299
|
-
: intBranchResult;
|
|
300
|
-
const integrationWarning = !intBranchResult.success || !intPushResult.success
|
|
301
|
-
? `WARNING: Integration branch sync failed: ${intBranchResult.error || intPushResult.error}. Main was restored but integration needs manual sync.`
|
|
302
|
-
: null;
|
|
303
|
-
// Consume the token so it can't be reused
|
|
304
|
-
consumeRestoreToken(params.restoreToken);
|
|
305
|
-
// Record restore completion in DB for audit trail
|
|
306
|
-
try {
|
|
307
|
-
await callProductApi(getCreds(), {
|
|
308
|
-
action: "daemon_update_save_point_restore_status",
|
|
309
|
-
savePointId: params.savePointId,
|
|
310
|
-
fields: {
|
|
311
|
-
restoreStatus: "done",
|
|
312
|
-
restoreCompletedAt: new Date().toISOString(),
|
|
313
|
-
...(integrationWarning ? { restoreError: integrationWarning } : {}),
|
|
314
|
-
},
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
catch {
|
|
318
|
-
// Non-fatal: audit trail failure should not mask a successful restore
|
|
319
|
-
}
|
|
320
|
-
return successResult({
|
|
321
|
-
restored: true,
|
|
322
|
-
commitSha: targetSha,
|
|
323
|
-
message: integrationWarning
|
|
324
|
-
? `Main branch restored to ${targetSha}. ${integrationWarning}`
|
|
325
|
-
: `Main branch restored to ${targetSha}. Integration branch synced.`,
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
default:
|
|
329
|
-
return validationError(`Unknown action: ${params.action}`);
|
|
330
|
-
}
|
|
331
|
-
}));
|
|
332
|
-
}
|
|
333
|
-
//# sourceMappingURL=savePointHandlers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"savePointHandlers.js","sourceRoot":"","sources":["../../src/handlers/savePointHandlers.ts"],"names":[],"mappings":"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"}
|