@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.
- package/dist/index.js +1462 -425
- 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/
|
|
97
|
+
// ../../packages/shared/src/schemas/export.ts
|
|
98
98
|
import { z as z4 } from "zod";
|
|
99
|
-
var
|
|
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
|
-
|
|
102
|
-
|
|
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
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
155
|
-
// ../../packages/shared/src/schemas/idea.ts
|
|
136
|
+
// ../../packages/shared/src/schemas/feature.ts
|
|
156
137
|
import { z as z5 } from "zod";
|
|
157
|
-
var
|
|
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
|
-
|
|
148
|
+
type: featureTypeSchema,
|
|
149
|
+
name: z5.string(),
|
|
161
150
|
description: z5.string().nullable(),
|
|
162
|
-
|
|
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
|
|
172
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
source: z5.string().nullable().optional()
|
|
177
|
+
type: featureTypeSchema.optional(),
|
|
178
|
+
parentId: z5.string().uuid().nullable().optional()
|
|
177
179
|
});
|
|
178
|
-
var
|
|
179
|
-
|
|
180
|
+
var updateFeatureSchema = z5.object({
|
|
181
|
+
name: z5.string().min(1).optional(),
|
|
180
182
|
description: z5.string().nullable().optional(),
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
187
|
-
|
|
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
|
|
196
|
+
var ideaSchema = z6.object({
|
|
190
197
|
id: z6.string().uuid(),
|
|
191
198
|
organizationId: z6.string(),
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
createdAt: z6.string()
|
|
207
|
+
createdAt: z6.string(),
|
|
208
|
+
createdBy: z6.string()
|
|
199
209
|
});
|
|
200
|
-
var
|
|
201
|
-
|
|
210
|
+
var createIdeaSchema = z6.object({
|
|
211
|
+
title: z6.string().min(1),
|
|
202
212
|
description: z6.string().nullable().optional(),
|
|
203
|
-
|
|
204
|
-
|
|
213
|
+
status: ideaStatusSchema.optional(),
|
|
214
|
+
effort: effortSchema.nullable().optional(),
|
|
215
|
+
source: z6.string().nullable().optional()
|
|
205
216
|
});
|
|
206
|
-
var
|
|
207
|
-
|
|
217
|
+
var updateIdeaSchema = z6.object({
|
|
218
|
+
title: z6.string().min(1).optional(),
|
|
208
219
|
description: z6.string().nullable().optional(),
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
214
|
-
// ../../packages/shared/src/schemas/
|
|
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
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
});
|
|
242
|
-
var epicWithStoriesSchema = epicSchema.extend({
|
|
243
|
-
stories: z7.array(storySchema)
|
|
235
|
+
createdBy: z7.string(),
|
|
236
|
+
updatedAt: z7.string().nullable()
|
|
244
237
|
});
|
|
245
|
-
var
|
|
238
|
+
var createPresentationSchema = z7.object({
|
|
246
239
|
title: z7.string().min(1),
|
|
247
240
|
description: z7.string().nullable().optional()
|
|
248
241
|
});
|
|
249
|
-
var
|
|
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
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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:
|
|
263
|
-
title:
|
|
264
|
-
description:
|
|
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 =
|
|
268
|
-
title:
|
|
269
|
-
description:
|
|
327
|
+
var updateEpicSchema = z9.object({
|
|
328
|
+
title: z9.string().min(1).optional(),
|
|
329
|
+
description: z9.string().nullable().optional()
|
|
270
330
|
});
|
|
271
|
-
var updateStorySchema =
|
|
272
|
-
title:
|
|
273
|
-
description:
|
|
274
|
-
epicId:
|
|
331
|
+
var updateStorySchema = z9.object({
|
|
332
|
+
title: z9.string().min(1).optional(),
|
|
333
|
+
description: z9.string().nullable().optional(),
|
|
334
|
+
epicId: z9.string().uuid().nullable().optional()
|
|
275
335
|
});
|
|
276
|
-
var reorderStoriesSchema =
|
|
277
|
-
epicOrder:
|
|
278
|
-
storyOrder:
|
|
279
|
-
standaloneOrder:
|
|
336
|
+
var reorderStoriesSchema = z9.object({
|
|
337
|
+
epicOrder: z9.array(z9.string().uuid()).optional(),
|
|
338
|
+
storyOrder: z9.record(z9.string(), z9.array(z9.string().uuid())).optional(),
|
|
339
|
+
standaloneOrder: z9.array(z9.string().uuid()).optional()
|
|
280
340
|
});
|
|
281
341
|
|
|
282
342
|
// ../../packages/shared/src/schemas/roadmap.ts
|
|
283
|
-
var flexibleDateSchema =
|
|
284
|
-
value:
|
|
343
|
+
var flexibleDateSchema = z10.object({
|
|
344
|
+
value: z10.string(),
|
|
285
345
|
granularity: dateGranularitySchema
|
|
286
346
|
});
|
|
287
|
-
var labelSchema =
|
|
288
|
-
id:
|
|
289
|
-
type:
|
|
290
|
-
name:
|
|
291
|
-
color:
|
|
292
|
-
address:
|
|
347
|
+
var labelSchema = z10.object({
|
|
348
|
+
id: z10.string().uuid(),
|
|
349
|
+
type: z10.enum(["category", "location", "label"]),
|
|
350
|
+
name: z10.string(),
|
|
351
|
+
color: z10.string().nullable(),
|
|
352
|
+
address: z10.string().nullable()
|
|
293
353
|
});
|
|
294
|
-
var appSchema =
|
|
295
|
-
id:
|
|
296
|
-
name:
|
|
354
|
+
var appSchema = z10.object({
|
|
355
|
+
id: z10.string().uuid(),
|
|
356
|
+
name: z10.string()
|
|
297
357
|
});
|
|
298
|
-
var roadmapSchema =
|
|
299
|
-
id:
|
|
300
|
-
organizationId:
|
|
301
|
-
title:
|
|
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:
|
|
307
|
-
estimatedSeconds:
|
|
366
|
+
order: z10.number().int(),
|
|
367
|
+
estimatedSeconds: z10.number().int().nullable(),
|
|
308
368
|
date: flexibleDateSchema.nullable(),
|
|
309
369
|
target: flexibleDateSchema.nullable(),
|
|
310
|
-
completedAt:
|
|
311
|
-
createdAt:
|
|
312
|
-
createdBy:
|
|
313
|
-
prompt:
|
|
314
|
-
labels:
|
|
315
|
-
apps:
|
|
316
|
-
});
|
|
317
|
-
var createRoadmapSchema =
|
|
318
|
-
title:
|
|
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:
|
|
383
|
+
estimatedSeconds: z10.number().int().nullable().optional(),
|
|
324
384
|
date: flexibleDateSchema.nullable().optional(),
|
|
325
385
|
target: flexibleDateSchema.nullable().optional(),
|
|
326
|
-
prompt:
|
|
327
|
-
brainstormNotes:
|
|
386
|
+
prompt: z10.string().nullable().optional(),
|
|
387
|
+
brainstormNotes: z10.string().nullable().optional()
|
|
328
388
|
});
|
|
329
|
-
var updateRoadmapSchema =
|
|
330
|
-
title:
|
|
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:
|
|
336
|
-
estimatedSeconds:
|
|
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:
|
|
340
|
-
brainstormNotes:
|
|
399
|
+
prompt: z10.string().nullable().optional(),
|
|
400
|
+
brainstormNotes: z10.string().nullable().optional()
|
|
341
401
|
});
|
|
342
|
-
var prdOutcomeSchema =
|
|
343
|
-
id:
|
|
344
|
-
description:
|
|
402
|
+
var prdOutcomeSchema = z10.object({
|
|
403
|
+
id: z10.string().uuid(),
|
|
404
|
+
description: z10.string(),
|
|
345
405
|
status: prdStatusSchema,
|
|
346
|
-
order:
|
|
347
|
-
completedAt:
|
|
406
|
+
order: z10.number().int(),
|
|
407
|
+
completedAt: z10.string().nullable()
|
|
348
408
|
});
|
|
349
|
-
var prdSchema =
|
|
350
|
-
id:
|
|
351
|
-
what:
|
|
352
|
-
why:
|
|
353
|
-
outcomes:
|
|
409
|
+
var prdSchema = z10.object({
|
|
410
|
+
id: z10.string().uuid(),
|
|
411
|
+
what: z10.string().nullable(),
|
|
412
|
+
why: z10.string().nullable(),
|
|
413
|
+
outcomes: z10.array(prdOutcomeSchema)
|
|
354
414
|
});
|
|
355
|
-
var savePrdInputSchema =
|
|
356
|
-
what:
|
|
357
|
-
why:
|
|
415
|
+
var savePrdInputSchema = z10.object({
|
|
416
|
+
what: z10.string().nullable(),
|
|
417
|
+
why: z10.string().nullable(),
|
|
358
418
|
status: prdStatusSchema,
|
|
359
|
-
outcomes:
|
|
360
|
-
id:
|
|
361
|
-
description:
|
|
362
|
-
order:
|
|
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 =
|
|
366
|
-
id:
|
|
367
|
-
mediaUrl:
|
|
425
|
+
var brainstormMediaSchema = z10.object({
|
|
426
|
+
id: z10.string().uuid(),
|
|
427
|
+
mediaUrl: z10.string(),
|
|
368
428
|
mediaType: brainstormMediaTypeSchema,
|
|
369
|
-
description:
|
|
370
|
-
order:
|
|
371
|
-
createdAt:
|
|
429
|
+
description: z10.string().nullable(),
|
|
430
|
+
order: z10.number().int(),
|
|
431
|
+
createdAt: z10.string()
|
|
372
432
|
});
|
|
373
|
-
var wireframeSchema =
|
|
374
|
-
id:
|
|
375
|
-
description:
|
|
376
|
-
imageUrl:
|
|
377
|
-
order:
|
|
433
|
+
var wireframeSchema = z10.object({
|
|
434
|
+
id: z10.string().uuid(),
|
|
435
|
+
description: z10.string().nullable(),
|
|
436
|
+
imageUrl: z10.string().nullable(),
|
|
437
|
+
order: z10.number().int()
|
|
378
438
|
});
|
|
379
|
-
var prototypeSchema =
|
|
380
|
-
id:
|
|
381
|
-
publicUrl:
|
|
382
|
-
expiresAt:
|
|
383
|
-
fileCount:
|
|
384
|
-
entryPoint:
|
|
385
|
-
createdAt:
|
|
439
|
+
var prototypeSchema = z10.object({
|
|
440
|
+
id: z10.string().uuid(),
|
|
441
|
+
publicUrl: z10.string().url(),
|
|
442
|
+
expiresAt: z10.string().datetime(),
|
|
443
|
+
fileCount: z10.number().int().positive(),
|
|
444
|
+
entryPoint: z10.string(),
|
|
445
|
+
createdAt: z10.string().datetime()
|
|
386
446
|
});
|
|
387
|
-
var featureLinkSchema =
|
|
388
|
-
id:
|
|
389
|
-
featureId:
|
|
390
|
-
feature:
|
|
391
|
-
id:
|
|
392
|
-
name:
|
|
393
|
-
type:
|
|
447
|
+
var featureLinkSchema = z10.object({
|
|
448
|
+
id: z10.string().uuid(),
|
|
449
|
+
featureId: z10.string().uuid(),
|
|
450
|
+
feature: z10.object({
|
|
451
|
+
id: z10.string().uuid(),
|
|
452
|
+
name: z10.string(),
|
|
453
|
+
type: z10.enum(["area", "feature"])
|
|
394
454
|
}),
|
|
395
|
-
createdAt:
|
|
455
|
+
createdAt: z10.string()
|
|
396
456
|
});
|
|
397
|
-
var phaseDesignSchema =
|
|
398
|
-
id:
|
|
399
|
-
description:
|
|
457
|
+
var phaseDesignSchema = z10.object({
|
|
458
|
+
id: z10.string().uuid(),
|
|
459
|
+
description: z10.string().nullable()
|
|
400
460
|
});
|
|
401
|
-
var phasePlanSchema =
|
|
402
|
-
id:
|
|
403
|
-
description:
|
|
461
|
+
var phasePlanSchema = z10.object({
|
|
462
|
+
id: z10.string().uuid(),
|
|
463
|
+
description: z10.string().nullable()
|
|
404
464
|
});
|
|
405
|
-
var phaseBuildSchema =
|
|
406
|
-
id:
|
|
407
|
-
description:
|
|
408
|
-
prompt:
|
|
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 =
|
|
411
|
-
id:
|
|
412
|
-
description:
|
|
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:
|
|
417
|
-
prototypes:
|
|
418
|
-
brainstormMedia:
|
|
419
|
-
brainstormNotes:
|
|
420
|
-
featureLinks:
|
|
421
|
-
epics:
|
|
422
|
-
stories:
|
|
476
|
+
wireframes: z10.array(wireframeSchema),
|
|
477
|
+
prototypes: z10.array(prototypeSchema),
|
|
478
|
+
brainstormMedia: z10.array(brainstormMediaSchema),
|
|
479
|
+
brainstormNotes: z10.string().nullable(),
|
|
480
|
+
featureLinks: z10.array(featureLinkSchema),
|
|
481
|
+
epics: z10.array(epicWithStoriesSchema),
|
|
482
|
+
stories: z10.array(storySchema),
|
|
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 =
|
|
489
|
+
var roadmapListSchema = z10.array(roadmapSchema);
|
|
429
490
|
// ../../packages/shared/src/schemas/scenario.ts
|
|
430
|
-
import { z as
|
|
431
|
-
var scenarioSchema =
|
|
432
|
-
id:
|
|
433
|
-
title:
|
|
434
|
-
given:
|
|
435
|
-
when:
|
|
436
|
-
then:
|
|
437
|
-
order:
|
|
438
|
-
createdAt:
|
|
439
|
-
updatedAt:
|
|
491
|
+
import { z as z11 } from "zod";
|
|
492
|
+
var scenarioSchema = z11.object({
|
|
493
|
+
id: z11.string().uuid(),
|
|
494
|
+
title: z11.string().min(1),
|
|
495
|
+
given: z11.string().nullable(),
|
|
496
|
+
when: z11.string().nullable(),
|
|
497
|
+
then: z11.string().nullable(),
|
|
498
|
+
order: z11.number().int(),
|
|
499
|
+
createdAt: z11.string().datetime(),
|
|
500
|
+
updatedAt: z11.string().datetime()
|
|
440
501
|
});
|
|
441
|
-
var createScenarioSchema =
|
|
442
|
-
title:
|
|
443
|
-
given:
|
|
444
|
-
when:
|
|
445
|
-
then:
|
|
446
|
-
roadmapId:
|
|
502
|
+
var createScenarioSchema = z11.object({
|
|
503
|
+
title: z11.string().min(1),
|
|
504
|
+
given: z11.string().nullable().optional(),
|
|
505
|
+
when: z11.string().nullable().optional(),
|
|
506
|
+
then: z11.string().nullable().optional(),
|
|
507
|
+
roadmapId: z11.string().uuid()
|
|
447
508
|
});
|
|
448
|
-
var updateScenarioSchema =
|
|
449
|
-
title:
|
|
450
|
-
given:
|
|
451
|
-
when:
|
|
452
|
-
then:
|
|
453
|
-
order:
|
|
509
|
+
var updateScenarioSchema = z11.object({
|
|
510
|
+
title: z11.string().min(1).optional(),
|
|
511
|
+
given: z11.string().nullable().optional(),
|
|
512
|
+
when: z11.string().nullable().optional(),
|
|
513
|
+
then: z11.string().nullable().optional(),
|
|
514
|
+
order: z11.number().int().optional()
|
|
515
|
+
});
|
|
516
|
+
var scenarioListSchema = z11.array(scenarioSchema);
|
|
517
|
+
// ../../packages/shared/src/schemas/slide.ts
|
|
518
|
+
import { z as z12 } from "zod";
|
|
519
|
+
var slideContentSchema = z12.object({
|
|
520
|
+
body: z12.string().optional()
|
|
521
|
+
});
|
|
522
|
+
var slideSchema = z12.object({
|
|
523
|
+
id: z12.string().uuid(),
|
|
524
|
+
variantId: z12.string().uuid(),
|
|
525
|
+
title: z12.string(),
|
|
526
|
+
content: slideContentSchema.nullable(),
|
|
527
|
+
speakerNotes: z12.string().nullable(),
|
|
528
|
+
order: z12.number().int(),
|
|
529
|
+
createdAt: z12.string(),
|
|
530
|
+
createdBy: z12.string(),
|
|
531
|
+
updatedAt: z12.string().nullable()
|
|
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
|
|
543
|
+
var slideListSchema = z12.array(slideSchema);
|
|
456
544
|
// ../../packages/shared/src/schemas/status-update.ts
|
|
457
|
-
import { z as
|
|
458
|
-
var statusUpdateItemSchema =
|
|
459
|
-
id:
|
|
460
|
-
roadmapItemId:
|
|
461
|
-
titleAtSnapshot:
|
|
462
|
-
statusAtSnapshot:
|
|
463
|
-
designWalkthroughUrl:
|
|
464
|
-
releaseWalkthroughUrl:
|
|
545
|
+
import { z as z13 } from "zod";
|
|
546
|
+
var statusUpdateItemSchema = z13.object({
|
|
547
|
+
id: z13.string().uuid(),
|
|
548
|
+
roadmapItemId: z13.string().uuid(),
|
|
549
|
+
titleAtSnapshot: z13.string(),
|
|
550
|
+
statusAtSnapshot: z13.string(),
|
|
551
|
+
designWalkthroughUrl: z13.string().nullable(),
|
|
552
|
+
releaseWalkthroughUrl: z13.string().nullable()
|
|
465
553
|
});
|
|
466
|
-
var statusUpdateSchema =
|
|
467
|
-
id:
|
|
468
|
-
title:
|
|
469
|
-
startDate:
|
|
470
|
-
endDate:
|
|
471
|
-
content:
|
|
472
|
-
createdAt:
|
|
473
|
-
items:
|
|
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 =
|
|
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
|
|
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:
|
|
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
|
-
|
|
1066
|
-
|
|
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({
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1332
|
-
description:
|
|
1333
|
-
source:
|
|
1651
|
+
title: z15.string().describe("Title of the idea"),
|
|
1652
|
+
description: z15.string().optional().describe("Detailed description of the idea"),
|
|
1653
|
+
source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 =
|
|
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:
|
|
1437
|
-
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
|
-
|
|
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:
|
|
1443
|
-
initiativeId:
|
|
1444
|
-
designDescription:
|
|
1445
|
-
planDescription:
|
|
1446
|
-
buildDescription:
|
|
1447
|
-
releaseDescription:
|
|
1448
|
-
prompt:
|
|
1774
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
|
|
1775
|
+
initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
|
|
1776
|
+
designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
|
|
1777
|
+
planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
|
|
1778
|
+
buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
|
|
1779
|
+
releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
|
|
1780
|
+
prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
|
|
1449
1781
|
dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1450
|
-
dateValue:
|
|
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:
|
|
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:
|
|
1556
|
-
description:
|
|
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:
|
|
1559
|
-
outcomes:
|
|
1560
|
-
linkToRoadmapId:
|
|
1898
|
+
parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
|
|
1899
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
|
|
1900
|
+
linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
|
|
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:
|
|
1608
|
-
what:
|
|
1609
|
-
why:
|
|
1610
|
-
outcomes:
|
|
1947
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
1948
|
+
what: z15.string().nullable().describe("What is being built - the feature description"),
|
|
1949
|
+
why: z15.string().nullable().describe("Why this is being built - the business justification"),
|
|
1950
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
|
|
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:
|
|
1649
|
-
notes:
|
|
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:
|
|
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:
|
|
1701
|
-
id:
|
|
1702
|
-
order:
|
|
2040
|
+
items: z15.array(z15.object({
|
|
2041
|
+
id: z15.string().describe("The UUID of the roadmap item"),
|
|
2042
|
+
order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
|
|
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:
|
|
1727
|
-
name:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1820
|
-
title:
|
|
1821
|
-
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:
|
|
1824
|
-
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:
|
|
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:
|
|
1911
|
-
mission:
|
|
2250
|
+
vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
|
|
2251
|
+
mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
|
|
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:
|
|
1960
|
-
description:
|
|
2299
|
+
title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
|
|
2300
|
+
description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
|
|
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:
|
|
1990
|
-
title:
|
|
1991
|
-
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:
|
|
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 =
|
|
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:
|
|
2055
|
-
parentId:
|
|
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:
|
|
2091
|
-
name:
|
|
2092
|
-
parentId:
|
|
2430
|
+
id: z15.string().describe("The UUID of the product to update"),
|
|
2431
|
+
name: z15.string().optional().describe("New name"),
|
|
2432
|
+
parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
2248
|
-
designSystem:
|
|
2249
|
-
adrs:
|
|
2587
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
2588
|
+
designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
|
|
2589
|
+
adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
|
|
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:
|
|
2287
|
-
description:
|
|
2626
|
+
name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
|
|
2627
|
+
description: z15.string().nullable().optional().describe("Description of the audience")
|
|
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:
|
|
2317
|
-
name:
|
|
2318
|
-
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:
|
|
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:
|
|
2396
|
-
endDate:
|
|
2397
|
-
entityType:
|
|
2735
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2736
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
|
|
2737
|
+
entityType: z15.enum([
|
|
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:
|
|
2430
|
-
endDate:
|
|
2769
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2770
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
|
|
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:
|
|
2450
|
-
endDate:
|
|
2451
|
-
content:
|
|
2452
|
-
title:
|
|
2453
|
-
items:
|
|
2454
|
-
roadmapItemId:
|
|
2455
|
-
status:
|
|
2789
|
+
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
|
|
2790
|
+
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
|
|
2791
|
+
content: z15.string().describe("The markdown content of the status report"),
|
|
2792
|
+
title: z15.string().optional().describe("Optional title for the report"),
|
|
2793
|
+
items: z15.array(z15.object({
|
|
2794
|
+
roadmapItemId: z15.string().describe("UUID of the roadmap item"),
|
|
2795
|
+
status: z15.string().describe("Status of the item at report creation time")
|
|
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:
|
|
2497
|
-
epics:
|
|
2498
|
-
title:
|
|
2499
|
-
description:
|
|
2500
|
-
stories:
|
|
2501
|
-
title:
|
|
2502
|
-
description:
|
|
2836
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
2837
|
+
epics: z15.array(z15.object({
|
|
2838
|
+
title: z15.string().min(1).describe("Title of the epic"),
|
|
2839
|
+
description: z15.string().nullable().optional().describe("Description of the epic"),
|
|
2840
|
+
stories: z15.array(z15.object({
|
|
2841
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
2842
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
2503
2843
|
})).optional().describe("Stories within this epic")
|
|
2504
2844
|
})).optional().describe("List of epics with their nested stories"),
|
|
2505
|
-
stories:
|
|
2506
|
-
title:
|
|
2507
|
-
description:
|
|
2845
|
+
stories: z15.array(z15.object({
|
|
2846
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
2847
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
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:
|
|
2540
|
-
filePath:
|
|
2541
|
-
description:
|
|
2542
|
-
outcomeIds:
|
|
2879
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2880
|
+
filePath: z15.string().describe("Absolute path to the image file on disk"),
|
|
2881
|
+
description: z15.string().optional().describe("Optional description of the wireframe"),
|
|
2882
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
|
|
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:
|
|
2597
|
-
description:
|
|
2598
|
-
outcomeIds:
|
|
2936
|
+
id: z15.string().describe("The UUID of the wireframe"),
|
|
2937
|
+
description: z15.string().nullable().optional().describe("New description for the wireframe"),
|
|
2938
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
|
|
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:
|
|
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:
|
|
2654
|
-
filePath:
|
|
2655
|
-
description:
|
|
2993
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2994
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
2995
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
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:
|
|
2708
|
-
description:
|
|
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:
|
|
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:
|
|
2752
|
-
filePath:
|
|
2753
|
-
description:
|
|
3091
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
3092
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
3093
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
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:
|
|
2807
|
-
mediaId:
|
|
2808
|
-
description:
|
|
3146
|
+
productId: z15.string().describe("The UUID of the product"),
|
|
3147
|
+
mediaId: z15.string().describe("The UUID of the design media"),
|
|
3148
|
+
description: z15.string().nullable().describe("New description for the media")
|
|
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:
|
|
2837
|
-
mediaId:
|
|
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:
|
|
2860
|
-
filePath:
|
|
3199
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3200
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
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:
|
|
2903
|
-
filePath:
|
|
3242
|
+
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3243
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
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:
|
|
2962
|
-
folderPath:
|
|
2963
|
-
entryPoint:
|
|
3301
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
|
|
3302
|
+
folderPath: z15.string().describe("Absolute path to the local mockup folder"),
|
|
3303
|
+
entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
|
|
2964
3304
|
}
|
|
2965
3305
|
}, async ({
|
|
2966
3306
|
roadmapId,
|
|
@@ -3115,15 +3455,15 @@ Expires: ${expiryDate}`
|
|
|
3115
3455
|
};
|
|
3116
3456
|
});
|
|
3117
3457
|
}
|
|
3118
|
-
var dateGranularitySchema2 =
|
|
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:
|
|
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:
|
|
3126
|
-
offset:
|
|
3465
|
+
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
3466
|
+
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
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:
|
|
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:
|
|
3196
|
-
description:
|
|
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:
|
|
3200
|
-
targetDate:
|
|
3539
|
+
dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
|
|
3540
|
+
targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
|
|
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:
|
|
3245
|
-
title:
|
|
3246
|
-
description:
|
|
3584
|
+
id: z15.string().describe("The UUID of the initiative to update"),
|
|
3585
|
+
title: z15.string().optional().describe("New title"),
|
|
3586
|
+
description: z15.string().nullable().optional().describe("New description (null to clear)"),
|
|
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:
|
|
3250
|
-
targetDate:
|
|
3251
|
-
order:
|
|
3589
|
+
dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
|
|
3590
|
+
targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
|
|
3591
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
|
|
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:
|
|
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:
|
|
3326
|
-
id:
|
|
3327
|
-
order:
|
|
3665
|
+
items: z15.array(z15.object({
|
|
3666
|
+
id: z15.string().describe("The UUID of the initiative"),
|
|
3667
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
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() {
|