@ourroadmaps/mcp 0.24.0 → 0.24.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/dist/index.js +1141 -388
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -223,298 +223,368 @@ var updateIdeaSchema = z6.object({
|
|
|
223
223
|
order: z6.number().int().optional()
|
|
224
224
|
});
|
|
225
225
|
var ideaListSchema = z6.array(ideaSchema);
|
|
226
|
-
// ../../packages/shared/src/schemas/
|
|
226
|
+
// ../../packages/shared/src/schemas/presentation.ts
|
|
227
227
|
import { z as z7 } from "zod";
|
|
228
|
-
var
|
|
228
|
+
var presentationSchema = z7.object({
|
|
229
229
|
id: z7.string().uuid(),
|
|
230
230
|
organizationId: z7.string(),
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
name: z7.string(),
|
|
231
|
+
title: z7.string(),
|
|
232
|
+
description: z7.string().nullable(),
|
|
234
233
|
order: z7.number().int(),
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
234
|
+
createdAt: z7.string(),
|
|
235
|
+
createdBy: z7.string(),
|
|
236
|
+
updatedAt: z7.string().nullable()
|
|
237
|
+
});
|
|
238
|
+
var createPresentationSchema = z7.object({
|
|
239
|
+
title: z7.string().min(1),
|
|
240
|
+
description: z7.string().nullable().optional()
|
|
241
|
+
});
|
|
242
|
+
var updatePresentationSchema = z7.object({
|
|
243
|
+
title: z7.string().min(1).optional(),
|
|
244
|
+
description: z7.string().nullable().optional()
|
|
245
|
+
});
|
|
246
|
+
var presentationListSchema = z7.array(presentationSchema);
|
|
247
|
+
// ../../packages/shared/src/schemas/product.ts
|
|
248
|
+
import { z as z8 } from "zod";
|
|
249
|
+
var productSchema = z8.object({
|
|
250
|
+
id: z8.string().uuid(),
|
|
251
|
+
organizationId: z8.string(),
|
|
252
|
+
parentId: z8.string().uuid().nullable(),
|
|
253
|
+
type: productTypeSchema,
|
|
254
|
+
name: z8.string(),
|
|
255
|
+
order: z8.number().int(),
|
|
256
|
+
isExpanded: z8.boolean(),
|
|
257
|
+
deletedAt: z8.string().nullable(),
|
|
258
|
+
createdAt: z8.string()
|
|
238
259
|
});
|
|
239
|
-
var createProductSchema =
|
|
240
|
-
name:
|
|
241
|
-
description:
|
|
260
|
+
var createProductSchema = z8.object({
|
|
261
|
+
name: z8.string().min(1),
|
|
262
|
+
description: z8.string().nullable().optional(),
|
|
242
263
|
type: productTypeSchema,
|
|
243
|
-
parentId:
|
|
264
|
+
parentId: z8.string().uuid().nullable().optional()
|
|
244
265
|
});
|
|
245
|
-
var updateProductSchema =
|
|
246
|
-
name:
|
|
247
|
-
description:
|
|
266
|
+
var updateProductSchema = z8.object({
|
|
267
|
+
name: z8.string().min(1).optional(),
|
|
268
|
+
description: z8.string().nullable().optional(),
|
|
248
269
|
type: productTypeSchema.optional(),
|
|
249
|
-
parentId:
|
|
250
|
-
order:
|
|
270
|
+
parentId: z8.string().uuid().nullable().optional(),
|
|
271
|
+
order: z8.number().int().optional()
|
|
251
272
|
});
|
|
252
|
-
var productListSchema =
|
|
273
|
+
var productListSchema = z8.array(productSchema);
|
|
253
274
|
// ../../packages/shared/src/schemas/roadmap.ts
|
|
254
|
-
import { z as
|
|
275
|
+
import { z as z10 } from "zod";
|
|
255
276
|
|
|
256
277
|
// ../../packages/shared/src/schemas/story.ts
|
|
257
|
-
import { z as
|
|
258
|
-
var epicSchema =
|
|
259
|
-
id:
|
|
260
|
-
roadmapItemId:
|
|
261
|
-
organizationId:
|
|
262
|
-
title:
|
|
263
|
-
description:
|
|
264
|
-
order:
|
|
265
|
-
createdAt:
|
|
266
|
-
updatedAt:
|
|
267
|
-
deletedAt:
|
|
278
|
+
import { z as z9 } from "zod";
|
|
279
|
+
var epicSchema = z9.object({
|
|
280
|
+
id: z9.string().uuid(),
|
|
281
|
+
roadmapItemId: z9.string().uuid(),
|
|
282
|
+
organizationId: z9.string(),
|
|
283
|
+
title: z9.string(),
|
|
284
|
+
description: z9.string().nullable(),
|
|
285
|
+
order: z9.number().int(),
|
|
286
|
+
createdAt: z9.string(),
|
|
287
|
+
updatedAt: z9.string(),
|
|
288
|
+
deletedAt: z9.string().nullable()
|
|
268
289
|
});
|
|
269
|
-
var storySchema =
|
|
270
|
-
id:
|
|
271
|
-
roadmapItemId:
|
|
272
|
-
epicId:
|
|
273
|
-
organizationId:
|
|
274
|
-
title:
|
|
275
|
-
description:
|
|
276
|
-
order:
|
|
277
|
-
createdAt:
|
|
278
|
-
updatedAt:
|
|
279
|
-
deletedAt:
|
|
290
|
+
var storySchema = z9.object({
|
|
291
|
+
id: z9.string().uuid(),
|
|
292
|
+
roadmapItemId: z9.string().uuid(),
|
|
293
|
+
epicId: z9.string().uuid().nullable(),
|
|
294
|
+
organizationId: z9.string(),
|
|
295
|
+
title: z9.string(),
|
|
296
|
+
description: z9.string().nullable(),
|
|
297
|
+
order: z9.number().int(),
|
|
298
|
+
createdAt: z9.string(),
|
|
299
|
+
updatedAt: z9.string(),
|
|
300
|
+
deletedAt: z9.string().nullable()
|
|
280
301
|
});
|
|
281
302
|
var epicWithStoriesSchema = epicSchema.extend({
|
|
282
|
-
stories:
|
|
283
|
-
});
|
|
284
|
-
var createEpicSchema =
|
|
285
|
-
title:
|
|
286
|
-
description:
|
|
287
|
-
});
|
|
288
|
-
var createStorySchema =
|
|
289
|
-
title:
|
|
290
|
-
description:
|
|
291
|
-
});
|
|
292
|
-
var saveStoriesInputSchema =
|
|
293
|
-
epics:
|
|
294
|
-
title:
|
|
295
|
-
description:
|
|
296
|
-
stories:
|
|
297
|
-
title:
|
|
298
|
-
description:
|
|
303
|
+
stories: z9.array(storySchema)
|
|
304
|
+
});
|
|
305
|
+
var createEpicSchema = z9.object({
|
|
306
|
+
title: z9.string().min(1),
|
|
307
|
+
description: z9.string().nullable().optional()
|
|
308
|
+
});
|
|
309
|
+
var createStorySchema = z9.object({
|
|
310
|
+
title: z9.string().min(1),
|
|
311
|
+
description: z9.string().nullable().optional()
|
|
312
|
+
});
|
|
313
|
+
var saveStoriesInputSchema = z9.object({
|
|
314
|
+
epics: z9.array(z9.object({
|
|
315
|
+
title: z9.string().min(1),
|
|
316
|
+
description: z9.string().nullable().optional(),
|
|
317
|
+
stories: z9.array(z9.object({
|
|
318
|
+
title: z9.string().min(1),
|
|
319
|
+
description: z9.string().nullable().optional()
|
|
299
320
|
})).optional().default([])
|
|
300
321
|
})).optional().default([]),
|
|
301
|
-
stories:
|
|
302
|
-
title:
|
|
303
|
-
description:
|
|
322
|
+
stories: z9.array(z9.object({
|
|
323
|
+
title: z9.string().min(1),
|
|
324
|
+
description: z9.string().nullable().optional()
|
|
304
325
|
})).optional().default([])
|
|
305
326
|
});
|
|
306
|
-
var updateEpicSchema =
|
|
307
|
-
title:
|
|
308
|
-
description:
|
|
327
|
+
var updateEpicSchema = z9.object({
|
|
328
|
+
title: z9.string().min(1).optional(),
|
|
329
|
+
description: z9.string().nullable().optional()
|
|
309
330
|
});
|
|
310
|
-
var updateStorySchema =
|
|
311
|
-
title:
|
|
312
|
-
description:
|
|
313
|
-
epicId:
|
|
331
|
+
var updateStorySchema = z9.object({
|
|
332
|
+
title: z9.string().min(1).optional(),
|
|
333
|
+
description: z9.string().nullable().optional(),
|
|
334
|
+
epicId: z9.string().uuid().nullable().optional()
|
|
314
335
|
});
|
|
315
|
-
var reorderStoriesSchema =
|
|
316
|
-
epicOrder:
|
|
317
|
-
storyOrder:
|
|
318
|
-
standaloneOrder:
|
|
336
|
+
var reorderStoriesSchema = z9.object({
|
|
337
|
+
epicOrder: z9.array(z9.string().uuid()).optional(),
|
|
338
|
+
storyOrder: z9.record(z9.string(), z9.array(z9.string().uuid())).optional(),
|
|
339
|
+
standaloneOrder: z9.array(z9.string().uuid()).optional()
|
|
319
340
|
});
|
|
320
341
|
|
|
321
342
|
// ../../packages/shared/src/schemas/roadmap.ts
|
|
322
|
-
var flexibleDateSchema =
|
|
323
|
-
value:
|
|
343
|
+
var flexibleDateSchema = z10.object({
|
|
344
|
+
value: z10.string(),
|
|
324
345
|
granularity: dateGranularitySchema
|
|
325
346
|
});
|
|
326
|
-
var labelSchema =
|
|
327
|
-
id:
|
|
328
|
-
type:
|
|
329
|
-
name:
|
|
330
|
-
color:
|
|
331
|
-
address:
|
|
347
|
+
var labelSchema = z10.object({
|
|
348
|
+
id: z10.string().uuid(),
|
|
349
|
+
type: z10.enum(["category", "location", "label"]),
|
|
350
|
+
name: z10.string(),
|
|
351
|
+
color: z10.string().nullable(),
|
|
352
|
+
address: z10.string().nullable()
|
|
332
353
|
});
|
|
333
|
-
var appSchema =
|
|
334
|
-
id:
|
|
335
|
-
name:
|
|
354
|
+
var appSchema = z10.object({
|
|
355
|
+
id: z10.string().uuid(),
|
|
356
|
+
name: z10.string()
|
|
336
357
|
});
|
|
337
|
-
var roadmapSchema =
|
|
338
|
-
id:
|
|
339
|
-
organizationId:
|
|
340
|
-
title:
|
|
358
|
+
var roadmapSchema = z10.object({
|
|
359
|
+
id: z10.string().uuid(),
|
|
360
|
+
organizationId: z10.string(),
|
|
361
|
+
title: z10.string(),
|
|
341
362
|
horizon: horizonSchema.nullable(),
|
|
342
363
|
status: roadmapStatusSchema.nullable(),
|
|
343
364
|
value: effortSchema.nullable(),
|
|
344
365
|
effort: effortSchema.nullable(),
|
|
345
|
-
order:
|
|
346
|
-
estimatedSeconds:
|
|
366
|
+
order: z10.number().int(),
|
|
367
|
+
estimatedSeconds: z10.number().int().nullable(),
|
|
347
368
|
date: flexibleDateSchema.nullable(),
|
|
348
369
|
target: flexibleDateSchema.nullable(),
|
|
349
|
-
completedAt:
|
|
350
|
-
createdAt:
|
|
351
|
-
createdBy:
|
|
352
|
-
prompt:
|
|
353
|
-
labels:
|
|
354
|
-
apps:
|
|
370
|
+
completedAt: z10.string().nullable(),
|
|
371
|
+
createdAt: z10.string(),
|
|
372
|
+
createdBy: z10.string(),
|
|
373
|
+
prompt: z10.string().nullable(),
|
|
374
|
+
labels: z10.array(labelSchema),
|
|
375
|
+
apps: z10.array(appSchema)
|
|
355
376
|
});
|
|
356
|
-
var createRoadmapSchema =
|
|
357
|
-
title:
|
|
377
|
+
var createRoadmapSchema = z10.object({
|
|
378
|
+
title: z10.string().min(1),
|
|
358
379
|
status: roadmapStatusSchema.optional(),
|
|
359
380
|
horizon: horizonSchema.optional(),
|
|
360
381
|
value: effortSchema.nullable().optional(),
|
|
361
382
|
effort: effortSchema.nullable().optional(),
|
|
362
|
-
estimatedSeconds:
|
|
383
|
+
estimatedSeconds: z10.number().int().nullable().optional(),
|
|
363
384
|
date: flexibleDateSchema.nullable().optional(),
|
|
364
385
|
target: flexibleDateSchema.nullable().optional(),
|
|
365
|
-
prompt:
|
|
366
|
-
brainstormNotes:
|
|
386
|
+
prompt: z10.string().nullable().optional(),
|
|
387
|
+
brainstormNotes: z10.string().nullable().optional()
|
|
367
388
|
});
|
|
368
|
-
var updateRoadmapSchema =
|
|
369
|
-
title:
|
|
389
|
+
var updateRoadmapSchema = z10.object({
|
|
390
|
+
title: z10.string().min(1).optional(),
|
|
370
391
|
status: roadmapStatusSchema.optional(),
|
|
371
392
|
horizon: horizonSchema.optional(),
|
|
372
393
|
value: effortSchema.nullable().optional(),
|
|
373
394
|
effort: effortSchema.nullable().optional(),
|
|
374
|
-
order:
|
|
375
|
-
estimatedSeconds:
|
|
395
|
+
order: z10.number().int().optional(),
|
|
396
|
+
estimatedSeconds: z10.number().int().nullable().optional(),
|
|
376
397
|
date: flexibleDateSchema.nullable().optional(),
|
|
377
398
|
target: flexibleDateSchema.nullable().optional(),
|
|
378
|
-
prompt:
|
|
379
|
-
brainstormNotes:
|
|
399
|
+
prompt: z10.string().nullable().optional(),
|
|
400
|
+
brainstormNotes: z10.string().nullable().optional()
|
|
380
401
|
});
|
|
381
|
-
var prdOutcomeSchema =
|
|
382
|
-
id:
|
|
383
|
-
description:
|
|
402
|
+
var prdOutcomeSchema = z10.object({
|
|
403
|
+
id: z10.string().uuid(),
|
|
404
|
+
description: z10.string(),
|
|
384
405
|
status: prdStatusSchema,
|
|
385
|
-
order:
|
|
386
|
-
completedAt:
|
|
406
|
+
order: z10.number().int(),
|
|
407
|
+
completedAt: z10.string().nullable()
|
|
387
408
|
});
|
|
388
|
-
var prdSchema =
|
|
389
|
-
id:
|
|
390
|
-
what:
|
|
391
|
-
why:
|
|
392
|
-
outcomes:
|
|
409
|
+
var prdSchema = z10.object({
|
|
410
|
+
id: z10.string().uuid(),
|
|
411
|
+
what: z10.string().nullable(),
|
|
412
|
+
why: z10.string().nullable(),
|
|
413
|
+
outcomes: z10.array(prdOutcomeSchema)
|
|
393
414
|
});
|
|
394
|
-
var savePrdInputSchema =
|
|
395
|
-
what:
|
|
396
|
-
why:
|
|
415
|
+
var savePrdInputSchema = z10.object({
|
|
416
|
+
what: z10.string().nullable(),
|
|
417
|
+
why: z10.string().nullable(),
|
|
397
418
|
status: prdStatusSchema,
|
|
398
|
-
outcomes:
|
|
399
|
-
id:
|
|
400
|
-
description:
|
|
401
|
-
order:
|
|
419
|
+
outcomes: z10.array(z10.object({
|
|
420
|
+
id: z10.string().uuid().optional(),
|
|
421
|
+
description: z10.string(),
|
|
422
|
+
order: z10.number().int().min(0)
|
|
402
423
|
}))
|
|
403
424
|
});
|
|
404
|
-
var brainstormMediaSchema =
|
|
405
|
-
id:
|
|
406
|
-
mediaUrl:
|
|
425
|
+
var brainstormMediaSchema = z10.object({
|
|
426
|
+
id: z10.string().uuid(),
|
|
427
|
+
mediaUrl: z10.string(),
|
|
407
428
|
mediaType: brainstormMediaTypeSchema,
|
|
408
|
-
description:
|
|
409
|
-
order:
|
|
410
|
-
createdAt:
|
|
429
|
+
description: z10.string().nullable(),
|
|
430
|
+
order: z10.number().int(),
|
|
431
|
+
createdAt: z10.string()
|
|
411
432
|
});
|
|
412
|
-
var wireframeSchema =
|
|
413
|
-
id:
|
|
414
|
-
description:
|
|
415
|
-
imageUrl:
|
|
416
|
-
order:
|
|
433
|
+
var wireframeSchema = z10.object({
|
|
434
|
+
id: z10.string().uuid(),
|
|
435
|
+
description: z10.string().nullable(),
|
|
436
|
+
imageUrl: z10.string().nullable(),
|
|
437
|
+
order: z10.number().int()
|
|
417
438
|
});
|
|
418
|
-
var prototypeSchema =
|
|
419
|
-
id:
|
|
420
|
-
publicUrl:
|
|
421
|
-
expiresAt:
|
|
422
|
-
fileCount:
|
|
423
|
-
entryPoint:
|
|
424
|
-
createdAt:
|
|
439
|
+
var prototypeSchema = z10.object({
|
|
440
|
+
id: z10.string().uuid(),
|
|
441
|
+
publicUrl: z10.string().url(),
|
|
442
|
+
expiresAt: z10.string().datetime(),
|
|
443
|
+
fileCount: z10.number().int().positive(),
|
|
444
|
+
entryPoint: z10.string(),
|
|
445
|
+
createdAt: z10.string().datetime()
|
|
425
446
|
});
|
|
426
|
-
var featureLinkSchema =
|
|
427
|
-
id:
|
|
428
|
-
featureId:
|
|
429
|
-
feature:
|
|
430
|
-
id:
|
|
431
|
-
name:
|
|
432
|
-
type:
|
|
447
|
+
var featureLinkSchema = z10.object({
|
|
448
|
+
id: z10.string().uuid(),
|
|
449
|
+
featureId: z10.string().uuid(),
|
|
450
|
+
feature: z10.object({
|
|
451
|
+
id: z10.string().uuid(),
|
|
452
|
+
name: z10.string(),
|
|
453
|
+
type: z10.enum(["area", "feature"])
|
|
433
454
|
}),
|
|
434
|
-
createdAt:
|
|
455
|
+
createdAt: z10.string()
|
|
435
456
|
});
|
|
436
|
-
var phaseDesignSchema =
|
|
437
|
-
id:
|
|
438
|
-
description:
|
|
457
|
+
var phaseDesignSchema = z10.object({
|
|
458
|
+
id: z10.string().uuid(),
|
|
459
|
+
description: z10.string().nullable()
|
|
439
460
|
});
|
|
440
|
-
var phasePlanSchema =
|
|
441
|
-
id:
|
|
442
|
-
description:
|
|
461
|
+
var phasePlanSchema = z10.object({
|
|
462
|
+
id: z10.string().uuid(),
|
|
463
|
+
description: z10.string().nullable()
|
|
443
464
|
});
|
|
444
|
-
var phaseBuildSchema =
|
|
445
|
-
id:
|
|
446
|
-
description:
|
|
447
|
-
prompt:
|
|
465
|
+
var phaseBuildSchema = z10.object({
|
|
466
|
+
id: z10.string().uuid(),
|
|
467
|
+
description: z10.string().nullable(),
|
|
468
|
+
prompt: z10.string().nullable()
|
|
448
469
|
});
|
|
449
|
-
var phaseReleaseSchema =
|
|
450
|
-
id:
|
|
451
|
-
description:
|
|
470
|
+
var phaseReleaseSchema = z10.object({
|
|
471
|
+
id: z10.string().uuid(),
|
|
472
|
+
description: z10.string().nullable()
|
|
452
473
|
});
|
|
453
474
|
var roadmapDetailSchema = roadmapSchema.extend({
|
|
454
475
|
prd: prdSchema.nullable(),
|
|
455
|
-
wireframes:
|
|
456
|
-
prototypes:
|
|
457
|
-
brainstormMedia:
|
|
458
|
-
brainstormNotes:
|
|
459
|
-
featureLinks:
|
|
460
|
-
epics:
|
|
461
|
-
stories:
|
|
476
|
+
wireframes: z10.array(wireframeSchema),
|
|
477
|
+
prototypes: z10.array(prototypeSchema),
|
|
478
|
+
brainstormMedia: z10.array(brainstormMediaSchema),
|
|
479
|
+
brainstormNotes: z10.string().nullable(),
|
|
480
|
+
featureLinks: z10.array(featureLinkSchema),
|
|
481
|
+
epics: z10.array(epicWithStoriesSchema),
|
|
482
|
+
stories: z10.array(storySchema),
|
|
462
483
|
design: phaseDesignSchema.nullable(),
|
|
463
484
|
plan: phasePlanSchema.nullable(),
|
|
464
485
|
build: phaseBuildSchema.nullable(),
|
|
465
486
|
release: phaseReleaseSchema.nullable(),
|
|
466
|
-
exports:
|
|
487
|
+
exports: z10.array(exportSchema)
|
|
467
488
|
});
|
|
468
|
-
var roadmapListSchema =
|
|
489
|
+
var roadmapListSchema = z10.array(roadmapSchema);
|
|
469
490
|
// ../../packages/shared/src/schemas/scenario.ts
|
|
470
|
-
import { z as
|
|
471
|
-
var scenarioSchema =
|
|
472
|
-
id:
|
|
473
|
-
title:
|
|
474
|
-
given:
|
|
475
|
-
when:
|
|
476
|
-
then:
|
|
477
|
-
order:
|
|
478
|
-
createdAt:
|
|
479
|
-
updatedAt:
|
|
491
|
+
import { z as z11 } from "zod";
|
|
492
|
+
var scenarioSchema = z11.object({
|
|
493
|
+
id: z11.string().uuid(),
|
|
494
|
+
title: z11.string().min(1),
|
|
495
|
+
given: z11.string().nullable(),
|
|
496
|
+
when: z11.string().nullable(),
|
|
497
|
+
then: z11.string().nullable(),
|
|
498
|
+
order: z11.number().int(),
|
|
499
|
+
createdAt: z11.string().datetime(),
|
|
500
|
+
updatedAt: z11.string().datetime()
|
|
480
501
|
});
|
|
481
|
-
var createScenarioSchema =
|
|
482
|
-
title:
|
|
483
|
-
given:
|
|
484
|
-
when:
|
|
485
|
-
then:
|
|
486
|
-
roadmapId:
|
|
502
|
+
var createScenarioSchema = z11.object({
|
|
503
|
+
title: z11.string().min(1),
|
|
504
|
+
given: z11.string().nullable().optional(),
|
|
505
|
+
when: z11.string().nullable().optional(),
|
|
506
|
+
then: z11.string().nullable().optional(),
|
|
507
|
+
roadmapId: z11.string().uuid()
|
|
487
508
|
});
|
|
488
|
-
var updateScenarioSchema =
|
|
489
|
-
title:
|
|
490
|
-
given:
|
|
491
|
-
when:
|
|
492
|
-
then:
|
|
493
|
-
order:
|
|
509
|
+
var updateScenarioSchema = z11.object({
|
|
510
|
+
title: z11.string().min(1).optional(),
|
|
511
|
+
given: z11.string().nullable().optional(),
|
|
512
|
+
when: z11.string().nullable().optional(),
|
|
513
|
+
then: z11.string().nullable().optional(),
|
|
514
|
+
order: z11.number().int().optional()
|
|
515
|
+
});
|
|
516
|
+
var scenarioListSchema = z11.array(scenarioSchema);
|
|
517
|
+
// ../../packages/shared/src/schemas/slide.ts
|
|
518
|
+
import { z as z12 } from "zod";
|
|
519
|
+
var slideContentSchema = z12.object({
|
|
520
|
+
body: z12.string().optional()
|
|
521
|
+
});
|
|
522
|
+
var slideSchema = z12.object({
|
|
523
|
+
id: z12.string().uuid(),
|
|
524
|
+
variantId: z12.string().uuid(),
|
|
525
|
+
title: z12.string(),
|
|
526
|
+
content: slideContentSchema.nullable(),
|
|
527
|
+
speakerNotes: z12.string().nullable(),
|
|
528
|
+
order: z12.number().int(),
|
|
529
|
+
createdAt: z12.string(),
|
|
530
|
+
createdBy: z12.string(),
|
|
531
|
+
updatedAt: z12.string().nullable()
|
|
494
532
|
});
|
|
495
|
-
var
|
|
533
|
+
var createSlideSchema = z12.object({
|
|
534
|
+
title: z12.string().optional(),
|
|
535
|
+
content: slideContentSchema.nullable().optional(),
|
|
536
|
+
speakerNotes: z12.string().nullable().optional()
|
|
537
|
+
});
|
|
538
|
+
var updateSlideSchema = z12.object({
|
|
539
|
+
title: z12.string().optional(),
|
|
540
|
+
content: slideContentSchema.nullable().optional(),
|
|
541
|
+
speakerNotes: z12.string().nullable().optional()
|
|
542
|
+
});
|
|
543
|
+
var slideListSchema = z12.array(slideSchema);
|
|
496
544
|
// ../../packages/shared/src/schemas/status-update.ts
|
|
497
|
-
import { z as
|
|
498
|
-
var statusUpdateItemSchema =
|
|
499
|
-
id:
|
|
500
|
-
roadmapItemId:
|
|
501
|
-
titleAtSnapshot:
|
|
502
|
-
statusAtSnapshot:
|
|
503
|
-
designWalkthroughUrl:
|
|
504
|
-
releaseWalkthroughUrl:
|
|
545
|
+
import { z as z13 } from "zod";
|
|
546
|
+
var statusUpdateItemSchema = z13.object({
|
|
547
|
+
id: z13.string().uuid(),
|
|
548
|
+
roadmapItemId: z13.string().uuid(),
|
|
549
|
+
titleAtSnapshot: z13.string(),
|
|
550
|
+
statusAtSnapshot: z13.string(),
|
|
551
|
+
designWalkthroughUrl: z13.string().nullable(),
|
|
552
|
+
releaseWalkthroughUrl: z13.string().nullable()
|
|
505
553
|
});
|
|
506
|
-
var statusUpdateSchema =
|
|
507
|
-
id:
|
|
508
|
-
title:
|
|
509
|
-
startDate:
|
|
510
|
-
endDate:
|
|
511
|
-
content:
|
|
512
|
-
createdAt:
|
|
513
|
-
items:
|
|
514
|
-
});
|
|
515
|
-
var statusUpdateListSchema =
|
|
554
|
+
var statusUpdateSchema = z13.object({
|
|
555
|
+
id: z13.string().uuid(),
|
|
556
|
+
title: z13.string().nullable(),
|
|
557
|
+
startDate: z13.string(),
|
|
558
|
+
endDate: z13.string(),
|
|
559
|
+
content: z13.string(),
|
|
560
|
+
createdAt: z13.string(),
|
|
561
|
+
items: z13.array(statusUpdateItemSchema).optional()
|
|
562
|
+
});
|
|
563
|
+
var statusUpdateListSchema = z13.array(statusUpdateSchema);
|
|
564
|
+
// ../../packages/shared/src/schemas/variant.ts
|
|
565
|
+
import { z as z14 } from "zod";
|
|
566
|
+
var variantSchema = z14.object({
|
|
567
|
+
id: z14.string().uuid(),
|
|
568
|
+
presentationId: z14.string().uuid(),
|
|
569
|
+
name: z14.string(),
|
|
570
|
+
audienceId: z14.string().uuid().nullable(),
|
|
571
|
+
isDefault: z14.boolean(),
|
|
572
|
+
order: z14.number().int(),
|
|
573
|
+
createdAt: z14.string(),
|
|
574
|
+
createdBy: z14.string(),
|
|
575
|
+
updatedAt: z14.string().nullable()
|
|
576
|
+
});
|
|
577
|
+
var createVariantSchema = z14.object({
|
|
578
|
+
name: z14.string().min(1),
|
|
579
|
+
audienceId: z14.string().uuid().nullable().optional()
|
|
580
|
+
});
|
|
581
|
+
var updateVariantSchema = z14.object({
|
|
582
|
+
name: z14.string().min(1).optional(),
|
|
583
|
+
audienceId: z14.string().uuid().nullable().optional()
|
|
584
|
+
});
|
|
585
|
+
var variantListSchema = z14.array(variantSchema);
|
|
516
586
|
// src/tools/index.ts
|
|
517
|
-
import { z as
|
|
587
|
+
import { z as z15 } from "zod";
|
|
518
588
|
|
|
519
589
|
// src/auth.ts
|
|
520
590
|
function getCredentials() {
|
|
@@ -1050,6 +1120,121 @@ class ApiClient {
|
|
|
1050
1120
|
async deleteExport(id) {
|
|
1051
1121
|
await this.request(`/v1/exports/${id}`, { method: "DELETE" });
|
|
1052
1122
|
}
|
|
1123
|
+
async listPresentations() {
|
|
1124
|
+
const response = await this.request("/v1/presentations");
|
|
1125
|
+
return { items: response.data, total: response.data.length };
|
|
1126
|
+
}
|
|
1127
|
+
async getPresentation(id) {
|
|
1128
|
+
const response = await this.request(`/v1/presentations/${id}`);
|
|
1129
|
+
return response.data;
|
|
1130
|
+
}
|
|
1131
|
+
async createPresentation(data) {
|
|
1132
|
+
const response = await this.request("/v1/presentations", {
|
|
1133
|
+
method: "POST",
|
|
1134
|
+
body: JSON.stringify(data)
|
|
1135
|
+
});
|
|
1136
|
+
return response.data;
|
|
1137
|
+
}
|
|
1138
|
+
async updatePresentation(id, data) {
|
|
1139
|
+
const response = await this.request(`/v1/presentations/${id}`, {
|
|
1140
|
+
method: "PATCH",
|
|
1141
|
+
body: JSON.stringify(data)
|
|
1142
|
+
});
|
|
1143
|
+
return response.data;
|
|
1144
|
+
}
|
|
1145
|
+
async deletePresentation(id) {
|
|
1146
|
+
await this.request(`/v1/presentations/${id}`, { method: "DELETE" });
|
|
1147
|
+
}
|
|
1148
|
+
async reorderPresentations(items) {
|
|
1149
|
+
await this.request("/v1/presentations/reorder", {
|
|
1150
|
+
method: "POST",
|
|
1151
|
+
body: JSON.stringify({ items })
|
|
1152
|
+
});
|
|
1153
|
+
}
|
|
1154
|
+
async listVariants(presentationId) {
|
|
1155
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants`);
|
|
1156
|
+
return { items: response.data, total: response.data.length };
|
|
1157
|
+
}
|
|
1158
|
+
async getVariant(presentationId, variantId) {
|
|
1159
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}`);
|
|
1160
|
+
return response.data;
|
|
1161
|
+
}
|
|
1162
|
+
async createVariant(presentationId, data) {
|
|
1163
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants`, {
|
|
1164
|
+
method: "POST",
|
|
1165
|
+
body: JSON.stringify(data)
|
|
1166
|
+
});
|
|
1167
|
+
return response.data;
|
|
1168
|
+
}
|
|
1169
|
+
async updateVariant(presentationId, variantId, data) {
|
|
1170
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}`, {
|
|
1171
|
+
method: "PATCH",
|
|
1172
|
+
body: JSON.stringify(data)
|
|
1173
|
+
});
|
|
1174
|
+
return response.data;
|
|
1175
|
+
}
|
|
1176
|
+
async deleteVariant(presentationId, variantId) {
|
|
1177
|
+
await this.request(`/v1/presentations/${presentationId}/variants/${variantId}`, {
|
|
1178
|
+
method: "DELETE"
|
|
1179
|
+
});
|
|
1180
|
+
}
|
|
1181
|
+
async reorderVariants(presentationId, items) {
|
|
1182
|
+
await this.request(`/v1/presentations/${presentationId}/variants/reorder`, {
|
|
1183
|
+
method: "POST",
|
|
1184
|
+
body: JSON.stringify({ items })
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
async cloneVariant(presentationId, variantId) {
|
|
1188
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/clone`, { method: "POST" });
|
|
1189
|
+
return response.data;
|
|
1190
|
+
}
|
|
1191
|
+
async setDefaultVariant(presentationId, variantId) {
|
|
1192
|
+
await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/set-default`, {
|
|
1193
|
+
method: "POST"
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
async listSlides(presentationId, variantId) {
|
|
1197
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides`);
|
|
1198
|
+
return { items: response.data, total: response.data.length };
|
|
1199
|
+
}
|
|
1200
|
+
async getSlide(presentationId, variantId, slideId) {
|
|
1201
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides/${slideId}`);
|
|
1202
|
+
return response.data;
|
|
1203
|
+
}
|
|
1204
|
+
async createSlide(presentationId, variantId, data) {
|
|
1205
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides`, {
|
|
1206
|
+
method: "POST",
|
|
1207
|
+
body: JSON.stringify(data)
|
|
1208
|
+
});
|
|
1209
|
+
return response.data;
|
|
1210
|
+
}
|
|
1211
|
+
async updateSlide(presentationId, variantId, slideId, data) {
|
|
1212
|
+
const response = await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides/${slideId}`, {
|
|
1213
|
+
method: "PATCH",
|
|
1214
|
+
body: JSON.stringify(data)
|
|
1215
|
+
});
|
|
1216
|
+
return response.data;
|
|
1217
|
+
}
|
|
1218
|
+
async deleteSlide(presentationId, variantId, slideId) {
|
|
1219
|
+
await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides/${slideId}`, { method: "DELETE" });
|
|
1220
|
+
}
|
|
1221
|
+
async reorderSlides(presentationId, variantId, items) {
|
|
1222
|
+
await this.request(`/v1/presentations/${presentationId}/variants/${variantId}/slides/reorder`, {
|
|
1223
|
+
method: "POST",
|
|
1224
|
+
body: JSON.stringify({ items })
|
|
1225
|
+
});
|
|
1226
|
+
}
|
|
1227
|
+
async getVariantPresentationId(variantId) {
|
|
1228
|
+
const presentations = await this.listPresentations();
|
|
1229
|
+
for (const presentation2 of presentations.items) {
|
|
1230
|
+
const variants = await this.listVariants(presentation2.id);
|
|
1231
|
+
const found = variants.items.find((v) => v.id === variantId);
|
|
1232
|
+
if (found) {
|
|
1233
|
+
return presentation2.id;
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
return null;
|
|
1237
|
+
}
|
|
1053
1238
|
}
|
|
1054
1239
|
var client = null;
|
|
1055
1240
|
function getApiClient() {
|
|
@@ -1139,6 +1324,26 @@ function registerAllTools(server) {
|
|
|
1139
1324
|
registerCreateExport(server);
|
|
1140
1325
|
registerUpdateExport(server);
|
|
1141
1326
|
registerDeleteExport(server);
|
|
1327
|
+
registerListPresentations(server);
|
|
1328
|
+
registerGetPresentation(server);
|
|
1329
|
+
registerCreatePresentation(server);
|
|
1330
|
+
registerUpdatePresentation(server);
|
|
1331
|
+
registerDeletePresentation(server);
|
|
1332
|
+
registerReorderPresentations(server);
|
|
1333
|
+
registerListVariants(server);
|
|
1334
|
+
registerGetVariant(server);
|
|
1335
|
+
registerCreateVariant(server);
|
|
1336
|
+
registerUpdateVariant(server);
|
|
1337
|
+
registerDeleteVariant(server);
|
|
1338
|
+
registerReorderVariants(server);
|
|
1339
|
+
registerCloneVariant(server);
|
|
1340
|
+
registerSetDefaultVariant(server);
|
|
1341
|
+
registerListSlides(server);
|
|
1342
|
+
registerGetSlide(server);
|
|
1343
|
+
registerCreateSlide(server);
|
|
1344
|
+
registerUpdateSlide(server);
|
|
1345
|
+
registerDeleteSlide(server);
|
|
1346
|
+
registerReorderSlides(server);
|
|
1142
1347
|
}
|
|
1143
1348
|
function registerGetWorkflows(server) {
|
|
1144
1349
|
server.registerTool("get_workflows", {
|
|
@@ -1161,13 +1366,13 @@ function registerSearchRoadmaps(server) {
|
|
|
1161
1366
|
server.registerTool("search_roadmaps", {
|
|
1162
1367
|
description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
|
|
1163
1368
|
inputSchema: {
|
|
1164
|
-
query:
|
|
1369
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1165
1370
|
status: roadmapStatusSchema.optional().describe("Filter by status"),
|
|
1166
1371
|
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
1167
|
-
phase:
|
|
1168
|
-
phaseStep:
|
|
1169
|
-
limit:
|
|
1170
|
-
offset:
|
|
1372
|
+
phase: z15.string().optional().describe("Filter by phase"),
|
|
1373
|
+
phaseStep: z15.string().optional().describe("Filter by phase step"),
|
|
1374
|
+
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
1375
|
+
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
1171
1376
|
}
|
|
1172
1377
|
}, async ({
|
|
1173
1378
|
query,
|
|
@@ -1218,7 +1423,7 @@ function registerGetRoadmap(server) {
|
|
|
1218
1423
|
server.registerTool("get_roadmap", {
|
|
1219
1424
|
description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
|
|
1220
1425
|
inputSchema: {
|
|
1221
|
-
id:
|
|
1426
|
+
id: z15.string().describe("The UUID of the roadmap item")
|
|
1222
1427
|
}
|
|
1223
1428
|
}, async ({ id }) => {
|
|
1224
1429
|
const client2 = getApiClient();
|
|
@@ -1272,7 +1477,7 @@ function registerSearchFeatures(server) {
|
|
|
1272
1477
|
server.registerTool("search_features", {
|
|
1273
1478
|
description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
|
|
1274
1479
|
inputSchema: {
|
|
1275
|
-
query:
|
|
1480
|
+
query: z15.string().optional().describe("Search query to match against name"),
|
|
1276
1481
|
type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
|
|
1277
1482
|
}
|
|
1278
1483
|
}, async ({ query, type }) => {
|
|
@@ -1304,7 +1509,7 @@ function registerGetFeature(server) {
|
|
|
1304
1509
|
server.registerTool("get_feature", {
|
|
1305
1510
|
description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
|
|
1306
1511
|
inputSchema: {
|
|
1307
|
-
id:
|
|
1512
|
+
id: z15.string().describe("The UUID of the feature")
|
|
1308
1513
|
}
|
|
1309
1514
|
}, async ({ id }) => {
|
|
1310
1515
|
const client2 = getApiClient();
|
|
@@ -1343,7 +1548,7 @@ function registerSearchIdeas(server) {
|
|
|
1343
1548
|
server.registerTool("search_ideas", {
|
|
1344
1549
|
description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
|
|
1345
1550
|
inputSchema: {
|
|
1346
|
-
query:
|
|
1551
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1347
1552
|
status: ideaStatusSchema.optional().describe("Filter by status")
|
|
1348
1553
|
}
|
|
1349
1554
|
}, async ({ query, status }) => {
|
|
@@ -1443,9 +1648,9 @@ function registerCaptureIdea(server) {
|
|
|
1443
1648
|
server.registerTool("capture_idea", {
|
|
1444
1649
|
description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
|
|
1445
1650
|
inputSchema: {
|
|
1446
|
-
title:
|
|
1447
|
-
description:
|
|
1448
|
-
source:
|
|
1651
|
+
title: z15.string().describe("Title of the idea"),
|
|
1652
|
+
description: z15.string().optional().describe("Detailed description of the idea"),
|
|
1653
|
+
source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
|
|
1449
1654
|
}
|
|
1450
1655
|
}, async ({
|
|
1451
1656
|
title,
|
|
@@ -1482,16 +1687,16 @@ function registerCreateRoadmapItem(server) {
|
|
|
1482
1687
|
server.registerTool("create_roadmap_item", {
|
|
1483
1688
|
description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
|
|
1484
1689
|
inputSchema: {
|
|
1485
|
-
title:
|
|
1690
|
+
title: z15.string().describe("Title of the roadmap item"),
|
|
1486
1691
|
status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
|
|
1487
1692
|
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
1488
|
-
phase:
|
|
1489
|
-
phaseStep:
|
|
1490
|
-
initiativeId:
|
|
1693
|
+
phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
|
|
1694
|
+
phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
|
|
1695
|
+
initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
|
|
1491
1696
|
dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1492
|
-
dateValue:
|
|
1697
|
+
dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1493
1698
|
targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1494
|
-
targetValue:
|
|
1699
|
+
targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
1495
1700
|
}
|
|
1496
1701
|
}, async ({
|
|
1497
1702
|
title,
|
|
@@ -1553,30 +1758,30 @@ function registerCreateRoadmapItem(server) {
|
|
|
1553
1758
|
};
|
|
1554
1759
|
});
|
|
1555
1760
|
}
|
|
1556
|
-
var effortSizeSchema =
|
|
1761
|
+
var effortSizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
|
|
1557
1762
|
function registerUpdateRoadmapItem(server) {
|
|
1558
1763
|
server.registerTool("update_roadmap_item", {
|
|
1559
1764
|
description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
|
|
1560
1765
|
inputSchema: {
|
|
1561
|
-
id:
|
|
1562
|
-
title:
|
|
1766
|
+
id: z15.string().describe("The UUID of the roadmap item to update"),
|
|
1767
|
+
title: z15.string().optional().describe("New title"),
|
|
1563
1768
|
status: roadmapStatusSchema.optional().describe("New status"),
|
|
1564
1769
|
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
1565
|
-
phase:
|
|
1566
|
-
phaseStep:
|
|
1567
|
-
value:
|
|
1770
|
+
phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
|
|
1771
|
+
phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
|
|
1772
|
+
value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
|
|
1568
1773
|
effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
|
|
1569
|
-
order:
|
|
1570
|
-
initiativeId:
|
|
1571
|
-
designDescription:
|
|
1572
|
-
planDescription:
|
|
1573
|
-
buildDescription:
|
|
1574
|
-
releaseDescription:
|
|
1575
|
-
prompt:
|
|
1774
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
|
|
1775
|
+
initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
|
|
1776
|
+
designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
|
|
1777
|
+
planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
|
|
1778
|
+
buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
|
|
1779
|
+
releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
|
|
1780
|
+
prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
|
|
1576
1781
|
dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1577
|
-
dateValue:
|
|
1782
|
+
dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1578
1783
|
targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1579
|
-
targetValue:
|
|
1784
|
+
targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
1580
1785
|
}
|
|
1581
1786
|
}, async ({
|
|
1582
1787
|
id,
|
|
@@ -1687,12 +1892,12 @@ function registerAddFeature(server) {
|
|
|
1687
1892
|
server.registerTool("add_feature", {
|
|
1688
1893
|
description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
|
|
1689
1894
|
inputSchema: {
|
|
1690
|
-
name:
|
|
1691
|
-
description:
|
|
1895
|
+
name: z15.string().describe("Name of the feature"),
|
|
1896
|
+
description: z15.string().optional().describe("Description of the feature"),
|
|
1692
1897
|
type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
|
|
1693
|
-
parentId:
|
|
1694
|
-
outcomes:
|
|
1695
|
-
linkToRoadmapId:
|
|
1898
|
+
parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
|
|
1899
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
|
|
1900
|
+
linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
|
|
1696
1901
|
}
|
|
1697
1902
|
}, async ({
|
|
1698
1903
|
name,
|
|
@@ -1739,10 +1944,10 @@ function registerSavePrd(server) {
|
|
|
1739
1944
|
server.registerTool("save_prd", {
|
|
1740
1945
|
description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
|
|
1741
1946
|
inputSchema: {
|
|
1742
|
-
roadmapId:
|
|
1743
|
-
what:
|
|
1744
|
-
why:
|
|
1745
|
-
outcomes:
|
|
1947
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
1948
|
+
what: z15.string().nullable().describe("What is being built - the feature description"),
|
|
1949
|
+
why: z15.string().nullable().describe("Why this is being built - the business justification"),
|
|
1950
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
|
|
1746
1951
|
}
|
|
1747
1952
|
}, async ({
|
|
1748
1953
|
roadmapId,
|
|
@@ -1780,8 +1985,8 @@ function registerUpdateBrainstormNotes(server) {
|
|
|
1780
1985
|
server.registerTool("update_brainstorm_notes", {
|
|
1781
1986
|
description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
|
|
1782
1987
|
inputSchema: {
|
|
1783
|
-
roadmapId:
|
|
1784
|
-
notes:
|
|
1988
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
1989
|
+
notes: z15.string().describe("The brainstorm notes content")
|
|
1785
1990
|
}
|
|
1786
1991
|
}, async ({ roadmapId, notes }) => {
|
|
1787
1992
|
const client2 = getApiClient();
|
|
@@ -1810,7 +2015,7 @@ function registerDeleteRoadmapItem(server) {
|
|
|
1810
2015
|
server.registerTool("delete_roadmap_item", {
|
|
1811
2016
|
description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
|
|
1812
2017
|
inputSchema: {
|
|
1813
|
-
id:
|
|
2018
|
+
id: z15.string().describe("The UUID of the roadmap item to delete")
|
|
1814
2019
|
}
|
|
1815
2020
|
}, async ({ id }) => {
|
|
1816
2021
|
const client2 = getApiClient();
|
|
@@ -1832,9 +2037,9 @@ function registerReorderRoadmaps(server) {
|
|
|
1832
2037
|
server.registerTool("reorder_roadmaps", {
|
|
1833
2038
|
description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
|
|
1834
2039
|
inputSchema: {
|
|
1835
|
-
items:
|
|
1836
|
-
id:
|
|
1837
|
-
order:
|
|
2040
|
+
items: z15.array(z15.object({
|
|
2041
|
+
id: z15.string().describe("The UUID of the roadmap item"),
|
|
2042
|
+
order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
|
|
1838
2043
|
})).describe("Array of roadmap items with their new order values")
|
|
1839
2044
|
}
|
|
1840
2045
|
}, async ({ items }) => {
|
|
@@ -1858,10 +2063,10 @@ function registerUpdateFeature(server) {
|
|
|
1858
2063
|
server.registerTool("update_feature", {
|
|
1859
2064
|
description: "Update an existing feature. Can update name, type, or parent.",
|
|
1860
2065
|
inputSchema: {
|
|
1861
|
-
id:
|
|
1862
|
-
name:
|
|
2066
|
+
id: z15.string().describe("The UUID of the feature to update"),
|
|
2067
|
+
name: z15.string().optional().describe("New name for the feature"),
|
|
1863
2068
|
type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
|
|
1864
|
-
parentId:
|
|
2069
|
+
parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
|
|
1865
2070
|
}
|
|
1866
2071
|
}, async ({
|
|
1867
2072
|
id,
|
|
@@ -1900,7 +2105,7 @@ function registerDeleteFeature(server) {
|
|
|
1900
2105
|
server.registerTool("delete_feature", {
|
|
1901
2106
|
description: "Delete a feature. This is a soft delete that also deletes all child features.",
|
|
1902
2107
|
inputSchema: {
|
|
1903
|
-
id:
|
|
2108
|
+
id: z15.string().describe("The UUID of the feature to delete")
|
|
1904
2109
|
}
|
|
1905
2110
|
}, async ({ id }) => {
|
|
1906
2111
|
const client2 = getApiClient();
|
|
@@ -1922,7 +2127,7 @@ function registerGetIdea(server) {
|
|
|
1922
2127
|
server.registerTool("get_idea", {
|
|
1923
2128
|
description: "Get full details of a single idea by ID.",
|
|
1924
2129
|
inputSchema: {
|
|
1925
|
-
id:
|
|
2130
|
+
id: z15.string().describe("The UUID of the idea")
|
|
1926
2131
|
}
|
|
1927
2132
|
}, async ({ id }) => {
|
|
1928
2133
|
const client2 = getApiClient();
|
|
@@ -1951,12 +2156,12 @@ function registerUpdateIdea(server) {
|
|
|
1951
2156
|
server.registerTool("update_idea", {
|
|
1952
2157
|
description: "Update an existing idea. Can update title, description, status, value, or effort.",
|
|
1953
2158
|
inputSchema: {
|
|
1954
|
-
id:
|
|
1955
|
-
title:
|
|
1956
|
-
description:
|
|
2159
|
+
id: z15.string().describe("The UUID of the idea to update"),
|
|
2160
|
+
title: z15.string().optional().describe("New title"),
|
|
2161
|
+
description: z15.string().nullable().optional().describe("New description"),
|
|
1957
2162
|
status: ideaStatusSchema.optional().describe("New status"),
|
|
1958
|
-
value:
|
|
1959
|
-
effort:
|
|
2163
|
+
value: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
|
|
2164
|
+
effort: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
|
|
1960
2165
|
}
|
|
1961
2166
|
}, async ({
|
|
1962
2167
|
id,
|
|
@@ -2003,7 +2208,7 @@ function registerDeleteIdea(server) {
|
|
|
2003
2208
|
server.registerTool("delete_idea", {
|
|
2004
2209
|
description: "Delete an idea. This is a soft delete.",
|
|
2005
2210
|
inputSchema: {
|
|
2006
|
-
id:
|
|
2211
|
+
id: z15.string().describe("The UUID of the idea to delete")
|
|
2007
2212
|
}
|
|
2008
2213
|
}, async ({ id }) => {
|
|
2009
2214
|
const client2 = getApiClient();
|
|
@@ -2042,8 +2247,8 @@ function registerUpdateStrategy(server) {
|
|
|
2042
2247
|
server.registerTool("update_strategy", {
|
|
2043
2248
|
description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
|
|
2044
2249
|
inputSchema: {
|
|
2045
|
-
vision:
|
|
2046
|
-
mission:
|
|
2250
|
+
vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
|
|
2251
|
+
mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
|
|
2047
2252
|
}
|
|
2048
2253
|
}, async ({ vision, mission }) => {
|
|
2049
2254
|
const client2 = getApiClient();
|
|
@@ -2091,8 +2296,8 @@ function registerCreateScenario(server) {
|
|
|
2091
2296
|
server.registerTool("create_scenario", {
|
|
2092
2297
|
description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
|
|
2093
2298
|
inputSchema: {
|
|
2094
|
-
title:
|
|
2095
|
-
description:
|
|
2299
|
+
title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
|
|
2300
|
+
description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
|
|
2096
2301
|
}
|
|
2097
2302
|
}, async ({ title, description }) => {
|
|
2098
2303
|
const client2 = getApiClient();
|
|
@@ -2121,9 +2326,9 @@ function registerUpdateScenario(server) {
|
|
|
2121
2326
|
server.registerTool("update_scenario", {
|
|
2122
2327
|
description: "Update an existing scenario.",
|
|
2123
2328
|
inputSchema: {
|
|
2124
|
-
id:
|
|
2125
|
-
title:
|
|
2126
|
-
description:
|
|
2329
|
+
id: z15.string().describe("The UUID of the scenario to update"),
|
|
2330
|
+
title: z15.string().optional().describe("New title"),
|
|
2331
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
2127
2332
|
}
|
|
2128
2333
|
}, async ({
|
|
2129
2334
|
id,
|
|
@@ -2158,7 +2363,7 @@ function registerDeleteScenario(server) {
|
|
|
2158
2363
|
server.registerTool("delete_scenario", {
|
|
2159
2364
|
description: "Delete a scenario. This is a soft delete.",
|
|
2160
2365
|
inputSchema: {
|
|
2161
|
-
id:
|
|
2366
|
+
id: z15.string().describe("The UUID of the scenario to delete")
|
|
2162
2367
|
}
|
|
2163
2368
|
}, async ({ id }) => {
|
|
2164
2369
|
const client2 = getApiClient();
|
|
@@ -2173,7 +2378,7 @@ function registerDeleteScenario(server) {
|
|
|
2173
2378
|
};
|
|
2174
2379
|
});
|
|
2175
2380
|
}
|
|
2176
|
-
var productTypeSchema2 =
|
|
2381
|
+
var productTypeSchema2 = z15.enum([
|
|
2177
2382
|
"brand",
|
|
2178
2383
|
"product",
|
|
2179
2384
|
"app",
|
|
@@ -2186,8 +2391,8 @@ function registerCreateProduct(server) {
|
|
|
2186
2391
|
description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
|
|
2187
2392
|
inputSchema: {
|
|
2188
2393
|
type: productTypeSchema2.describe("Type of product"),
|
|
2189
|
-
name:
|
|
2190
|
-
parentId:
|
|
2394
|
+
name: z15.string().describe("Name of the product"),
|
|
2395
|
+
parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
|
|
2191
2396
|
}
|
|
2192
2397
|
}, async ({
|
|
2193
2398
|
type,
|
|
@@ -2222,9 +2427,9 @@ function registerUpdateProduct(server) {
|
|
|
2222
2427
|
server.registerTool("update_product", {
|
|
2223
2428
|
description: "Update an existing product.",
|
|
2224
2429
|
inputSchema: {
|
|
2225
|
-
id:
|
|
2226
|
-
name:
|
|
2227
|
-
parentId:
|
|
2430
|
+
id: z15.string().describe("The UUID of the product to update"),
|
|
2431
|
+
name: z15.string().optional().describe("New name"),
|
|
2432
|
+
parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
|
|
2228
2433
|
}
|
|
2229
2434
|
}, async ({ id, name, parentId }) => {
|
|
2230
2435
|
const client2 = getApiClient();
|
|
@@ -2256,7 +2461,7 @@ function registerDeleteProduct(server) {
|
|
|
2256
2461
|
server.registerTool("delete_product", {
|
|
2257
2462
|
description: "Delete a product. This is a soft delete that also deletes all child products.",
|
|
2258
2463
|
inputSchema: {
|
|
2259
|
-
id:
|
|
2464
|
+
id: z15.string().describe("The UUID of the product to delete")
|
|
2260
2465
|
}
|
|
2261
2466
|
}, async ({ id }) => {
|
|
2262
2467
|
const client2 = getApiClient();
|
|
@@ -2279,7 +2484,7 @@ function registerGetProduct(server) {
|
|
|
2279
2484
|
server.registerTool("get_product", {
|
|
2280
2485
|
description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
|
|
2281
2486
|
inputSchema: {
|
|
2282
|
-
id:
|
|
2487
|
+
id: z15.string().describe("The UUID of the product")
|
|
2283
2488
|
}
|
|
2284
2489
|
}, async ({ id }) => {
|
|
2285
2490
|
const client2 = getApiClient();
|
|
@@ -2316,7 +2521,7 @@ function registerSearchProducts(server) {
|
|
|
2316
2521
|
server.registerTool("search_products", {
|
|
2317
2522
|
description: "Search for products by name. Returns a list of matching products with basic info.",
|
|
2318
2523
|
inputSchema: {
|
|
2319
|
-
query:
|
|
2524
|
+
query: z15.string().optional().describe("Search query to match against product name"),
|
|
2320
2525
|
type: productTypeSchema2.optional().describe("Filter by product type")
|
|
2321
2526
|
}
|
|
2322
2527
|
}, async ({ query, type }) => {
|
|
@@ -2351,7 +2556,7 @@ function registerGetProductDocumentation(server) {
|
|
|
2351
2556
|
server.registerTool("get_product_documentation", {
|
|
2352
2557
|
description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
|
|
2353
2558
|
inputSchema: {
|
|
2354
|
-
productId:
|
|
2559
|
+
productId: z15.string().describe("The UUID of the product")
|
|
2355
2560
|
}
|
|
2356
2561
|
}, async ({ productId }) => {
|
|
2357
2562
|
const client2 = getApiClient();
|
|
@@ -2379,9 +2584,9 @@ function registerUpdateProductDocumentation(server) {
|
|
|
2379
2584
|
server.registerTool("update_product_documentation", {
|
|
2380
2585
|
description: "Update the documentation for a product. Use this to keep design system and ADRs up to date. Creates documentation if it does not exist.",
|
|
2381
2586
|
inputSchema: {
|
|
2382
|
-
productId:
|
|
2383
|
-
designSystem:
|
|
2384
|
-
adrs:
|
|
2587
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
2588
|
+
designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
|
|
2589
|
+
adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
|
|
2385
2590
|
}
|
|
2386
2591
|
}, async ({
|
|
2387
2592
|
productId,
|
|
@@ -2418,8 +2623,8 @@ function registerCreateAudience(server) {
|
|
|
2418
2623
|
server.registerTool("create_audience", {
|
|
2419
2624
|
description: "Create a new audience member. Audiences represent who the product serves.",
|
|
2420
2625
|
inputSchema: {
|
|
2421
|
-
name:
|
|
2422
|
-
description:
|
|
2626
|
+
name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
|
|
2627
|
+
description: z15.string().nullable().optional().describe("Description of the audience")
|
|
2423
2628
|
}
|
|
2424
2629
|
}, async ({ name, description }) => {
|
|
2425
2630
|
const client2 = getApiClient();
|
|
@@ -2448,9 +2653,9 @@ function registerUpdateAudience(server) {
|
|
|
2448
2653
|
server.registerTool("update_audience", {
|
|
2449
2654
|
description: "Update an existing audience member.",
|
|
2450
2655
|
inputSchema: {
|
|
2451
|
-
id:
|
|
2452
|
-
name:
|
|
2453
|
-
description:
|
|
2656
|
+
id: z15.string().describe("The UUID of the audience to update"),
|
|
2657
|
+
name: z15.string().optional().describe("New name"),
|
|
2658
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
2454
2659
|
}
|
|
2455
2660
|
}, async ({
|
|
2456
2661
|
id,
|
|
@@ -2485,7 +2690,7 @@ function registerDeleteAudience(server) {
|
|
|
2485
2690
|
server.registerTool("delete_audience", {
|
|
2486
2691
|
description: "Delete an audience member. This is a soft delete.",
|
|
2487
2692
|
inputSchema: {
|
|
2488
|
-
id:
|
|
2693
|
+
id: z15.string().describe("The UUID of the audience to delete")
|
|
2489
2694
|
}
|
|
2490
2695
|
}, async ({ id }) => {
|
|
2491
2696
|
const client2 = getApiClient();
|
|
@@ -2527,9 +2732,9 @@ function registerGetHistory(server) {
|
|
|
2527
2732
|
server.registerTool("get_history", {
|
|
2528
2733
|
description: "Get raw history events for a date range. Returns full event details including payloads. " + "Use entityType or entityId filters to narrow results. For status reports, prefer " + "get_history_summary to avoid context overflow.",
|
|
2529
2734
|
inputSchema: {
|
|
2530
|
-
startDate:
|
|
2531
|
-
endDate:
|
|
2532
|
-
entityType:
|
|
2735
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2736
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
|
|
2737
|
+
entityType: z15.enum([
|
|
2533
2738
|
"roadmap",
|
|
2534
2739
|
"feature",
|
|
2535
2740
|
"idea",
|
|
@@ -2561,8 +2766,8 @@ function registerGetHistorySummary(server) {
|
|
|
2561
2766
|
server.registerTool("get_history_summary", {
|
|
2562
2767
|
description: "Get a summary of history events for a date range. Returns counts by entity type, " + "list of changed entities with titles, and total event count. Use this for status " + "report generation instead of get_history to avoid context overflow.",
|
|
2563
2768
|
inputSchema: {
|
|
2564
|
-
startDate:
|
|
2565
|
-
endDate:
|
|
2769
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2770
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
|
|
2566
2771
|
}
|
|
2567
2772
|
}, async ({ startDate, endDate }) => {
|
|
2568
2773
|
const client2 = getApiClient();
|
|
@@ -2581,13 +2786,13 @@ function registerCreateStatusUpdate(server) {
|
|
|
2581
2786
|
server.registerTool("create_status_update", {
|
|
2582
2787
|
description: "Create a new status report. Use this after generating the report content from history events.",
|
|
2583
2788
|
inputSchema: {
|
|
2584
|
-
startDate:
|
|
2585
|
-
endDate:
|
|
2586
|
-
content:
|
|
2587
|
-
title:
|
|
2588
|
-
items:
|
|
2589
|
-
roadmapItemId:
|
|
2590
|
-
status:
|
|
2789
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
|
|
2790
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
|
|
2791
|
+
content: z15.string().describe("The markdown content of the status report"),
|
|
2792
|
+
title: z15.string().optional().describe("Optional title for the report"),
|
|
2793
|
+
items: z15.array(z15.object({
|
|
2794
|
+
roadmapItemId: z15.string().describe("UUID of the roadmap item"),
|
|
2795
|
+
status: z15.string().describe("Status of the item at report creation time")
|
|
2591
2796
|
})).optional().describe("Roadmap items to include in the report snapshot")
|
|
2592
2797
|
}
|
|
2593
2798
|
}, async ({
|
|
@@ -2628,18 +2833,18 @@ function registerSaveStories(server) {
|
|
|
2628
2833
|
server.registerTool("save_stories", {
|
|
2629
2834
|
description: "Save epics and stories for a roadmap item. Replaces all existing epics/stories. Use this to set the complete list of epics and stories for a roadmap.",
|
|
2630
2835
|
inputSchema: {
|
|
2631
|
-
roadmapId:
|
|
2632
|
-
epics:
|
|
2633
|
-
title:
|
|
2634
|
-
description:
|
|
2635
|
-
stories:
|
|
2636
|
-
title:
|
|
2637
|
-
description:
|
|
2836
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
2837
|
+
epics: z15.array(z15.object({
|
|
2838
|
+
title: z15.string().min(1).describe("Title of the epic"),
|
|
2839
|
+
description: z15.string().nullable().optional().describe("Description of the epic"),
|
|
2840
|
+
stories: z15.array(z15.object({
|
|
2841
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
2842
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
2638
2843
|
})).optional().describe("Stories within this epic")
|
|
2639
2844
|
})).optional().describe("List of epics with their nested stories"),
|
|
2640
|
-
stories:
|
|
2641
|
-
title:
|
|
2642
|
-
description:
|
|
2845
|
+
stories: z15.array(z15.object({
|
|
2846
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
2847
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
2643
2848
|
})).optional().describe("List of standalone stories (not part of any epic)")
|
|
2644
2849
|
}
|
|
2645
2850
|
}, async ({
|
|
@@ -2671,10 +2876,10 @@ function registerUploadWireframe(server) {
|
|
|
2671
2876
|
server.registerTool("upload_wireframe", {
|
|
2672
2877
|
description: "Upload an image to a roadmap item's wireframes. Returns a curl command to execute for the upload, then creates the wireframe record. After running the curl command, the wireframe will be visible in the web app.",
|
|
2673
2878
|
inputSchema: {
|
|
2674
|
-
roadmapId:
|
|
2675
|
-
filePath:
|
|
2676
|
-
description:
|
|
2677
|
-
outcomeIds:
|
|
2879
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2880
|
+
filePath: z15.string().describe("Absolute path to the image file on disk"),
|
|
2881
|
+
description: z15.string().optional().describe("Optional description of the wireframe"),
|
|
2882
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
|
|
2678
2883
|
}
|
|
2679
2884
|
}, async ({
|
|
2680
2885
|
roadmapId,
|
|
@@ -2728,9 +2933,9 @@ function registerUpdateWireframe(server) {
|
|
|
2728
2933
|
server.registerTool("update_wireframe", {
|
|
2729
2934
|
description: "Update a wireframe's description or outcome tags.",
|
|
2730
2935
|
inputSchema: {
|
|
2731
|
-
id:
|
|
2732
|
-
description:
|
|
2733
|
-
outcomeIds:
|
|
2936
|
+
id: z15.string().describe("The UUID of the wireframe"),
|
|
2937
|
+
description: z15.string().nullable().optional().describe("New description for the wireframe"),
|
|
2938
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
|
|
2734
2939
|
}
|
|
2735
2940
|
}, async ({
|
|
2736
2941
|
id,
|
|
@@ -2766,7 +2971,7 @@ function registerDeleteWireframe(server) {
|
|
|
2766
2971
|
server.registerTool("delete_wireframe", {
|
|
2767
2972
|
description: "Delete a wireframe (soft delete).",
|
|
2768
2973
|
inputSchema: {
|
|
2769
|
-
id:
|
|
2974
|
+
id: z15.string().describe("The UUID of the wireframe to delete")
|
|
2770
2975
|
}
|
|
2771
2976
|
}, async ({ id }) => {
|
|
2772
2977
|
const client2 = getApiClient();
|
|
@@ -2785,9 +2990,9 @@ function registerUploadBrainstormMedia(server) {
|
|
|
2785
2990
|
server.registerTool("upload_brainstorm_media", {
|
|
2786
2991
|
description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
|
|
2787
2992
|
inputSchema: {
|
|
2788
|
-
roadmapId:
|
|
2789
|
-
filePath:
|
|
2790
|
-
description:
|
|
2993
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2994
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
2995
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
2791
2996
|
}
|
|
2792
2997
|
}, async ({
|
|
2793
2998
|
roadmapId,
|
|
@@ -2839,8 +3044,8 @@ function registerUpdateBrainstormMedia(server) {
|
|
|
2839
3044
|
server.registerTool("update_brainstorm_media", {
|
|
2840
3045
|
description: "Update a brainstorm media item's description.",
|
|
2841
3046
|
inputSchema: {
|
|
2842
|
-
id:
|
|
2843
|
-
description:
|
|
3047
|
+
id: z15.string().describe("The UUID of the brainstorm media"),
|
|
3048
|
+
description: z15.string().nullable().describe("New description for the media")
|
|
2844
3049
|
}
|
|
2845
3050
|
}, async ({ id, description }) => {
|
|
2846
3051
|
const client2 = getApiClient();
|
|
@@ -2864,7 +3069,7 @@ function registerDeleteBrainstormMedia(server) {
|
|
|
2864
3069
|
server.registerTool("delete_brainstorm_media", {
|
|
2865
3070
|
description: "Delete a brainstorm media item (soft delete).",
|
|
2866
3071
|
inputSchema: {
|
|
2867
|
-
id:
|
|
3072
|
+
id: z15.string().describe("The UUID of the brainstorm media to delete")
|
|
2868
3073
|
}
|
|
2869
3074
|
}, async ({ id }) => {
|
|
2870
3075
|
const client2 = getApiClient();
|
|
@@ -2883,9 +3088,9 @@ function registerUploadProductDesignMedia(server) {
|
|
|
2883
3088
|
server.registerTool("upload_product_design_media", {
|
|
2884
3089
|
description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
|
|
2885
3090
|
inputSchema: {
|
|
2886
|
-
productId:
|
|
2887
|
-
filePath:
|
|
2888
|
-
description:
|
|
3091
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
3092
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
3093
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
2889
3094
|
}
|
|
2890
3095
|
}, async ({
|
|
2891
3096
|
productId,
|
|
@@ -2938,9 +3143,9 @@ function registerUpdateProductDesignMedia(server) {
|
|
|
2938
3143
|
server.registerTool("update_product_design_media", {
|
|
2939
3144
|
description: "Update a product design media item's description.",
|
|
2940
3145
|
inputSchema: {
|
|
2941
|
-
productId:
|
|
2942
|
-
mediaId:
|
|
2943
|
-
description:
|
|
3146
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
3147
|
+
mediaId: z15.string().describe("The UUID of the design media"),
|
|
3148
|
+
description: z15.string().nullable().describe("New description for the media")
|
|
2944
3149
|
}
|
|
2945
3150
|
}, async ({
|
|
2946
3151
|
productId,
|
|
@@ -2968,8 +3173,8 @@ function registerDeleteProductDesignMedia(server) {
|
|
|
2968
3173
|
server.registerTool("delete_product_design_media", {
|
|
2969
3174
|
description: "Delete a product design media item (soft delete).",
|
|
2970
3175
|
inputSchema: {
|
|
2971
|
-
productId:
|
|
2972
|
-
mediaId:
|
|
3176
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
3177
|
+
mediaId: z15.string().describe("The UUID of the design media to delete")
|
|
2973
3178
|
}
|
|
2974
3179
|
}, async ({ productId, mediaId }) => {
|
|
2975
3180
|
const client2 = getApiClient();
|
|
@@ -2991,8 +3196,8 @@ function registerUploadDesignWalkthrough(server) {
|
|
|
2991
3196
|
server.registerTool("upload_design_walkthrough", {
|
|
2992
3197
|
description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
|
|
2993
3198
|
inputSchema: {
|
|
2994
|
-
roadmapId:
|
|
2995
|
-
filePath:
|
|
3199
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3200
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
2996
3201
|
}
|
|
2997
3202
|
}, async ({ roadmapId, filePath }) => {
|
|
2998
3203
|
const client2 = getApiClient();
|
|
@@ -3034,8 +3239,8 @@ function registerUploadReleaseWalkthrough(server) {
|
|
|
3034
3239
|
server.registerTool("upload_release_walkthrough", {
|
|
3035
3240
|
description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
|
|
3036
3241
|
inputSchema: {
|
|
3037
|
-
roadmapId:
|
|
3038
|
-
filePath:
|
|
3242
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3243
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
3039
3244
|
}
|
|
3040
3245
|
}, async ({ roadmapId, filePath }) => {
|
|
3041
3246
|
const client2 = getApiClient();
|
|
@@ -3093,9 +3298,9 @@ function registerPublishPrototype(server) {
|
|
|
3093
3298
|
server.registerTool("publish_prototype", {
|
|
3094
3299
|
description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
|
|
3095
3300
|
inputSchema: {
|
|
3096
|
-
roadmapId:
|
|
3097
|
-
folderPath:
|
|
3098
|
-
entryPoint:
|
|
3301
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
|
|
3302
|
+
folderPath: z15.string().describe("Absolute path to the local mockup folder"),
|
|
3303
|
+
entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
|
|
3099
3304
|
}
|
|
3100
3305
|
}, async ({
|
|
3101
3306
|
roadmapId,
|
|
@@ -3250,15 +3455,15 @@ Expires: ${expiryDate}`
|
|
|
3250
3455
|
};
|
|
3251
3456
|
});
|
|
3252
3457
|
}
|
|
3253
|
-
var dateGranularitySchema2 =
|
|
3458
|
+
var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
|
|
3254
3459
|
function registerSearchInitiatives(server) {
|
|
3255
3460
|
server.registerTool("search_initiatives", {
|
|
3256
3461
|
description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
|
|
3257
3462
|
inputSchema: {
|
|
3258
|
-
query:
|
|
3463
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
3259
3464
|
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
3260
|
-
limit:
|
|
3261
|
-
offset:
|
|
3465
|
+
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
3466
|
+
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
3262
3467
|
}
|
|
3263
3468
|
}, async ({
|
|
3264
3469
|
query,
|
|
@@ -3308,7 +3513,7 @@ function registerGetInitiative(server) {
|
|
|
3308
3513
|
server.registerTool("get_initiative", {
|
|
3309
3514
|
description: "Get full details of an initiative including all linked roadmap items.",
|
|
3310
3515
|
inputSchema: {
|
|
3311
|
-
id:
|
|
3516
|
+
id: z15.string().describe("The UUID of the initiative")
|
|
3312
3517
|
}
|
|
3313
3518
|
}, async ({ id }) => {
|
|
3314
3519
|
const client2 = getApiClient();
|
|
@@ -3327,12 +3532,12 @@ function registerCreateInitiative(server) {
|
|
|
3327
3532
|
server.registerTool("create_initiative", {
|
|
3328
3533
|
description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
|
|
3329
3534
|
inputSchema: {
|
|
3330
|
-
title:
|
|
3331
|
-
description:
|
|
3535
|
+
title: z15.string().describe("Title of the initiative"),
|
|
3536
|
+
description: z15.string().optional().describe("Description of the initiative (markdown)"),
|
|
3332
3537
|
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
3333
3538
|
dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
|
|
3334
|
-
dateValue:
|
|
3335
|
-
targetDate:
|
|
3539
|
+
dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
|
|
3540
|
+
targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
|
|
3336
3541
|
}
|
|
3337
3542
|
}, async ({
|
|
3338
3543
|
title,
|
|
@@ -3376,14 +3581,14 @@ function registerUpdateInitiative(server) {
|
|
|
3376
3581
|
server.registerTool("update_initiative", {
|
|
3377
3582
|
description: "Update an existing initiative.",
|
|
3378
3583
|
inputSchema: {
|
|
3379
|
-
id:
|
|
3380
|
-
title:
|
|
3381
|
-
description:
|
|
3584
|
+
id: z15.string().describe("The UUID of the initiative to update"),
|
|
3585
|
+
title: z15.string().optional().describe("New title"),
|
|
3586
|
+
description: z15.string().nullable().optional().describe("New description (null to clear)"),
|
|
3382
3587
|
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
3383
3588
|
dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
|
|
3384
|
-
dateValue:
|
|
3385
|
-
targetDate:
|
|
3386
|
-
order:
|
|
3589
|
+
dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
|
|
3590
|
+
targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
|
|
3591
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
|
|
3387
3592
|
}
|
|
3388
3593
|
}, async ({
|
|
3389
3594
|
id,
|
|
@@ -3438,7 +3643,7 @@ function registerDeleteInitiative(server) {
|
|
|
3438
3643
|
server.registerTool("delete_initiative", {
|
|
3439
3644
|
description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
|
|
3440
3645
|
inputSchema: {
|
|
3441
|
-
id:
|
|
3646
|
+
id: z15.string().describe("The UUID of the initiative to delete")
|
|
3442
3647
|
}
|
|
3443
3648
|
}, async ({ id }) => {
|
|
3444
3649
|
const client2 = getApiClient();
|
|
@@ -3457,9 +3662,9 @@ function registerReorderInitiatives(server) {
|
|
|
3457
3662
|
server.registerTool("reorder_initiatives", {
|
|
3458
3663
|
description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
|
|
3459
3664
|
inputSchema: {
|
|
3460
|
-
items:
|
|
3461
|
-
id:
|
|
3462
|
-
order:
|
|
3665
|
+
items: z15.array(z15.object({
|
|
3666
|
+
id: z15.string().describe("The UUID of the initiative"),
|
|
3667
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
3463
3668
|
})).describe("Array of initiatives with their new order values")
|
|
3464
3669
|
}
|
|
3465
3670
|
}, async ({ items }) => {
|
|
@@ -3479,12 +3684,12 @@ function registerSearchExports(server) {
|
|
|
3479
3684
|
server.registerTool("search_exports", {
|
|
3480
3685
|
description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
|
|
3481
3686
|
inputSchema: {
|
|
3482
|
-
roadmapId:
|
|
3483
|
-
externalSystem:
|
|
3484
|
-
localEntityType:
|
|
3485
|
-
localEntityId:
|
|
3486
|
-
limit:
|
|
3487
|
-
offset:
|
|
3687
|
+
roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
|
|
3688
|
+
externalSystem: z15.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
|
|
3689
|
+
localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
|
|
3690
|
+
localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
|
|
3691
|
+
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
3692
|
+
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
3488
3693
|
}
|
|
3489
3694
|
}, async ({
|
|
3490
3695
|
roadmapId,
|
|
@@ -3521,7 +3726,7 @@ function registerGetExport(server) {
|
|
|
3521
3726
|
server.registerTool("get_export", {
|
|
3522
3727
|
description: "Get full details of a single export record by ID.",
|
|
3523
3728
|
inputSchema: {
|
|
3524
|
-
id:
|
|
3729
|
+
id: z15.string().uuid().describe("The UUID of the export record")
|
|
3525
3730
|
}
|
|
3526
3731
|
}, async ({ id }) => {
|
|
3527
3732
|
const client2 = getApiClient();
|
|
@@ -3540,14 +3745,14 @@ function registerCreateExport(server) {
|
|
|
3540
3745
|
server.registerTool("create_export", {
|
|
3541
3746
|
description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
|
|
3542
3747
|
inputSchema: {
|
|
3543
|
-
roadmapId:
|
|
3544
|
-
localEntityType:
|
|
3545
|
-
localEntityId:
|
|
3546
|
-
externalSystem:
|
|
3547
|
-
externalObjectType:
|
|
3548
|
-
externalId:
|
|
3549
|
-
externalUrl:
|
|
3550
|
-
metadata:
|
|
3748
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
3749
|
+
localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
|
|
3750
|
+
localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
|
|
3751
|
+
externalSystem: z15.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
|
|
3752
|
+
externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
|
|
3753
|
+
externalId: z15.string().min(1).describe("ID of the object in the external system"),
|
|
3754
|
+
externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
|
|
3755
|
+
metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
|
|
3551
3756
|
}
|
|
3552
3757
|
}, async ({
|
|
3553
3758
|
roadmapId,
|
|
@@ -3584,9 +3789,9 @@ function registerUpdateExport(server) {
|
|
|
3584
3789
|
server.registerTool("update_export", {
|
|
3585
3790
|
description: "Update an export record. Can update the external URL or metadata.",
|
|
3586
3791
|
inputSchema: {
|
|
3587
|
-
id:
|
|
3588
|
-
externalUrl:
|
|
3589
|
-
metadata:
|
|
3792
|
+
id: z15.string().uuid().describe("The UUID of the export record to update"),
|
|
3793
|
+
externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
|
|
3794
|
+
metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
|
|
3590
3795
|
}
|
|
3591
3796
|
}, async ({
|
|
3592
3797
|
id,
|
|
@@ -3609,7 +3814,7 @@ function registerDeleteExport(server) {
|
|
|
3609
3814
|
server.registerTool("delete_export", {
|
|
3610
3815
|
description: "Delete an export record. This is a soft delete.",
|
|
3611
3816
|
inputSchema: {
|
|
3612
|
-
id:
|
|
3817
|
+
id: z15.string().uuid().describe("The UUID of the export record to delete")
|
|
3613
3818
|
}
|
|
3614
3819
|
}, async ({ id }) => {
|
|
3615
3820
|
const client2 = getApiClient();
|
|
@@ -3624,6 +3829,554 @@ function registerDeleteExport(server) {
|
|
|
3624
3829
|
};
|
|
3625
3830
|
});
|
|
3626
3831
|
}
|
|
3832
|
+
function registerListPresentations(server) {
|
|
3833
|
+
server.registerTool("list_presentations", {
|
|
3834
|
+
description: "List all presentations.",
|
|
3835
|
+
inputSchema: {}
|
|
3836
|
+
}, async () => {
|
|
3837
|
+
const client2 = getApiClient();
|
|
3838
|
+
const result = await client2.listPresentations();
|
|
3839
|
+
return {
|
|
3840
|
+
content: [
|
|
3841
|
+
{
|
|
3842
|
+
type: "text",
|
|
3843
|
+
text: JSON.stringify(result, null, 2)
|
|
3844
|
+
}
|
|
3845
|
+
]
|
|
3846
|
+
};
|
|
3847
|
+
});
|
|
3848
|
+
}
|
|
3849
|
+
function registerGetPresentation(server) {
|
|
3850
|
+
server.registerTool("get_presentation", {
|
|
3851
|
+
description: "Get presentation with variants and slides.",
|
|
3852
|
+
inputSchema: {
|
|
3853
|
+
id: z15.string().describe("The UUID of the presentation")
|
|
3854
|
+
}
|
|
3855
|
+
}, async ({ id }) => {
|
|
3856
|
+
const client2 = getApiClient();
|
|
3857
|
+
const presentation2 = await client2.getPresentation(id);
|
|
3858
|
+
const variantsResult = await client2.listVariants(id);
|
|
3859
|
+
const variantsWithSlides = await Promise.all(variantsResult.items.map(async (variant2) => {
|
|
3860
|
+
const slidesResult = await client2.listSlides(id, variant2.id);
|
|
3861
|
+
return {
|
|
3862
|
+
...variant2,
|
|
3863
|
+
slides: slidesResult.items
|
|
3864
|
+
};
|
|
3865
|
+
}));
|
|
3866
|
+
return {
|
|
3867
|
+
content: [
|
|
3868
|
+
{
|
|
3869
|
+
type: "text",
|
|
3870
|
+
text: JSON.stringify({
|
|
3871
|
+
...presentation2,
|
|
3872
|
+
variants: variantsWithSlides
|
|
3873
|
+
}, null, 2)
|
|
3874
|
+
}
|
|
3875
|
+
]
|
|
3876
|
+
};
|
|
3877
|
+
});
|
|
3878
|
+
}
|
|
3879
|
+
function registerCreatePresentation(server) {
|
|
3880
|
+
server.registerTool("create_presentation", {
|
|
3881
|
+
description: "Create a new presentation.",
|
|
3882
|
+
inputSchema: {
|
|
3883
|
+
title: z15.string().describe("Title of the presentation"),
|
|
3884
|
+
description: z15.string().nullable().optional().describe("Description of the presentation")
|
|
3885
|
+
}
|
|
3886
|
+
}, async ({ title, description }) => {
|
|
3887
|
+
const client2 = getApiClient();
|
|
3888
|
+
const presentation2 = await client2.createPresentation({
|
|
3889
|
+
title,
|
|
3890
|
+
description: description ?? null
|
|
3891
|
+
});
|
|
3892
|
+
return {
|
|
3893
|
+
content: [
|
|
3894
|
+
{
|
|
3895
|
+
type: "text",
|
|
3896
|
+
text: JSON.stringify(presentation2, null, 2)
|
|
3897
|
+
}
|
|
3898
|
+
]
|
|
3899
|
+
};
|
|
3900
|
+
});
|
|
3901
|
+
}
|
|
3902
|
+
function registerUpdatePresentation(server) {
|
|
3903
|
+
server.registerTool("update_presentation", {
|
|
3904
|
+
description: "Update an existing presentation.",
|
|
3905
|
+
inputSchema: {
|
|
3906
|
+
id: z15.string().describe("The UUID of the presentation to update"),
|
|
3907
|
+
title: z15.string().optional().describe("New title"),
|
|
3908
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
3909
|
+
}
|
|
3910
|
+
}, async ({
|
|
3911
|
+
id,
|
|
3912
|
+
title,
|
|
3913
|
+
description
|
|
3914
|
+
}) => {
|
|
3915
|
+
const client2 = getApiClient();
|
|
3916
|
+
const data = {};
|
|
3917
|
+
if (title !== undefined)
|
|
3918
|
+
data.title = title;
|
|
3919
|
+
if (description !== undefined)
|
|
3920
|
+
data.description = description;
|
|
3921
|
+
const presentation2 = await client2.updatePresentation(id, data);
|
|
3922
|
+
return {
|
|
3923
|
+
content: [
|
|
3924
|
+
{
|
|
3925
|
+
type: "text",
|
|
3926
|
+
text: JSON.stringify(presentation2, null, 2)
|
|
3927
|
+
}
|
|
3928
|
+
]
|
|
3929
|
+
};
|
|
3930
|
+
});
|
|
3931
|
+
}
|
|
3932
|
+
function registerDeletePresentation(server) {
|
|
3933
|
+
server.registerTool("delete_presentation", {
|
|
3934
|
+
description: "Delete a presentation.",
|
|
3935
|
+
inputSchema: {
|
|
3936
|
+
id: z15.string().describe("The UUID of the presentation to delete")
|
|
3937
|
+
}
|
|
3938
|
+
}, async ({ id }) => {
|
|
3939
|
+
const client2 = getApiClient();
|
|
3940
|
+
await client2.deletePresentation(id);
|
|
3941
|
+
return {
|
|
3942
|
+
content: [
|
|
3943
|
+
{
|
|
3944
|
+
type: "text",
|
|
3945
|
+
text: JSON.stringify({ success: true, deleted: id }, null, 2)
|
|
3946
|
+
}
|
|
3947
|
+
]
|
|
3948
|
+
};
|
|
3949
|
+
});
|
|
3950
|
+
}
|
|
3951
|
+
function registerReorderPresentations(server) {
|
|
3952
|
+
server.registerTool("reorder_presentations", {
|
|
3953
|
+
description: "Reorder presentations by setting their order values. Lower order values appear first.",
|
|
3954
|
+
inputSchema: {
|
|
3955
|
+
items: z15.array(z15.object({
|
|
3956
|
+
id: z15.string().describe("The UUID of the presentation"),
|
|
3957
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
3958
|
+
})).describe("Array of presentations with their new order values")
|
|
3959
|
+
}
|
|
3960
|
+
}, async ({ items }) => {
|
|
3961
|
+
const client2 = getApiClient();
|
|
3962
|
+
await client2.reorderPresentations(items);
|
|
3963
|
+
return {
|
|
3964
|
+
content: [
|
|
3965
|
+
{
|
|
3966
|
+
type: "text",
|
|
3967
|
+
text: JSON.stringify({ success: true, reordered: items.length }, null, 2)
|
|
3968
|
+
}
|
|
3969
|
+
]
|
|
3970
|
+
};
|
|
3971
|
+
});
|
|
3972
|
+
}
|
|
3973
|
+
function registerListVariants(server) {
|
|
3974
|
+
server.registerTool("list_variants", {
|
|
3975
|
+
description: "List all variants for a presentation.",
|
|
3976
|
+
inputSchema: {
|
|
3977
|
+
presentationId: z15.string().describe("The UUID of the presentation")
|
|
3978
|
+
}
|
|
3979
|
+
}, async ({ presentationId }) => {
|
|
3980
|
+
const client2 = getApiClient();
|
|
3981
|
+
const result = await client2.listVariants(presentationId);
|
|
3982
|
+
return {
|
|
3983
|
+
content: [
|
|
3984
|
+
{
|
|
3985
|
+
type: "text",
|
|
3986
|
+
text: JSON.stringify(result, null, 2)
|
|
3987
|
+
}
|
|
3988
|
+
]
|
|
3989
|
+
};
|
|
3990
|
+
});
|
|
3991
|
+
}
|
|
3992
|
+
function registerGetVariant(server) {
|
|
3993
|
+
server.registerTool("get_variant", {
|
|
3994
|
+
description: "Get variant with its slides.",
|
|
3995
|
+
inputSchema: {
|
|
3996
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
3997
|
+
variantId: z15.string().describe("The UUID of the variant")
|
|
3998
|
+
}
|
|
3999
|
+
}, async ({ presentationId, variantId }) => {
|
|
4000
|
+
const client2 = getApiClient();
|
|
4001
|
+
const variant2 = await client2.getVariant(presentationId, variantId);
|
|
4002
|
+
const slidesResult = await client2.listSlides(presentationId, variantId);
|
|
4003
|
+
return {
|
|
4004
|
+
content: [
|
|
4005
|
+
{
|
|
4006
|
+
type: "text",
|
|
4007
|
+
text: JSON.stringify({
|
|
4008
|
+
...variant2,
|
|
4009
|
+
slides: slidesResult.items
|
|
4010
|
+
}, null, 2)
|
|
4011
|
+
}
|
|
4012
|
+
]
|
|
4013
|
+
};
|
|
4014
|
+
});
|
|
4015
|
+
}
|
|
4016
|
+
function registerCreateVariant(server) {
|
|
4017
|
+
server.registerTool("create_variant", {
|
|
4018
|
+
description: "Create a new variant for a presentation.",
|
|
4019
|
+
inputSchema: {
|
|
4020
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4021
|
+
name: z15.string().describe("Name of the variant"),
|
|
4022
|
+
audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
|
|
4023
|
+
}
|
|
4024
|
+
}, async ({
|
|
4025
|
+
presentationId,
|
|
4026
|
+
name,
|
|
4027
|
+
audienceId
|
|
4028
|
+
}) => {
|
|
4029
|
+
const client2 = getApiClient();
|
|
4030
|
+
const variant2 = await client2.createVariant(presentationId, {
|
|
4031
|
+
name,
|
|
4032
|
+
audienceId: audienceId ?? null
|
|
4033
|
+
});
|
|
4034
|
+
return {
|
|
4035
|
+
content: [
|
|
4036
|
+
{
|
|
4037
|
+
type: "text",
|
|
4038
|
+
text: JSON.stringify(variant2, null, 2)
|
|
4039
|
+
}
|
|
4040
|
+
]
|
|
4041
|
+
};
|
|
4042
|
+
});
|
|
4043
|
+
}
|
|
4044
|
+
function registerUpdateVariant(server) {
|
|
4045
|
+
server.registerTool("update_variant", {
|
|
4046
|
+
description: "Update an existing variant.",
|
|
4047
|
+
inputSchema: {
|
|
4048
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4049
|
+
variantId: z15.string().describe("The UUID of the variant to update"),
|
|
4050
|
+
name: z15.string().optional().describe("New name"),
|
|
4051
|
+
audienceId: z15.string().nullable().optional().describe("New target audience UUID")
|
|
4052
|
+
}
|
|
4053
|
+
}, async ({
|
|
4054
|
+
presentationId,
|
|
4055
|
+
variantId,
|
|
4056
|
+
name,
|
|
4057
|
+
audienceId
|
|
4058
|
+
}) => {
|
|
4059
|
+
const client2 = getApiClient();
|
|
4060
|
+
const data = {};
|
|
4061
|
+
if (name !== undefined)
|
|
4062
|
+
data.name = name;
|
|
4063
|
+
if (audienceId !== undefined)
|
|
4064
|
+
data.audienceId = audienceId;
|
|
4065
|
+
const variant2 = await client2.updateVariant(presentationId, variantId, data);
|
|
4066
|
+
return {
|
|
4067
|
+
content: [
|
|
4068
|
+
{
|
|
4069
|
+
type: "text",
|
|
4070
|
+
text: JSON.stringify(variant2, null, 2)
|
|
4071
|
+
}
|
|
4072
|
+
]
|
|
4073
|
+
};
|
|
4074
|
+
});
|
|
4075
|
+
}
|
|
4076
|
+
function registerDeleteVariant(server) {
|
|
4077
|
+
server.registerTool("delete_variant", {
|
|
4078
|
+
description: "Delete a variant.",
|
|
4079
|
+
inputSchema: {
|
|
4080
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4081
|
+
variantId: z15.string().describe("The UUID of the variant to delete")
|
|
4082
|
+
}
|
|
4083
|
+
}, async ({ presentationId, variantId }) => {
|
|
4084
|
+
const client2 = getApiClient();
|
|
4085
|
+
await client2.deleteVariant(presentationId, variantId);
|
|
4086
|
+
return {
|
|
4087
|
+
content: [
|
|
4088
|
+
{
|
|
4089
|
+
type: "text",
|
|
4090
|
+
text: JSON.stringify({ success: true, deleted: variantId }, null, 2)
|
|
4091
|
+
}
|
|
4092
|
+
]
|
|
4093
|
+
};
|
|
4094
|
+
});
|
|
4095
|
+
}
|
|
4096
|
+
function registerReorderVariants(server) {
|
|
4097
|
+
server.registerTool("reorder_variants", {
|
|
4098
|
+
description: "Reorder variants by setting their order values. Lower order values appear first.",
|
|
4099
|
+
inputSchema: {
|
|
4100
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4101
|
+
items: z15.array(z15.object({
|
|
4102
|
+
id: z15.string().describe("The UUID of the variant"),
|
|
4103
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
4104
|
+
})).describe("Array of variants with their new order values")
|
|
4105
|
+
}
|
|
4106
|
+
}, async ({
|
|
4107
|
+
presentationId,
|
|
4108
|
+
items
|
|
4109
|
+
}) => {
|
|
4110
|
+
const client2 = getApiClient();
|
|
4111
|
+
await client2.reorderVariants(presentationId, items);
|
|
4112
|
+
return {
|
|
4113
|
+
content: [
|
|
4114
|
+
{
|
|
4115
|
+
type: "text",
|
|
4116
|
+
text: JSON.stringify({ success: true, reordered: items.length }, null, 2)
|
|
4117
|
+
}
|
|
4118
|
+
]
|
|
4119
|
+
};
|
|
4120
|
+
});
|
|
4121
|
+
}
|
|
4122
|
+
function registerCloneVariant(server) {
|
|
4123
|
+
server.registerTool("clone_variant", {
|
|
4124
|
+
description: "Clone a variant with all its slides.",
|
|
4125
|
+
inputSchema: {
|
|
4126
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4127
|
+
variantId: z15.string().describe("The UUID of the variant to clone")
|
|
4128
|
+
}
|
|
4129
|
+
}, async ({ presentationId, variantId }) => {
|
|
4130
|
+
const client2 = getApiClient();
|
|
4131
|
+
const clonedVariant = await client2.cloneVariant(presentationId, variantId);
|
|
4132
|
+
return {
|
|
4133
|
+
content: [
|
|
4134
|
+
{
|
|
4135
|
+
type: "text",
|
|
4136
|
+
text: JSON.stringify(clonedVariant, null, 2)
|
|
4137
|
+
}
|
|
4138
|
+
]
|
|
4139
|
+
};
|
|
4140
|
+
});
|
|
4141
|
+
}
|
|
4142
|
+
function registerSetDefaultVariant(server) {
|
|
4143
|
+
server.registerTool("set_default_variant", {
|
|
4144
|
+
description: "Set a variant as the default for the presentation.",
|
|
4145
|
+
inputSchema: {
|
|
4146
|
+
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4147
|
+
variantId: z15.string().describe("The UUID of the variant to set as default")
|
|
4148
|
+
}
|
|
4149
|
+
}, async ({ presentationId, variantId }) => {
|
|
4150
|
+
const client2 = getApiClient();
|
|
4151
|
+
await client2.setDefaultVariant(presentationId, variantId);
|
|
4152
|
+
return {
|
|
4153
|
+
content: [
|
|
4154
|
+
{
|
|
4155
|
+
type: "text",
|
|
4156
|
+
text: JSON.stringify({ success: true, variantId }, null, 2)
|
|
4157
|
+
}
|
|
4158
|
+
]
|
|
4159
|
+
};
|
|
4160
|
+
});
|
|
4161
|
+
}
|
|
4162
|
+
function registerListSlides(server) {
|
|
4163
|
+
server.registerTool("list_slides", {
|
|
4164
|
+
description: "List all slides in a variant.",
|
|
4165
|
+
inputSchema: {
|
|
4166
|
+
variantId: z15.string().describe("The UUID of the variant")
|
|
4167
|
+
}
|
|
4168
|
+
}, async ({ variantId }) => {
|
|
4169
|
+
const client2 = getApiClient();
|
|
4170
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4171
|
+
if (!presentationId) {
|
|
4172
|
+
return {
|
|
4173
|
+
content: [
|
|
4174
|
+
{
|
|
4175
|
+
type: "text",
|
|
4176
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4177
|
+
}
|
|
4178
|
+
]
|
|
4179
|
+
};
|
|
4180
|
+
}
|
|
4181
|
+
const result = await client2.listSlides(presentationId, variantId);
|
|
4182
|
+
return {
|
|
4183
|
+
content: [
|
|
4184
|
+
{
|
|
4185
|
+
type: "text",
|
|
4186
|
+
text: JSON.stringify(result, null, 2)
|
|
4187
|
+
}
|
|
4188
|
+
]
|
|
4189
|
+
};
|
|
4190
|
+
});
|
|
4191
|
+
}
|
|
4192
|
+
function registerGetSlide(server) {
|
|
4193
|
+
server.registerTool("get_slide", {
|
|
4194
|
+
description: "Get a slide by ID.",
|
|
4195
|
+
inputSchema: {
|
|
4196
|
+
variantId: z15.string().describe("The UUID of the variant"),
|
|
4197
|
+
slideId: z15.string().describe("The UUID of the slide")
|
|
4198
|
+
}
|
|
4199
|
+
}, async ({ variantId, slideId }) => {
|
|
4200
|
+
const client2 = getApiClient();
|
|
4201
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4202
|
+
if (!presentationId) {
|
|
4203
|
+
return {
|
|
4204
|
+
content: [
|
|
4205
|
+
{
|
|
4206
|
+
type: "text",
|
|
4207
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4208
|
+
}
|
|
4209
|
+
]
|
|
4210
|
+
};
|
|
4211
|
+
}
|
|
4212
|
+
const slide2 = await client2.getSlide(presentationId, variantId, slideId);
|
|
4213
|
+
return {
|
|
4214
|
+
content: [
|
|
4215
|
+
{
|
|
4216
|
+
type: "text",
|
|
4217
|
+
text: JSON.stringify(slide2, null, 2)
|
|
4218
|
+
}
|
|
4219
|
+
]
|
|
4220
|
+
};
|
|
4221
|
+
});
|
|
4222
|
+
}
|
|
4223
|
+
function registerCreateSlide(server) {
|
|
4224
|
+
server.registerTool("create_slide", {
|
|
4225
|
+
description: "Create a new slide in a variant.",
|
|
4226
|
+
inputSchema: {
|
|
4227
|
+
variantId: z15.string().describe("The UUID of the variant"),
|
|
4228
|
+
title: z15.string().optional().describe("Title of the slide"),
|
|
4229
|
+
content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("Slide content with markdown body"),
|
|
4230
|
+
speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
|
|
4231
|
+
}
|
|
4232
|
+
}, async ({
|
|
4233
|
+
variantId,
|
|
4234
|
+
title,
|
|
4235
|
+
content,
|
|
4236
|
+
speakerNotes
|
|
4237
|
+
}) => {
|
|
4238
|
+
const client2 = getApiClient();
|
|
4239
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4240
|
+
if (!presentationId) {
|
|
4241
|
+
return {
|
|
4242
|
+
content: [
|
|
4243
|
+
{
|
|
4244
|
+
type: "text",
|
|
4245
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4246
|
+
}
|
|
4247
|
+
]
|
|
4248
|
+
};
|
|
4249
|
+
}
|
|
4250
|
+
const slide2 = await client2.createSlide(presentationId, variantId, {
|
|
4251
|
+
title,
|
|
4252
|
+
content,
|
|
4253
|
+
speakerNotes
|
|
4254
|
+
});
|
|
4255
|
+
return {
|
|
4256
|
+
content: [
|
|
4257
|
+
{
|
|
4258
|
+
type: "text",
|
|
4259
|
+
text: JSON.stringify(slide2, null, 2)
|
|
4260
|
+
}
|
|
4261
|
+
]
|
|
4262
|
+
};
|
|
4263
|
+
});
|
|
4264
|
+
}
|
|
4265
|
+
function registerUpdateSlide(server) {
|
|
4266
|
+
server.registerTool("update_slide", {
|
|
4267
|
+
description: "Update an existing slide.",
|
|
4268
|
+
inputSchema: {
|
|
4269
|
+
variantId: z15.string().describe("The UUID of the variant"),
|
|
4270
|
+
slideId: z15.string().describe("The UUID of the slide to update"),
|
|
4271
|
+
title: z15.string().optional().describe("New title"),
|
|
4272
|
+
content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
|
|
4273
|
+
speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
|
|
4274
|
+
}
|
|
4275
|
+
}, async ({
|
|
4276
|
+
variantId,
|
|
4277
|
+
slideId,
|
|
4278
|
+
title,
|
|
4279
|
+
content,
|
|
4280
|
+
speakerNotes
|
|
4281
|
+
}) => {
|
|
4282
|
+
const client2 = getApiClient();
|
|
4283
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4284
|
+
if (!presentationId) {
|
|
4285
|
+
return {
|
|
4286
|
+
content: [
|
|
4287
|
+
{
|
|
4288
|
+
type: "text",
|
|
4289
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4290
|
+
}
|
|
4291
|
+
]
|
|
4292
|
+
};
|
|
4293
|
+
}
|
|
4294
|
+
const data = {};
|
|
4295
|
+
if (title !== undefined)
|
|
4296
|
+
data.title = title;
|
|
4297
|
+
if (content !== undefined)
|
|
4298
|
+
data.content = content;
|
|
4299
|
+
if (speakerNotes !== undefined)
|
|
4300
|
+
data.speakerNotes = speakerNotes;
|
|
4301
|
+
const slide2 = await client2.updateSlide(presentationId, variantId, slideId, data);
|
|
4302
|
+
return {
|
|
4303
|
+
content: [
|
|
4304
|
+
{
|
|
4305
|
+
type: "text",
|
|
4306
|
+
text: JSON.stringify(slide2, null, 2)
|
|
4307
|
+
}
|
|
4308
|
+
]
|
|
4309
|
+
};
|
|
4310
|
+
});
|
|
4311
|
+
}
|
|
4312
|
+
function registerDeleteSlide(server) {
|
|
4313
|
+
server.registerTool("delete_slide", {
|
|
4314
|
+
description: "Delete a slide (soft delete).",
|
|
4315
|
+
inputSchema: {
|
|
4316
|
+
variantId: z15.string().describe("The UUID of the variant"),
|
|
4317
|
+
slideId: z15.string().describe("The UUID of the slide to delete")
|
|
4318
|
+
}
|
|
4319
|
+
}, async ({ variantId, slideId }) => {
|
|
4320
|
+
const client2 = getApiClient();
|
|
4321
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4322
|
+
if (!presentationId) {
|
|
4323
|
+
return {
|
|
4324
|
+
content: [
|
|
4325
|
+
{
|
|
4326
|
+
type: "text",
|
|
4327
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4328
|
+
}
|
|
4329
|
+
]
|
|
4330
|
+
};
|
|
4331
|
+
}
|
|
4332
|
+
await client2.deleteSlide(presentationId, variantId, slideId);
|
|
4333
|
+
return {
|
|
4334
|
+
content: [
|
|
4335
|
+
{
|
|
4336
|
+
type: "text",
|
|
4337
|
+
text: JSON.stringify({ success: true, deleted: slideId }, null, 2)
|
|
4338
|
+
}
|
|
4339
|
+
]
|
|
4340
|
+
};
|
|
4341
|
+
});
|
|
4342
|
+
}
|
|
4343
|
+
function registerReorderSlides(server) {
|
|
4344
|
+
server.registerTool("reorder_slides", {
|
|
4345
|
+
description: "Reorder slides by setting their order values. Lower order values appear first.",
|
|
4346
|
+
inputSchema: {
|
|
4347
|
+
variantId: z15.string().describe("The UUID of the variant"),
|
|
4348
|
+
items: z15.array(z15.object({
|
|
4349
|
+
id: z15.string().describe("The UUID of the slide"),
|
|
4350
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
4351
|
+
})).describe("Array of slides with their new order values")
|
|
4352
|
+
}
|
|
4353
|
+
}, async ({
|
|
4354
|
+
variantId,
|
|
4355
|
+
items
|
|
4356
|
+
}) => {
|
|
4357
|
+
const client2 = getApiClient();
|
|
4358
|
+
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
4359
|
+
if (!presentationId) {
|
|
4360
|
+
return {
|
|
4361
|
+
content: [
|
|
4362
|
+
{
|
|
4363
|
+
type: "text",
|
|
4364
|
+
text: JSON.stringify({ error: "Variant not found" }, null, 2)
|
|
4365
|
+
}
|
|
4366
|
+
]
|
|
4367
|
+
};
|
|
4368
|
+
}
|
|
4369
|
+
await client2.reorderSlides(presentationId, variantId, items);
|
|
4370
|
+
return {
|
|
4371
|
+
content: [
|
|
4372
|
+
{
|
|
4373
|
+
type: "text",
|
|
4374
|
+
text: JSON.stringify({ success: true, reordered: items.length }, null, 2)
|
|
4375
|
+
}
|
|
4376
|
+
]
|
|
4377
|
+
};
|
|
4378
|
+
});
|
|
4379
|
+
}
|
|
3627
4380
|
|
|
3628
4381
|
// src/index.ts
|
|
3629
4382
|
async function main() {
|