@ourroadmaps/mcp 0.23.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.
Files changed (2) hide show
  1. package/dist/index.js +1462 -425
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -94,387 +94,497 @@ var domainContextSchema = z3.object({
94
94
  definitions: z3.record(z3.string(), z3.string()),
95
95
  schemas: z3.record(z3.string(), z3.array(z3.string()))
96
96
  });
97
- // ../../packages/shared/src/schemas/feature.ts
97
+ // ../../packages/shared/src/schemas/export.ts
98
98
  import { z as z4 } from "zod";
99
- var featureOutcomeSchema = z4.object({
99
+ var localEntityTypeSchema = z4.enum(["roadmap", "prd", "epic", "story", "design"]);
100
+ var externalSystemSchema = z4.enum(["linear", "notion", "jira", "github"]);
101
+ var exportSchema = z4.object({
100
102
  id: z4.string().uuid(),
101
- description: z4.string(),
102
- order: z4.number().int(),
103
+ roadmapItemId: z4.string().uuid(),
104
+ localEntityType: localEntityTypeSchema,
105
+ localEntityId: z4.string().uuid(),
106
+ externalSystem: externalSystemSchema,
107
+ externalObjectType: z4.string(),
108
+ externalId: z4.string(),
109
+ externalUrl: z4.string().nullable(),
110
+ metadata: z4.record(z4.unknown()).nullable(),
103
111
  createdAt: z4.string(),
104
112
  updatedAt: z4.string()
105
113
  });
106
- var featureSchema = z4.object({
107
- id: z4.string().uuid(),
108
- organizationId: z4.string(),
109
- type: featureTypeSchema,
110
- name: z4.string(),
111
- description: z4.string().nullable(),
112
- parentId: z4.string().uuid().nullable(),
113
- order: z4.number().int(),
114
- isExpanded: z4.boolean(),
115
- deletedAt: z4.string().nullable(),
116
- createdAt: z4.string(),
117
- createdBy: z4.string()
118
- });
119
- var roadmapLinkSchema = z4.object({
120
- id: z4.string().uuid(),
114
+ var createExportInputSchema = z4.object({
121
115
  roadmapId: z4.string().uuid(),
122
- roadmap: z4.object({
123
- id: z4.string().uuid(),
124
- title: z4.string(),
125
- status: z4.string(),
126
- horizon: z4.string()
127
- }),
128
- createdAt: z4.string()
129
- });
130
- var featureWithRelationsSchema = featureSchema.extend({
131
- outcomes: z4.array(featureOutcomeSchema),
132
- roadmapLinks: z4.array(roadmapLinkSchema),
133
- children: z4.array(featureSchema).optional()
134
- });
135
- var createFeatureSchema = z4.object({
136
- name: z4.string().min(1),
137
- description: z4.string().nullable().optional(),
138
- type: featureTypeSchema.optional(),
139
- parentId: z4.string().uuid().nullable().optional()
116
+ localEntityType: localEntityTypeSchema,
117
+ localEntityId: z4.string().uuid(),
118
+ externalSystem: externalSystemSchema,
119
+ externalObjectType: z4.string().min(1),
120
+ externalId: z4.string().min(1),
121
+ externalUrl: z4.string().url().optional(),
122
+ metadata: z4.record(z4.unknown()).optional()
140
123
  });
141
- var updateFeatureSchema = z4.object({
142
- name: z4.string().min(1).optional(),
143
- description: z4.string().nullable().optional(),
144
- type: featureTypeSchema.optional(),
145
- parentId: z4.string().uuid().nullable().optional(),
146
- order: z4.number().int().optional()
124
+ var updateExportInputSchema = z4.object({
125
+ externalUrl: z4.string().url().nullable().optional(),
126
+ metadata: z4.record(z4.unknown()).optional()
147
127
  });
148
- var saveFeatureOutcomesSchema = z4.object({
149
- outcomes: z4.array(z4.object({
150
- id: z4.string().uuid().optional(),
151
- description: z4.string()
152
- }))
128
+ var searchExportsInputSchema = z4.object({
129
+ roadmapId: z4.string().uuid().optional(),
130
+ externalSystem: externalSystemSchema.optional(),
131
+ localEntityType: localEntityTypeSchema.optional(),
132
+ localEntityId: z4.string().uuid().optional(),
133
+ limit: z4.number().int().min(1).max(100).optional(),
134
+ offset: z4.number().int().min(0).optional()
153
135
  });
154
- var featureListSchema = z4.array(featureSchema);
155
- // ../../packages/shared/src/schemas/idea.ts
136
+ // ../../packages/shared/src/schemas/feature.ts
156
137
  import { z as z5 } from "zod";
157
- var ideaSchema = z5.object({
138
+ var featureOutcomeSchema = z5.object({
139
+ id: z5.string().uuid(),
140
+ description: z5.string(),
141
+ order: z5.number().int(),
142
+ createdAt: z5.string(),
143
+ updatedAt: z5.string()
144
+ });
145
+ var featureSchema = z5.object({
158
146
  id: z5.string().uuid(),
159
147
  organizationId: z5.string(),
160
- title: z5.string(),
148
+ type: featureTypeSchema,
149
+ name: z5.string(),
161
150
  description: z5.string().nullable(),
162
- status: ideaStatusSchema,
163
- source: z5.string().nullable(),
164
- submittedBy: z5.string().nullable(),
165
- value: effortSchema.nullable(),
166
- effort: effortSchema.nullable(),
151
+ parentId: z5.string().uuid().nullable(),
167
152
  order: z5.number().int(),
153
+ isExpanded: z5.boolean(),
154
+ deletedAt: z5.string().nullable(),
168
155
  createdAt: z5.string(),
169
156
  createdBy: z5.string()
170
157
  });
171
- var createIdeaSchema = z5.object({
172
- title: z5.string().min(1),
158
+ var roadmapLinkSchema = z5.object({
159
+ id: z5.string().uuid(),
160
+ roadmapId: z5.string().uuid(),
161
+ roadmap: z5.object({
162
+ id: z5.string().uuid(),
163
+ title: z5.string(),
164
+ status: z5.string(),
165
+ horizon: z5.string()
166
+ }),
167
+ createdAt: z5.string()
168
+ });
169
+ var featureWithRelationsSchema = featureSchema.extend({
170
+ outcomes: z5.array(featureOutcomeSchema),
171
+ roadmapLinks: z5.array(roadmapLinkSchema),
172
+ children: z5.array(featureSchema).optional()
173
+ });
174
+ var createFeatureSchema = z5.object({
175
+ name: z5.string().min(1),
173
176
  description: z5.string().nullable().optional(),
174
- status: ideaStatusSchema.optional(),
175
- effort: effortSchema.nullable().optional(),
176
- source: z5.string().nullable().optional()
177
+ type: featureTypeSchema.optional(),
178
+ parentId: z5.string().uuid().nullable().optional()
177
179
  });
178
- var updateIdeaSchema = z5.object({
179
- title: z5.string().min(1).optional(),
180
+ var updateFeatureSchema = z5.object({
181
+ name: z5.string().min(1).optional(),
180
182
  description: z5.string().nullable().optional(),
181
- status: ideaStatusSchema.optional(),
182
- effort: effortSchema.nullable().optional(),
183
- source: z5.string().nullable().optional(),
183
+ type: featureTypeSchema.optional(),
184
+ parentId: z5.string().uuid().nullable().optional(),
184
185
  order: z5.number().int().optional()
185
186
  });
186
- var ideaListSchema = z5.array(ideaSchema);
187
- // ../../packages/shared/src/schemas/product.ts
187
+ var saveFeatureOutcomesSchema = z5.object({
188
+ outcomes: z5.array(z5.object({
189
+ id: z5.string().uuid().optional(),
190
+ description: z5.string()
191
+ }))
192
+ });
193
+ var featureListSchema = z5.array(featureSchema);
194
+ // ../../packages/shared/src/schemas/idea.ts
188
195
  import { z as z6 } from "zod";
189
- var productSchema = z6.object({
196
+ var ideaSchema = z6.object({
190
197
  id: z6.string().uuid(),
191
198
  organizationId: z6.string(),
192
- parentId: z6.string().uuid().nullable(),
193
- type: productTypeSchema,
194
- name: z6.string(),
199
+ title: z6.string(),
200
+ description: z6.string().nullable(),
201
+ status: ideaStatusSchema,
202
+ source: z6.string().nullable(),
203
+ submittedBy: z6.string().nullable(),
204
+ value: effortSchema.nullable(),
205
+ effort: effortSchema.nullable(),
195
206
  order: z6.number().int(),
196
- isExpanded: z6.boolean(),
197
- deletedAt: z6.string().nullable(),
198
- createdAt: z6.string()
207
+ createdAt: z6.string(),
208
+ createdBy: z6.string()
199
209
  });
200
- var createProductSchema = z6.object({
201
- name: z6.string().min(1),
210
+ var createIdeaSchema = z6.object({
211
+ title: z6.string().min(1),
202
212
  description: z6.string().nullable().optional(),
203
- type: productTypeSchema,
204
- parentId: z6.string().uuid().nullable().optional()
213
+ status: ideaStatusSchema.optional(),
214
+ effort: effortSchema.nullable().optional(),
215
+ source: z6.string().nullable().optional()
205
216
  });
206
- var updateProductSchema = z6.object({
207
- name: z6.string().min(1).optional(),
217
+ var updateIdeaSchema = z6.object({
218
+ title: z6.string().min(1).optional(),
208
219
  description: z6.string().nullable().optional(),
209
- type: productTypeSchema.optional(),
210
- parentId: z6.string().uuid().nullable().optional(),
220
+ status: ideaStatusSchema.optional(),
221
+ effort: effortSchema.nullable().optional(),
222
+ source: z6.string().nullable().optional(),
211
223
  order: z6.number().int().optional()
212
224
  });
213
- var productListSchema = z6.array(productSchema);
214
- // ../../packages/shared/src/schemas/roadmap.ts
215
- import { z as z8 } from "zod";
216
-
217
- // ../../packages/shared/src/schemas/story.ts
225
+ var ideaListSchema = z6.array(ideaSchema);
226
+ // ../../packages/shared/src/schemas/presentation.ts
218
227
  import { z as z7 } from "zod";
219
- var epicSchema = z7.object({
220
- id: z7.string().uuid(),
221
- roadmapItemId: z7.string().uuid(),
222
- organizationId: z7.string(),
223
- title: z7.string(),
224
- description: z7.string().nullable(),
225
- order: z7.number().int(),
226
- createdAt: z7.string(),
227
- updatedAt: z7.string(),
228
- deletedAt: z7.string().nullable()
229
- });
230
- var storySchema = z7.object({
228
+ var presentationSchema = z7.object({
231
229
  id: z7.string().uuid(),
232
- roadmapItemId: z7.string().uuid(),
233
- epicId: z7.string().uuid().nullable(),
234
230
  organizationId: z7.string(),
235
231
  title: z7.string(),
236
232
  description: z7.string().nullable(),
237
233
  order: z7.number().int(),
238
234
  createdAt: z7.string(),
239
- updatedAt: z7.string(),
240
- deletedAt: z7.string().nullable()
241
- });
242
- var epicWithStoriesSchema = epicSchema.extend({
243
- stories: z7.array(storySchema)
235
+ createdBy: z7.string(),
236
+ updatedAt: z7.string().nullable()
244
237
  });
245
- var createEpicSchema = z7.object({
238
+ var createPresentationSchema = z7.object({
246
239
  title: z7.string().min(1),
247
240
  description: z7.string().nullable().optional()
248
241
  });
249
- var createStorySchema = z7.object({
250
- title: z7.string().min(1),
242
+ var updatePresentationSchema = z7.object({
243
+ title: z7.string().min(1).optional(),
251
244
  description: z7.string().nullable().optional()
252
245
  });
253
- var saveStoriesInputSchema = z7.object({
254
- epics: z7.array(z7.object({
255
- title: z7.string().min(1),
256
- description: z7.string().nullable().optional(),
257
- stories: z7.array(z7.object({
258
- title: z7.string().min(1),
259
- description: z7.string().nullable().optional()
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()
259
+ });
260
+ var createProductSchema = z8.object({
261
+ name: z8.string().min(1),
262
+ description: z8.string().nullable().optional(),
263
+ type: productTypeSchema,
264
+ parentId: z8.string().uuid().nullable().optional()
265
+ });
266
+ var updateProductSchema = z8.object({
267
+ name: z8.string().min(1).optional(),
268
+ description: z8.string().nullable().optional(),
269
+ type: productTypeSchema.optional(),
270
+ parentId: z8.string().uuid().nullable().optional(),
271
+ order: z8.number().int().optional()
272
+ });
273
+ var productListSchema = z8.array(productSchema);
274
+ // ../../packages/shared/src/schemas/roadmap.ts
275
+ import { z as z10 } from "zod";
276
+
277
+ // ../../packages/shared/src/schemas/story.ts
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()
289
+ });
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()
301
+ });
302
+ var epicWithStoriesSchema = epicSchema.extend({
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()
260
320
  })).optional().default([])
261
321
  })).optional().default([]),
262
- stories: z7.array(z7.object({
263
- title: z7.string().min(1),
264
- description: z7.string().nullable().optional()
322
+ stories: z9.array(z9.object({
323
+ title: z9.string().min(1),
324
+ description: z9.string().nullable().optional()
265
325
  })).optional().default([])
266
326
  });
267
- var updateEpicSchema = z7.object({
268
- title: z7.string().min(1).optional(),
269
- description: z7.string().nullable().optional()
327
+ var updateEpicSchema = z9.object({
328
+ title: z9.string().min(1).optional(),
329
+ description: z9.string().nullable().optional()
270
330
  });
271
- var updateStorySchema = z7.object({
272
- title: z7.string().min(1).optional(),
273
- description: z7.string().nullable().optional(),
274
- epicId: z7.string().uuid().nullable().optional()
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()
275
335
  });
276
- var reorderStoriesSchema = z7.object({
277
- epicOrder: z7.array(z7.string().uuid()).optional(),
278
- storyOrder: z7.record(z7.string(), z7.array(z7.string().uuid())).optional(),
279
- standaloneOrder: z7.array(z7.string().uuid()).optional()
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()
280
340
  });
281
341
 
282
342
  // ../../packages/shared/src/schemas/roadmap.ts
283
- var flexibleDateSchema = z8.object({
284
- value: z8.string(),
343
+ var flexibleDateSchema = z10.object({
344
+ value: z10.string(),
285
345
  granularity: dateGranularitySchema
286
346
  });
287
- var labelSchema = z8.object({
288
- id: z8.string().uuid(),
289
- type: z8.enum(["category", "location", "label"]),
290
- name: z8.string(),
291
- color: z8.string().nullable(),
292
- address: z8.string().nullable()
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()
293
353
  });
294
- var appSchema = z8.object({
295
- id: z8.string().uuid(),
296
- name: z8.string()
354
+ var appSchema = z10.object({
355
+ id: z10.string().uuid(),
356
+ name: z10.string()
297
357
  });
298
- var roadmapSchema = z8.object({
299
- id: z8.string().uuid(),
300
- organizationId: z8.string(),
301
- title: z8.string(),
358
+ var roadmapSchema = z10.object({
359
+ id: z10.string().uuid(),
360
+ organizationId: z10.string(),
361
+ title: z10.string(),
302
362
  horizon: horizonSchema.nullable(),
303
363
  status: roadmapStatusSchema.nullable(),
304
364
  value: effortSchema.nullable(),
305
365
  effort: effortSchema.nullable(),
306
- order: z8.number().int(),
307
- estimatedSeconds: z8.number().int().nullable(),
366
+ order: z10.number().int(),
367
+ estimatedSeconds: z10.number().int().nullable(),
308
368
  date: flexibleDateSchema.nullable(),
309
369
  target: flexibleDateSchema.nullable(),
310
- completedAt: z8.string().nullable(),
311
- createdAt: z8.string(),
312
- createdBy: z8.string(),
313
- prompt: z8.string().nullable(),
314
- labels: z8.array(labelSchema),
315
- apps: z8.array(appSchema)
316
- });
317
- var createRoadmapSchema = z8.object({
318
- title: z8.string().min(1),
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)
376
+ });
377
+ var createRoadmapSchema = z10.object({
378
+ title: z10.string().min(1),
319
379
  status: roadmapStatusSchema.optional(),
320
380
  horizon: horizonSchema.optional(),
321
381
  value: effortSchema.nullable().optional(),
322
382
  effort: effortSchema.nullable().optional(),
323
- estimatedSeconds: z8.number().int().nullable().optional(),
383
+ estimatedSeconds: z10.number().int().nullable().optional(),
324
384
  date: flexibleDateSchema.nullable().optional(),
325
385
  target: flexibleDateSchema.nullable().optional(),
326
- prompt: z8.string().nullable().optional(),
327
- brainstormNotes: z8.string().nullable().optional()
386
+ prompt: z10.string().nullable().optional(),
387
+ brainstormNotes: z10.string().nullable().optional()
328
388
  });
329
- var updateRoadmapSchema = z8.object({
330
- title: z8.string().min(1).optional(),
389
+ var updateRoadmapSchema = z10.object({
390
+ title: z10.string().min(1).optional(),
331
391
  status: roadmapStatusSchema.optional(),
332
392
  horizon: horizonSchema.optional(),
333
393
  value: effortSchema.nullable().optional(),
334
394
  effort: effortSchema.nullable().optional(),
335
- order: z8.number().int().optional(),
336
- estimatedSeconds: z8.number().int().nullable().optional(),
395
+ order: z10.number().int().optional(),
396
+ estimatedSeconds: z10.number().int().nullable().optional(),
337
397
  date: flexibleDateSchema.nullable().optional(),
338
398
  target: flexibleDateSchema.nullable().optional(),
339
- prompt: z8.string().nullable().optional(),
340
- brainstormNotes: z8.string().nullable().optional()
399
+ prompt: z10.string().nullable().optional(),
400
+ brainstormNotes: z10.string().nullable().optional()
341
401
  });
342
- var prdOutcomeSchema = z8.object({
343
- id: z8.string().uuid(),
344
- description: z8.string(),
402
+ var prdOutcomeSchema = z10.object({
403
+ id: z10.string().uuid(),
404
+ description: z10.string(),
345
405
  status: prdStatusSchema,
346
- order: z8.number().int(),
347
- completedAt: z8.string().nullable()
406
+ order: z10.number().int(),
407
+ completedAt: z10.string().nullable()
348
408
  });
349
- var prdSchema = z8.object({
350
- id: z8.string().uuid(),
351
- what: z8.string().nullable(),
352
- why: z8.string().nullable(),
353
- outcomes: z8.array(prdOutcomeSchema)
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)
354
414
  });
355
- var savePrdInputSchema = z8.object({
356
- what: z8.string().nullable(),
357
- why: z8.string().nullable(),
415
+ var savePrdInputSchema = z10.object({
416
+ what: z10.string().nullable(),
417
+ why: z10.string().nullable(),
358
418
  status: prdStatusSchema,
359
- outcomes: z8.array(z8.object({
360
- id: z8.string().uuid().optional(),
361
- description: z8.string(),
362
- order: z8.number().int().min(0)
419
+ outcomes: z10.array(z10.object({
420
+ id: z10.string().uuid().optional(),
421
+ description: z10.string(),
422
+ order: z10.number().int().min(0)
363
423
  }))
364
424
  });
365
- var brainstormMediaSchema = z8.object({
366
- id: z8.string().uuid(),
367
- mediaUrl: z8.string(),
425
+ var brainstormMediaSchema = z10.object({
426
+ id: z10.string().uuid(),
427
+ mediaUrl: z10.string(),
368
428
  mediaType: brainstormMediaTypeSchema,
369
- description: z8.string().nullable(),
370
- order: z8.number().int(),
371
- createdAt: z8.string()
429
+ description: z10.string().nullable(),
430
+ order: z10.number().int(),
431
+ createdAt: z10.string()
372
432
  });
373
- var wireframeSchema = z8.object({
374
- id: z8.string().uuid(),
375
- description: z8.string().nullable(),
376
- imageUrl: z8.string().nullable(),
377
- order: z8.number().int()
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()
378
438
  });
379
- var prototypeSchema = z8.object({
380
- id: z8.string().uuid(),
381
- publicUrl: z8.string().url(),
382
- expiresAt: z8.string().datetime(),
383
- fileCount: z8.number().int().positive(),
384
- entryPoint: z8.string(),
385
- createdAt: z8.string().datetime()
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()
386
446
  });
387
- var featureLinkSchema = z8.object({
388
- id: z8.string().uuid(),
389
- featureId: z8.string().uuid(),
390
- feature: z8.object({
391
- id: z8.string().uuid(),
392
- name: z8.string(),
393
- type: z8.enum(["area", "feature"])
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"])
394
454
  }),
395
- createdAt: z8.string()
455
+ createdAt: z10.string()
396
456
  });
397
- var phaseDesignSchema = z8.object({
398
- id: z8.string().uuid(),
399
- description: z8.string().nullable()
457
+ var phaseDesignSchema = z10.object({
458
+ id: z10.string().uuid(),
459
+ description: z10.string().nullable()
400
460
  });
401
- var phasePlanSchema = z8.object({
402
- id: z8.string().uuid(),
403
- description: z8.string().nullable()
461
+ var phasePlanSchema = z10.object({
462
+ id: z10.string().uuid(),
463
+ description: z10.string().nullable()
404
464
  });
405
- var phaseBuildSchema = z8.object({
406
- id: z8.string().uuid(),
407
- description: z8.string().nullable(),
408
- prompt: z8.string().nullable()
465
+ var phaseBuildSchema = z10.object({
466
+ id: z10.string().uuid(),
467
+ description: z10.string().nullable(),
468
+ prompt: z10.string().nullable()
409
469
  });
410
- var phaseReleaseSchema = z8.object({
411
- id: z8.string().uuid(),
412
- description: z8.string().nullable()
470
+ var phaseReleaseSchema = z10.object({
471
+ id: z10.string().uuid(),
472
+ description: z10.string().nullable()
413
473
  });
414
474
  var roadmapDetailSchema = roadmapSchema.extend({
415
475
  prd: prdSchema.nullable(),
416
- wireframes: z8.array(wireframeSchema),
417
- prototypes: z8.array(prototypeSchema),
418
- brainstormMedia: z8.array(brainstormMediaSchema),
419
- brainstormNotes: z8.string().nullable(),
420
- featureLinks: z8.array(featureLinkSchema),
421
- epics: z8.array(epicWithStoriesSchema),
422
- stories: z8.array(storySchema),
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),
423
483
  design: phaseDesignSchema.nullable(),
424
484
  plan: phasePlanSchema.nullable(),
425
485
  build: phaseBuildSchema.nullable(),
426
- release: phaseReleaseSchema.nullable()
486
+ release: phaseReleaseSchema.nullable(),
487
+ exports: z10.array(exportSchema)
427
488
  });
428
- var roadmapListSchema = z8.array(roadmapSchema);
489
+ var roadmapListSchema = z10.array(roadmapSchema);
429
490
  // ../../packages/shared/src/schemas/scenario.ts
430
- import { z as z9 } from "zod";
431
- var scenarioSchema = z9.object({
432
- id: z9.string().uuid(),
433
- title: z9.string().min(1),
434
- given: z9.string().nullable(),
435
- when: z9.string().nullable(),
436
- then: z9.string().nullable(),
437
- order: z9.number().int(),
438
- createdAt: z9.string().datetime(),
439
- updatedAt: z9.string().datetime()
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()
440
501
  });
441
- var createScenarioSchema = z9.object({
442
- title: z9.string().min(1),
443
- given: z9.string().nullable().optional(),
444
- when: z9.string().nullable().optional(),
445
- then: z9.string().nullable().optional(),
446
- roadmapId: z9.string().uuid()
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()
447
508
  });
448
- var updateScenarioSchema = z9.object({
449
- title: z9.string().min(1).optional(),
450
- given: z9.string().nullable().optional(),
451
- when: z9.string().nullable().optional(),
452
- then: z9.string().nullable().optional(),
453
- order: z9.number().int().optional()
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()
532
+ });
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()
454
542
  });
455
- var scenarioListSchema = z9.array(scenarioSchema);
543
+ var slideListSchema = z12.array(slideSchema);
456
544
  // ../../packages/shared/src/schemas/status-update.ts
457
- import { z as z10 } from "zod";
458
- var statusUpdateItemSchema = z10.object({
459
- id: z10.string().uuid(),
460
- roadmapItemId: z10.string().uuid(),
461
- titleAtSnapshot: z10.string(),
462
- statusAtSnapshot: z10.string(),
463
- designWalkthroughUrl: z10.string().nullable(),
464
- releaseWalkthroughUrl: z10.string().nullable()
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()
465
553
  });
466
- var statusUpdateSchema = z10.object({
467
- id: z10.string().uuid(),
468
- title: z10.string().nullable(),
469
- startDate: z10.string(),
470
- endDate: z10.string(),
471
- content: z10.string(),
472
- createdAt: z10.string(),
473
- items: z10.array(statusUpdateItemSchema).optional()
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()
474
562
  });
475
- var statusUpdateListSchema = z10.array(statusUpdateSchema);
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);
476
586
  // src/tools/index.ts
477
- import { z as z11 } from "zod";
587
+ import { z as z15 } from "zod";
478
588
 
479
589
  // src/auth.ts
480
590
  function getCredentials() {
@@ -971,6 +1081,160 @@ class ApiClient {
971
1081
  throw new Error(`Upload failed: ${response.status} ${response.statusText}`);
972
1082
  }
973
1083
  }
1084
+ async searchExports(params) {
1085
+ const searchParams = new URLSearchParams;
1086
+ if (params?.roadmapId)
1087
+ searchParams.set("roadmapId", params.roadmapId);
1088
+ if (params?.externalSystem)
1089
+ searchParams.set("externalSystem", params.externalSystem);
1090
+ if (params?.localEntityType)
1091
+ searchParams.set("localEntityType", params.localEntityType);
1092
+ if (params?.localEntityId)
1093
+ searchParams.set("localEntityId", params.localEntityId);
1094
+ if (params?.limit)
1095
+ searchParams.set("limit", String(params.limit));
1096
+ if (params?.offset)
1097
+ searchParams.set("offset", String(params.offset));
1098
+ const queryString = searchParams.toString();
1099
+ const path = queryString ? `/v1/exports?${queryString}` : "/v1/exports";
1100
+ return await this.request(path);
1101
+ }
1102
+ async getExport(id) {
1103
+ const response = await this.request(`/v1/exports/${id}`);
1104
+ return response.data;
1105
+ }
1106
+ async createExport(data) {
1107
+ const response = await this.request("/v1/exports", {
1108
+ method: "POST",
1109
+ body: JSON.stringify(data)
1110
+ });
1111
+ return response.data;
1112
+ }
1113
+ async updateExport(id, data) {
1114
+ const response = await this.request(`/v1/exports/${id}`, {
1115
+ method: "PATCH",
1116
+ body: JSON.stringify(data)
1117
+ });
1118
+ return response.data;
1119
+ }
1120
+ async deleteExport(id) {
1121
+ await this.request(`/v1/exports/${id}`, { method: "DELETE" });
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
+ }
974
1238
  }
975
1239
  var client = null;
976
1240
  function getApiClient() {
@@ -996,6 +1260,7 @@ function inferContentType(filename) {
996
1260
  return ext ? mapping[ext] ?? null : null;
997
1261
  }
998
1262
  function registerAllTools(server) {
1263
+ registerGetWorkflows(server);
999
1264
  registerSearchRoadmaps(server);
1000
1265
  registerGetRoadmap(server);
1001
1266
  registerSearchFeatures(server);
@@ -1054,26 +1319,79 @@ function registerAllTools(server) {
1054
1319
  registerUploadDesignWalkthrough(server);
1055
1320
  registerUploadReleaseWalkthrough(server);
1056
1321
  registerPublishPrototype(server);
1322
+ registerSearchExports(server);
1323
+ registerGetExport(server);
1324
+ registerCreateExport(server);
1325
+ registerUpdateExport(server);
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);
1347
+ }
1348
+ function registerGetWorkflows(server) {
1349
+ server.registerTool("get_workflows", {
1350
+ description: "Get all workflow definitions with phases and steps. Use this to know valid phases/steps when updating roadmap items.",
1351
+ inputSchema: {}
1352
+ }, async () => {
1353
+ const client2 = getApiClient();
1354
+ const response = await client2.get("/v1/workflows");
1355
+ return {
1356
+ content: [
1357
+ {
1358
+ type: "text",
1359
+ text: JSON.stringify(response, null, 2)
1360
+ }
1361
+ ]
1362
+ };
1363
+ });
1057
1364
  }
1058
1365
  function registerSearchRoadmaps(server) {
1059
1366
  server.registerTool("search_roadmaps", {
1060
1367
  description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
1061
1368
  inputSchema: {
1062
- query: z11.string().optional().describe("Search query to match against title or description"),
1369
+ query: z15.string().optional().describe("Search query to match against title or description"),
1063
1370
  status: roadmapStatusSchema.optional().describe("Filter by status"),
1064
1371
  horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1065
- limit: z11.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1066
- offset: z11.number().int().min(0).optional().describe("Number of items to skip (default 0)")
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)")
1067
1376
  }
1068
1377
  }, async ({
1069
1378
  query,
1070
1379
  status,
1071
1380
  horizon,
1381
+ phase,
1382
+ phaseStep,
1072
1383
  limit,
1073
1384
  offset
1074
1385
  }) => {
1075
1386
  const client2 = getApiClient();
1076
- const response = await client2.listRoadmaps({ limit, offset, horizon, query });
1387
+ const response = await client2.listRoadmaps({
1388
+ limit,
1389
+ offset,
1390
+ horizon,
1391
+ query,
1392
+ phase,
1393
+ phaseStep
1394
+ });
1077
1395
  let roadmaps = response.items;
1078
1396
  if (status) {
1079
1397
  roadmaps = roadmaps.filter((r) => r.status === status);
@@ -1088,6 +1406,8 @@ function registerSearchRoadmaps(server) {
1088
1406
  title: r.title,
1089
1407
  status: r.status,
1090
1408
  horizon: r.horizon,
1409
+ phase: r.phase,
1410
+ phaseStep: r.phaseStep,
1091
1411
  value: r.value,
1092
1412
  effort: r.effort,
1093
1413
  order: r.order
@@ -1103,7 +1423,7 @@ function registerGetRoadmap(server) {
1103
1423
  server.registerTool("get_roadmap", {
1104
1424
  description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
1105
1425
  inputSchema: {
1106
- id: z11.string().describe("The UUID of the roadmap item")
1426
+ id: z15.string().describe("The UUID of the roadmap item")
1107
1427
  }
1108
1428
  }, async ({ id }) => {
1109
1429
  const client2 = getApiClient();
@@ -1157,7 +1477,7 @@ function registerSearchFeatures(server) {
1157
1477
  server.registerTool("search_features", {
1158
1478
  description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
1159
1479
  inputSchema: {
1160
- query: z11.string().optional().describe("Search query to match against name"),
1480
+ query: z15.string().optional().describe("Search query to match against name"),
1161
1481
  type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
1162
1482
  }
1163
1483
  }, async ({ query, type }) => {
@@ -1189,7 +1509,7 @@ function registerGetFeature(server) {
1189
1509
  server.registerTool("get_feature", {
1190
1510
  description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
1191
1511
  inputSchema: {
1192
- id: z11.string().describe("The UUID of the feature")
1512
+ id: z15.string().describe("The UUID of the feature")
1193
1513
  }
1194
1514
  }, async ({ id }) => {
1195
1515
  const client2 = getApiClient();
@@ -1228,7 +1548,7 @@ function registerSearchIdeas(server) {
1228
1548
  server.registerTool("search_ideas", {
1229
1549
  description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
1230
1550
  inputSchema: {
1231
- query: z11.string().optional().describe("Search query to match against title or description"),
1551
+ query: z15.string().optional().describe("Search query to match against title or description"),
1232
1552
  status: ideaStatusSchema.optional().describe("Filter by status")
1233
1553
  }
1234
1554
  }, async ({ query, status }) => {
@@ -1328,9 +1648,9 @@ function registerCaptureIdea(server) {
1328
1648
  server.registerTool("capture_idea", {
1329
1649
  description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
1330
1650
  inputSchema: {
1331
- title: z11.string().describe("Title of the idea"),
1332
- description: z11.string().optional().describe("Detailed description of the idea"),
1333
- source: z11.string().optional().describe('Source of the idea (defaults to "claude-code")')
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")')
1334
1654
  }
1335
1655
  }, async ({
1336
1656
  title,
@@ -1367,19 +1687,23 @@ function registerCreateRoadmapItem(server) {
1367
1687
  server.registerTool("create_roadmap_item", {
1368
1688
  description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
1369
1689
  inputSchema: {
1370
- title: z11.string().describe("Title of the roadmap item"),
1690
+ title: z15.string().describe("Title of the roadmap item"),
1371
1691
  status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
1372
1692
  horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1373
- initiativeId: z11.string().optional().describe("UUID of initiative to link this item to on creation"),
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"),
1374
1696
  dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1375
- dateValue: z11.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1697
+ dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1376
1698
  targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1377
- targetValue: z11.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1699
+ targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1378
1700
  }
1379
1701
  }, async ({
1380
1702
  title,
1381
1703
  status,
1382
1704
  horizon,
1705
+ phase,
1706
+ phaseStep,
1383
1707
  initiativeId,
1384
1708
  dateGranularity,
1385
1709
  dateValue,
@@ -1392,6 +1716,10 @@ function registerCreateRoadmapItem(server) {
1392
1716
  status: status ?? "not_started",
1393
1717
  horizon: horizon ?? "inbox"
1394
1718
  };
1719
+ if (phase)
1720
+ createData.phase = phase;
1721
+ if (phaseStep)
1722
+ createData.phaseStep = phaseStep;
1395
1723
  if (initiativeId) {
1396
1724
  createData.initiativeId = initiativeId;
1397
1725
  }
@@ -1419,6 +1747,8 @@ function registerCreateRoadmapItem(server) {
1419
1747
  title: roadmap2.title,
1420
1748
  status: roadmap2.status,
1421
1749
  horizon: roadmap2.horizon,
1750
+ phase: roadmap2.phase,
1751
+ phaseStep: roadmap2.phaseStep,
1422
1752
  date: roadmap2.date,
1423
1753
  target: roadmap2.target
1424
1754
  }
@@ -1428,34 +1758,38 @@ function registerCreateRoadmapItem(server) {
1428
1758
  };
1429
1759
  });
1430
1760
  }
1431
- var effortSizeSchema = z11.enum(["xs", "s", "m", "l", "xl"]);
1761
+ var effortSizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
1432
1762
  function registerUpdateRoadmapItem(server) {
1433
1763
  server.registerTool("update_roadmap_item", {
1434
- description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, or brainstorm notes.",
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.",
1435
1765
  inputSchema: {
1436
- id: z11.string().describe("The UUID of the roadmap item to update"),
1437
- title: z11.string().optional().describe("New title"),
1766
+ id: z15.string().describe("The UUID of the roadmap item to update"),
1767
+ title: z15.string().optional().describe("New title"),
1438
1768
  status: roadmapStatusSchema.optional().describe("New status"),
1439
1769
  horizon: horizonSchema.optional().describe("New planning horizon"),
1440
- value: z11.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest 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)"),
1441
1773
  effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
1442
- order: z11.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
1443
- initiativeId: z11.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
1444
- designDescription: z11.string().nullable().optional().describe("Description for the Design phase"),
1445
- planDescription: z11.string().nullable().optional().describe("Description for the Planning phase"),
1446
- buildDescription: z11.string().nullable().optional().describe("Description for the Build phase"),
1447
- releaseDescription: z11.string().nullable().optional().describe("Description for the Release phase"),
1448
- prompt: z11.string().nullable().optional().describe("Build prompt for the roadmap item"),
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"),
1449
1781
  dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1450
- dateValue: z11.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1782
+ dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1451
1783
  targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1452
- targetValue: z11.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1784
+ targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1453
1785
  }
1454
1786
  }, async ({
1455
1787
  id,
1456
1788
  title,
1457
1789
  status,
1458
1790
  horizon,
1791
+ phase,
1792
+ phaseStep,
1459
1793
  value,
1460
1794
  effort,
1461
1795
  order,
@@ -1478,6 +1812,10 @@ function registerUpdateRoadmapItem(server) {
1478
1812
  updates.status = status;
1479
1813
  if (horizon !== undefined)
1480
1814
  updates.horizon = horizon;
1815
+ if (phase !== undefined)
1816
+ updates.phase = phase;
1817
+ if (phaseStep !== undefined)
1818
+ updates.phaseStep = phaseStep;
1481
1819
  if (value !== undefined)
1482
1820
  updates.value = value;
1483
1821
  if (effort !== undefined)
@@ -1535,6 +1873,8 @@ function registerUpdateRoadmapItem(server) {
1535
1873
  title: roadmap2.title,
1536
1874
  status: roadmap2.status,
1537
1875
  horizon: roadmap2.horizon,
1876
+ phase: roadmap2.phase,
1877
+ phaseStep: roadmap2.phaseStep,
1538
1878
  value: roadmap2.value,
1539
1879
  effort: roadmap2.effort,
1540
1880
  order: roadmap2.order,
@@ -1552,12 +1892,12 @@ function registerAddFeature(server) {
1552
1892
  server.registerTool("add_feature", {
1553
1893
  description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
1554
1894
  inputSchema: {
1555
- name: z11.string().describe("Name of the feature"),
1556
- description: z11.string().optional().describe("Description of the feature"),
1895
+ name: z15.string().describe("Name of the feature"),
1896
+ description: z15.string().optional().describe("Description of the feature"),
1557
1897
  type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
1558
- parentId: z11.string().optional().describe("UUID of parent feature/area to nest under"),
1559
- outcomes: z11.array(z11.string()).optional().describe("List of expected outcomes for this feature"),
1560
- linkToRoadmapId: z11.string().optional().describe("UUID of roadmap item to link this feature to")
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")
1561
1901
  }
1562
1902
  }, async ({
1563
1903
  name,
@@ -1604,10 +1944,10 @@ function registerSavePrd(server) {
1604
1944
  server.registerTool("save_prd", {
1605
1945
  description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
1606
1946
  inputSchema: {
1607
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
1608
- what: z11.string().nullable().describe("What is being built - the feature description"),
1609
- why: z11.string().nullable().describe("Why this is being built - the business justification"),
1610
- outcomes: z11.array(z11.string()).optional().describe("List of expected outcomes/success criteria")
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")
1611
1951
  }
1612
1952
  }, async ({
1613
1953
  roadmapId,
@@ -1645,8 +1985,8 @@ function registerUpdateBrainstormNotes(server) {
1645
1985
  server.registerTool("update_brainstorm_notes", {
1646
1986
  description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
1647
1987
  inputSchema: {
1648
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
1649
- notes: z11.string().describe("The brainstorm notes content")
1988
+ roadmapId: z15.string().describe("The UUID of the roadmap item"),
1989
+ notes: z15.string().describe("The brainstorm notes content")
1650
1990
  }
1651
1991
  }, async ({ roadmapId, notes }) => {
1652
1992
  const client2 = getApiClient();
@@ -1675,7 +2015,7 @@ function registerDeleteRoadmapItem(server) {
1675
2015
  server.registerTool("delete_roadmap_item", {
1676
2016
  description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
1677
2017
  inputSchema: {
1678
- id: z11.string().describe("The UUID of the roadmap item to delete")
2018
+ id: z15.string().describe("The UUID of the roadmap item to delete")
1679
2019
  }
1680
2020
  }, async ({ id }) => {
1681
2021
  const client2 = getApiClient();
@@ -1697,9 +2037,9 @@ function registerReorderRoadmaps(server) {
1697
2037
  server.registerTool("reorder_roadmaps", {
1698
2038
  description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
1699
2039
  inputSchema: {
1700
- items: z11.array(z11.object({
1701
- id: z11.string().describe("The UUID of the roadmap item"),
1702
- order: z11.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
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)")
1703
2043
  })).describe("Array of roadmap items with their new order values")
1704
2044
  }
1705
2045
  }, async ({ items }) => {
@@ -1723,10 +2063,10 @@ function registerUpdateFeature(server) {
1723
2063
  server.registerTool("update_feature", {
1724
2064
  description: "Update an existing feature. Can update name, type, or parent.",
1725
2065
  inputSchema: {
1726
- id: z11.string().describe("The UUID of the feature to update"),
1727
- name: z11.string().optional().describe("New name for the feature"),
2066
+ id: z15.string().describe("The UUID of the feature to update"),
2067
+ name: z15.string().optional().describe("New name for the feature"),
1728
2068
  type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
1729
- parentId: z11.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2069
+ parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
1730
2070
  }
1731
2071
  }, async ({
1732
2072
  id,
@@ -1765,7 +2105,7 @@ function registerDeleteFeature(server) {
1765
2105
  server.registerTool("delete_feature", {
1766
2106
  description: "Delete a feature. This is a soft delete that also deletes all child features.",
1767
2107
  inputSchema: {
1768
- id: z11.string().describe("The UUID of the feature to delete")
2108
+ id: z15.string().describe("The UUID of the feature to delete")
1769
2109
  }
1770
2110
  }, async ({ id }) => {
1771
2111
  const client2 = getApiClient();
@@ -1787,7 +2127,7 @@ function registerGetIdea(server) {
1787
2127
  server.registerTool("get_idea", {
1788
2128
  description: "Get full details of a single idea by ID.",
1789
2129
  inputSchema: {
1790
- id: z11.string().describe("The UUID of the idea")
2130
+ id: z15.string().describe("The UUID of the idea")
1791
2131
  }
1792
2132
  }, async ({ id }) => {
1793
2133
  const client2 = getApiClient();
@@ -1816,12 +2156,12 @@ function registerUpdateIdea(server) {
1816
2156
  server.registerTool("update_idea", {
1817
2157
  description: "Update an existing idea. Can update title, description, status, value, or effort.",
1818
2158
  inputSchema: {
1819
- id: z11.string().describe("The UUID of the idea to update"),
1820
- title: z11.string().optional().describe("New title"),
1821
- description: z11.string().nullable().optional().describe("New 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"),
1822
2162
  status: ideaStatusSchema.optional().describe("New status"),
1823
- value: z11.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
1824
- effort: z11.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated 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")
1825
2165
  }
1826
2166
  }, async ({
1827
2167
  id,
@@ -1868,7 +2208,7 @@ function registerDeleteIdea(server) {
1868
2208
  server.registerTool("delete_idea", {
1869
2209
  description: "Delete an idea. This is a soft delete.",
1870
2210
  inputSchema: {
1871
- id: z11.string().describe("The UUID of the idea to delete")
2211
+ id: z15.string().describe("The UUID of the idea to delete")
1872
2212
  }
1873
2213
  }, async ({ id }) => {
1874
2214
  const client2 = getApiClient();
@@ -1907,8 +2247,8 @@ function registerUpdateStrategy(server) {
1907
2247
  server.registerTool("update_strategy", {
1908
2248
  description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
1909
2249
  inputSchema: {
1910
- vision: z11.string().nullable().optional().describe("The vision statement - where the product is headed"),
1911
- mission: z11.string().nullable().optional().describe("The mission statement - why the product exists")
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")
1912
2252
  }
1913
2253
  }, async ({ vision, mission }) => {
1914
2254
  const client2 = getApiClient();
@@ -1956,8 +2296,8 @@ function registerCreateScenario(server) {
1956
2296
  server.registerTool("create_scenario", {
1957
2297
  description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
1958
2298
  inputSchema: {
1959
- title: z11.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
1960
- description: z11.string().nullable().optional().describe("Detailed description of the scenario workflow")
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")
1961
2301
  }
1962
2302
  }, async ({ title, description }) => {
1963
2303
  const client2 = getApiClient();
@@ -1986,9 +2326,9 @@ function registerUpdateScenario(server) {
1986
2326
  server.registerTool("update_scenario", {
1987
2327
  description: "Update an existing scenario.",
1988
2328
  inputSchema: {
1989
- id: z11.string().describe("The UUID of the scenario to update"),
1990
- title: z11.string().optional().describe("New title"),
1991
- description: z11.string().nullable().optional().describe("New 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")
1992
2332
  }
1993
2333
  }, async ({
1994
2334
  id,
@@ -2023,7 +2363,7 @@ function registerDeleteScenario(server) {
2023
2363
  server.registerTool("delete_scenario", {
2024
2364
  description: "Delete a scenario. This is a soft delete.",
2025
2365
  inputSchema: {
2026
- id: z11.string().describe("The UUID of the scenario to delete")
2366
+ id: z15.string().describe("The UUID of the scenario to delete")
2027
2367
  }
2028
2368
  }, async ({ id }) => {
2029
2369
  const client2 = getApiClient();
@@ -2038,7 +2378,7 @@ function registerDeleteScenario(server) {
2038
2378
  };
2039
2379
  });
2040
2380
  }
2041
- var productTypeSchema2 = z11.enum([
2381
+ var productTypeSchema2 = z15.enum([
2042
2382
  "brand",
2043
2383
  "product",
2044
2384
  "app",
@@ -2051,8 +2391,8 @@ function registerCreateProduct(server) {
2051
2391
  description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
2052
2392
  inputSchema: {
2053
2393
  type: productTypeSchema2.describe("Type of product"),
2054
- name: z11.string().describe("Name of the product"),
2055
- parentId: z11.string().nullable().optional().describe("UUID of parent product to nest under")
2394
+ name: z15.string().describe("Name of the product"),
2395
+ parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
2056
2396
  }
2057
2397
  }, async ({
2058
2398
  type,
@@ -2087,9 +2427,9 @@ function registerUpdateProduct(server) {
2087
2427
  server.registerTool("update_product", {
2088
2428
  description: "Update an existing product.",
2089
2429
  inputSchema: {
2090
- id: z11.string().describe("The UUID of the product to update"),
2091
- name: z11.string().optional().describe("New name"),
2092
- parentId: z11.string().nullable().optional().describe("New parent product UUID, or null to move to root")
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")
2093
2433
  }
2094
2434
  }, async ({ id, name, parentId }) => {
2095
2435
  const client2 = getApiClient();
@@ -2121,7 +2461,7 @@ function registerDeleteProduct(server) {
2121
2461
  server.registerTool("delete_product", {
2122
2462
  description: "Delete a product. This is a soft delete that also deletes all child products.",
2123
2463
  inputSchema: {
2124
- id: z11.string().describe("The UUID of the product to delete")
2464
+ id: z15.string().describe("The UUID of the product to delete")
2125
2465
  }
2126
2466
  }, async ({ id }) => {
2127
2467
  const client2 = getApiClient();
@@ -2144,7 +2484,7 @@ function registerGetProduct(server) {
2144
2484
  server.registerTool("get_product", {
2145
2485
  description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
2146
2486
  inputSchema: {
2147
- id: z11.string().describe("The UUID of the product")
2487
+ id: z15.string().describe("The UUID of the product")
2148
2488
  }
2149
2489
  }, async ({ id }) => {
2150
2490
  const client2 = getApiClient();
@@ -2181,7 +2521,7 @@ function registerSearchProducts(server) {
2181
2521
  server.registerTool("search_products", {
2182
2522
  description: "Search for products by name. Returns a list of matching products with basic info.",
2183
2523
  inputSchema: {
2184
- query: z11.string().optional().describe("Search query to match against product name"),
2524
+ query: z15.string().optional().describe("Search query to match against product name"),
2185
2525
  type: productTypeSchema2.optional().describe("Filter by product type")
2186
2526
  }
2187
2527
  }, async ({ query, type }) => {
@@ -2216,7 +2556,7 @@ function registerGetProductDocumentation(server) {
2216
2556
  server.registerTool("get_product_documentation", {
2217
2557
  description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
2218
2558
  inputSchema: {
2219
- productId: z11.string().describe("The UUID of the product")
2559
+ productId: z15.string().describe("The UUID of the product")
2220
2560
  }
2221
2561
  }, async ({ productId }) => {
2222
2562
  const client2 = getApiClient();
@@ -2244,9 +2584,9 @@ function registerUpdateProductDocumentation(server) {
2244
2584
  server.registerTool("update_product_documentation", {
2245
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.",
2246
2586
  inputSchema: {
2247
- productId: z11.string().describe("The UUID of the product"),
2248
- designSystem: z11.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2249
- adrs: z11.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
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.")
2250
2590
  }
2251
2591
  }, async ({
2252
2592
  productId,
@@ -2283,8 +2623,8 @@ function registerCreateAudience(server) {
2283
2623
  server.registerTool("create_audience", {
2284
2624
  description: "Create a new audience member. Audiences represent who the product serves.",
2285
2625
  inputSchema: {
2286
- name: z11.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
2287
- description: z11.string().nullable().optional().describe("Description of the audience")
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")
2288
2628
  }
2289
2629
  }, async ({ name, description }) => {
2290
2630
  const client2 = getApiClient();
@@ -2313,9 +2653,9 @@ function registerUpdateAudience(server) {
2313
2653
  server.registerTool("update_audience", {
2314
2654
  description: "Update an existing audience member.",
2315
2655
  inputSchema: {
2316
- id: z11.string().describe("The UUID of the audience to update"),
2317
- name: z11.string().optional().describe("New name"),
2318
- description: z11.string().nullable().optional().describe("New 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")
2319
2659
  }
2320
2660
  }, async ({
2321
2661
  id,
@@ -2350,7 +2690,7 @@ function registerDeleteAudience(server) {
2350
2690
  server.registerTool("delete_audience", {
2351
2691
  description: "Delete an audience member. This is a soft delete.",
2352
2692
  inputSchema: {
2353
- id: z11.string().describe("The UUID of the audience to delete")
2693
+ id: z15.string().describe("The UUID of the audience to delete")
2354
2694
  }
2355
2695
  }, async ({ id }) => {
2356
2696
  const client2 = getApiClient();
@@ -2392,9 +2732,9 @@ function registerGetHistory(server) {
2392
2732
  server.registerTool("get_history", {
2393
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.",
2394
2734
  inputSchema: {
2395
- startDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2396
- endDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
2397
- entityType: z11.enum([
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([
2398
2738
  "roadmap",
2399
2739
  "feature",
2400
2740
  "idea",
@@ -2426,8 +2766,8 @@ function registerGetHistorySummary(server) {
2426
2766
  server.registerTool("get_history_summary", {
2427
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.",
2428
2768
  inputSchema: {
2429
- startDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2430
- endDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
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")
2431
2771
  }
2432
2772
  }, async ({ startDate, endDate }) => {
2433
2773
  const client2 = getApiClient();
@@ -2446,13 +2786,13 @@ function registerCreateStatusUpdate(server) {
2446
2786
  server.registerTool("create_status_update", {
2447
2787
  description: "Create a new status report. Use this after generating the report content from history events.",
2448
2788
  inputSchema: {
2449
- startDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
2450
- endDate: z11.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
2451
- content: z11.string().describe("The markdown content of the status report"),
2452
- title: z11.string().optional().describe("Optional title for the report"),
2453
- items: z11.array(z11.object({
2454
- roadmapItemId: z11.string().describe("UUID of the roadmap item"),
2455
- status: z11.string().describe("Status of the item at report creation time")
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")
2456
2796
  })).optional().describe("Roadmap items to include in the report snapshot")
2457
2797
  }
2458
2798
  }, async ({
@@ -2493,18 +2833,18 @@ function registerSaveStories(server) {
2493
2833
  server.registerTool("save_stories", {
2494
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.",
2495
2835
  inputSchema: {
2496
- roadmapId: z11.string().uuid().describe("The UUID of the roadmap item"),
2497
- epics: z11.array(z11.object({
2498
- title: z11.string().min(1).describe("Title of the epic"),
2499
- description: z11.string().nullable().optional().describe("Description of the epic"),
2500
- stories: z11.array(z11.object({
2501
- title: z11.string().min(1).describe("Title of the story"),
2502
- description: z11.string().nullable().optional().describe("Description of the story")
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")
2503
2843
  })).optional().describe("Stories within this epic")
2504
2844
  })).optional().describe("List of epics with their nested stories"),
2505
- stories: z11.array(z11.object({
2506
- title: z11.string().min(1).describe("Title of the story"),
2507
- description: z11.string().nullable().optional().describe("Description of the story")
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")
2508
2848
  })).optional().describe("List of standalone stories (not part of any epic)")
2509
2849
  }
2510
2850
  }, async ({
@@ -2536,10 +2876,10 @@ function registerUploadWireframe(server) {
2536
2876
  server.registerTool("upload_wireframe", {
2537
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.",
2538
2878
  inputSchema: {
2539
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
2540
- filePath: z11.string().describe("Absolute path to the image file on disk"),
2541
- description: z11.string().optional().describe("Optional description of the wireframe"),
2542
- outcomeIds: z11.array(z11.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
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")
2543
2883
  }
2544
2884
  }, async ({
2545
2885
  roadmapId,
@@ -2593,9 +2933,9 @@ function registerUpdateWireframe(server) {
2593
2933
  server.registerTool("update_wireframe", {
2594
2934
  description: "Update a wireframe's description or outcome tags.",
2595
2935
  inputSchema: {
2596
- id: z11.string().describe("The UUID of the wireframe"),
2597
- description: z11.string().nullable().optional().describe("New description for the wireframe"),
2598
- outcomeIds: z11.array(z11.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
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)")
2599
2939
  }
2600
2940
  }, async ({
2601
2941
  id,
@@ -2631,7 +2971,7 @@ function registerDeleteWireframe(server) {
2631
2971
  server.registerTool("delete_wireframe", {
2632
2972
  description: "Delete a wireframe (soft delete).",
2633
2973
  inputSchema: {
2634
- id: z11.string().describe("The UUID of the wireframe to delete")
2974
+ id: z15.string().describe("The UUID of the wireframe to delete")
2635
2975
  }
2636
2976
  }, async ({ id }) => {
2637
2977
  const client2 = getApiClient();
@@ -2650,9 +2990,9 @@ function registerUploadBrainstormMedia(server) {
2650
2990
  server.registerTool("upload_brainstorm_media", {
2651
2991
  description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
2652
2992
  inputSchema: {
2653
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
2654
- filePath: z11.string().describe("Absolute path to the image or video file on disk"),
2655
- description: z11.string().optional().describe("Optional description of the media")
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")
2656
2996
  }
2657
2997
  }, async ({
2658
2998
  roadmapId,
@@ -2704,8 +3044,8 @@ function registerUpdateBrainstormMedia(server) {
2704
3044
  server.registerTool("update_brainstorm_media", {
2705
3045
  description: "Update a brainstorm media item's description.",
2706
3046
  inputSchema: {
2707
- id: z11.string().describe("The UUID of the brainstorm media"),
2708
- description: z11.string().nullable().describe("New description for the media")
3047
+ id: z15.string().describe("The UUID of the brainstorm media"),
3048
+ description: z15.string().nullable().describe("New description for the media")
2709
3049
  }
2710
3050
  }, async ({ id, description }) => {
2711
3051
  const client2 = getApiClient();
@@ -2729,7 +3069,7 @@ function registerDeleteBrainstormMedia(server) {
2729
3069
  server.registerTool("delete_brainstorm_media", {
2730
3070
  description: "Delete a brainstorm media item (soft delete).",
2731
3071
  inputSchema: {
2732
- id: z11.string().describe("The UUID of the brainstorm media to delete")
3072
+ id: z15.string().describe("The UUID of the brainstorm media to delete")
2733
3073
  }
2734
3074
  }, async ({ id }) => {
2735
3075
  const client2 = getApiClient();
@@ -2748,9 +3088,9 @@ function registerUploadProductDesignMedia(server) {
2748
3088
  server.registerTool("upload_product_design_media", {
2749
3089
  description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
2750
3090
  inputSchema: {
2751
- productId: z11.string().describe("The UUID of the product"),
2752
- filePath: z11.string().describe("Absolute path to the image or video file on disk"),
2753
- description: z11.string().optional().describe("Optional description of the media")
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")
2754
3094
  }
2755
3095
  }, async ({
2756
3096
  productId,
@@ -2803,9 +3143,9 @@ function registerUpdateProductDesignMedia(server) {
2803
3143
  server.registerTool("update_product_design_media", {
2804
3144
  description: "Update a product design media item's description.",
2805
3145
  inputSchema: {
2806
- productId: z11.string().describe("The UUID of the product"),
2807
- mediaId: z11.string().describe("The UUID of the design media"),
2808
- description: z11.string().nullable().describe("New description for the media")
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")
2809
3149
  }
2810
3150
  }, async ({
2811
3151
  productId,
@@ -2833,8 +3173,8 @@ function registerDeleteProductDesignMedia(server) {
2833
3173
  server.registerTool("delete_product_design_media", {
2834
3174
  description: "Delete a product design media item (soft delete).",
2835
3175
  inputSchema: {
2836
- productId: z11.string().describe("The UUID of the product"),
2837
- mediaId: z11.string().describe("The UUID of the design media to delete")
3176
+ productId: z15.string().describe("The UUID of the product"),
3177
+ mediaId: z15.string().describe("The UUID of the design media to delete")
2838
3178
  }
2839
3179
  }, async ({ productId, mediaId }) => {
2840
3180
  const client2 = getApiClient();
@@ -2856,8 +3196,8 @@ function registerUploadDesignWalkthrough(server) {
2856
3196
  server.registerTool("upload_design_walkthrough", {
2857
3197
  description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
2858
3198
  inputSchema: {
2859
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
2860
- filePath: z11.string().describe("Absolute path to the video file on disk")
3199
+ roadmapId: z15.string().describe("The UUID of the roadmap item"),
3200
+ filePath: z15.string().describe("Absolute path to the video file on disk")
2861
3201
  }
2862
3202
  }, async ({ roadmapId, filePath }) => {
2863
3203
  const client2 = getApiClient();
@@ -2899,8 +3239,8 @@ function registerUploadReleaseWalkthrough(server) {
2899
3239
  server.registerTool("upload_release_walkthrough", {
2900
3240
  description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
2901
3241
  inputSchema: {
2902
- roadmapId: z11.string().describe("The UUID of the roadmap item"),
2903
- filePath: z11.string().describe("Absolute path to the video file on disk")
3242
+ roadmapId: z15.string().describe("The UUID of the roadmap item"),
3243
+ filePath: z15.string().describe("Absolute path to the video file on disk")
2904
3244
  }
2905
3245
  }, async ({ roadmapId, filePath }) => {
2906
3246
  const client2 = getApiClient();
@@ -2958,9 +3298,9 @@ function registerPublishPrototype(server) {
2958
3298
  server.registerTool("publish_prototype", {
2959
3299
  description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
2960
3300
  inputSchema: {
2961
- roadmapId: z11.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
2962
- folderPath: z11.string().describe("Absolute path to the local mockup folder"),
2963
- entryPoint: z11.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
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)")
2964
3304
  }
2965
3305
  }, async ({
2966
3306
  roadmapId,
@@ -3115,15 +3455,15 @@ Expires: ${expiryDate}`
3115
3455
  };
3116
3456
  });
3117
3457
  }
3118
- var dateGranularitySchema2 = z11.enum(["day", "month", "quarter", "half-year", "year"]);
3458
+ var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
3119
3459
  function registerSearchInitiatives(server) {
3120
3460
  server.registerTool("search_initiatives", {
3121
3461
  description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
3122
3462
  inputSchema: {
3123
- query: z11.string().optional().describe("Search query to match against title or description"),
3463
+ query: z15.string().optional().describe("Search query to match against title or description"),
3124
3464
  horizon: horizonSchema.optional().describe("Filter by planning horizon"),
3125
- limit: z11.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3126
- offset: z11.number().int().min(0).optional().describe("Number of items to skip (default 0)")
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)")
3127
3467
  }
3128
3468
  }, async ({
3129
3469
  query,
@@ -3173,7 +3513,7 @@ function registerGetInitiative(server) {
3173
3513
  server.registerTool("get_initiative", {
3174
3514
  description: "Get full details of an initiative including all linked roadmap items.",
3175
3515
  inputSchema: {
3176
- id: z11.string().describe("The UUID of the initiative")
3516
+ id: z15.string().describe("The UUID of the initiative")
3177
3517
  }
3178
3518
  }, async ({ id }) => {
3179
3519
  const client2 = getApiClient();
@@ -3192,12 +3532,12 @@ function registerCreateInitiative(server) {
3192
3532
  server.registerTool("create_initiative", {
3193
3533
  description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
3194
3534
  inputSchema: {
3195
- title: z11.string().describe("Title of the initiative"),
3196
- description: z11.string().optional().describe("Description of the initiative (markdown)"),
3535
+ title: z15.string().describe("Title of the initiative"),
3536
+ description: z15.string().optional().describe("Description of the initiative (markdown)"),
3197
3537
  horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
3198
3538
  dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
3199
- dateValue: z11.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3200
- targetDate: z11.string().optional().describe("Target date in YYYY-MM-DD format")
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")
3201
3541
  }
3202
3542
  }, async ({
3203
3543
  title,
@@ -3241,14 +3581,14 @@ function registerUpdateInitiative(server) {
3241
3581
  server.registerTool("update_initiative", {
3242
3582
  description: "Update an existing initiative.",
3243
3583
  inputSchema: {
3244
- id: z11.string().describe("The UUID of the initiative to update"),
3245
- title: z11.string().optional().describe("New title"),
3246
- description: z11.string().nullable().optional().describe("New description (null to clear)"),
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)"),
3247
3587
  horizon: horizonSchema.optional().describe("New planning horizon"),
3248
3588
  dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
3249
- dateValue: z11.string().nullable().optional().describe("New target date value (null to clear)"),
3250
- targetDate: z11.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
3251
- order: z11.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
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)")
3252
3592
  }
3253
3593
  }, async ({
3254
3594
  id,
@@ -3303,7 +3643,7 @@ function registerDeleteInitiative(server) {
3303
3643
  server.registerTool("delete_initiative", {
3304
3644
  description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
3305
3645
  inputSchema: {
3306
- id: z11.string().describe("The UUID of the initiative to delete")
3646
+ id: z15.string().describe("The UUID of the initiative to delete")
3307
3647
  }
3308
3648
  }, async ({ id }) => {
3309
3649
  const client2 = getApiClient();
@@ -3322,9 +3662,9 @@ function registerReorderInitiatives(server) {
3322
3662
  server.registerTool("reorder_initiatives", {
3323
3663
  description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
3324
3664
  inputSchema: {
3325
- items: z11.array(z11.object({
3326
- id: z11.string().describe("The UUID of the initiative"),
3327
- order: z11.number().int().min(0).describe("The new order value (0-based)")
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)")
3328
3668
  })).describe("Array of initiatives with their new order values")
3329
3669
  }
3330
3670
  }, async ({ items }) => {
@@ -3340,6 +3680,703 @@ function registerReorderInitiatives(server) {
3340
3680
  };
3341
3681
  });
3342
3682
  }
3683
+ function registerSearchExports(server) {
3684
+ server.registerTool("search_exports", {
3685
+ description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
3686
+ inputSchema: {
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)")
3693
+ }
3694
+ }, async ({
3695
+ roadmapId,
3696
+ externalSystem,
3697
+ localEntityType,
3698
+ localEntityId,
3699
+ limit,
3700
+ offset
3701
+ }) => {
3702
+ const client2 = getApiClient();
3703
+ const response = await client2.searchExports({
3704
+ roadmapId,
3705
+ externalSystem,
3706
+ localEntityType,
3707
+ localEntityId,
3708
+ limit,
3709
+ offset
3710
+ });
3711
+ return {
3712
+ content: [
3713
+ {
3714
+ type: "text",
3715
+ text: JSON.stringify({
3716
+ exports: response.data,
3717
+ total: response.meta.total,
3718
+ hasMore: response.meta.has_more
3719
+ }, null, 2)
3720
+ }
3721
+ ]
3722
+ };
3723
+ });
3724
+ }
3725
+ function registerGetExport(server) {
3726
+ server.registerTool("get_export", {
3727
+ description: "Get full details of a single export record by ID.",
3728
+ inputSchema: {
3729
+ id: z15.string().uuid().describe("The UUID of the export record")
3730
+ }
3731
+ }, async ({ id }) => {
3732
+ const client2 = getApiClient();
3733
+ const exportRecord = await client2.getExport(id);
3734
+ return {
3735
+ content: [
3736
+ {
3737
+ type: "text",
3738
+ text: JSON.stringify(exportRecord, null, 2)
3739
+ }
3740
+ ]
3741
+ };
3742
+ });
3743
+ }
3744
+ function registerCreateExport(server) {
3745
+ server.registerTool("create_export", {
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.",
3747
+ inputSchema: {
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")
3756
+ }
3757
+ }, async ({
3758
+ roadmapId,
3759
+ localEntityType,
3760
+ localEntityId,
3761
+ externalSystem,
3762
+ externalObjectType,
3763
+ externalId,
3764
+ externalUrl,
3765
+ metadata
3766
+ }) => {
3767
+ const client2 = getApiClient();
3768
+ const exportRecord = await client2.createExport({
3769
+ roadmapId,
3770
+ localEntityType,
3771
+ localEntityId,
3772
+ externalSystem,
3773
+ externalObjectType,
3774
+ externalId,
3775
+ externalUrl,
3776
+ metadata
3777
+ });
3778
+ return {
3779
+ content: [
3780
+ {
3781
+ type: "text",
3782
+ text: JSON.stringify({ success: true, export: exportRecord }, null, 2)
3783
+ }
3784
+ ]
3785
+ };
3786
+ });
3787
+ }
3788
+ function registerUpdateExport(server) {
3789
+ server.registerTool("update_export", {
3790
+ description: "Update an export record. Can update the external URL or metadata.",
3791
+ inputSchema: {
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")
3795
+ }
3796
+ }, async ({
3797
+ id,
3798
+ externalUrl,
3799
+ metadata
3800
+ }) => {
3801
+ const client2 = getApiClient();
3802
+ const exportRecord = await client2.updateExport(id, { externalUrl, metadata });
3803
+ return {
3804
+ content: [
3805
+ {
3806
+ type: "text",
3807
+ text: JSON.stringify({ success: true, export: exportRecord }, null, 2)
3808
+ }
3809
+ ]
3810
+ };
3811
+ });
3812
+ }
3813
+ function registerDeleteExport(server) {
3814
+ server.registerTool("delete_export", {
3815
+ description: "Delete an export record. This is a soft delete.",
3816
+ inputSchema: {
3817
+ id: z15.string().uuid().describe("The UUID of the export record to delete")
3818
+ }
3819
+ }, async ({ id }) => {
3820
+ const client2 = getApiClient();
3821
+ await client2.deleteExport(id);
3822
+ return {
3823
+ content: [
3824
+ {
3825
+ type: "text",
3826
+ text: JSON.stringify({ success: true, deleted: id }, null, 2)
3827
+ }
3828
+ ]
3829
+ };
3830
+ });
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
+ }
3343
4380
 
3344
4381
  // src/index.ts
3345
4382
  async function main() {