@ourroadmaps/mcp 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1034 -709
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21,29 +21,282 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
21
21
  // src/index.ts
22
22
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
23
23
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
24
- // ../../packages/shared/src/schemas/audience.ts
24
+
25
+ // ../../packages/shared/src/blocknote-markdown.ts
26
+ var LIST_BLOCK_TYPES = new Set(["bulletListItem", "numberedListItem", "checkListItem"]);
27
+ function contentToMarkdown(content) {
28
+ if (content == null)
29
+ return "";
30
+ if (typeof content === "string")
31
+ return content;
32
+ if (!Array.isArray(content))
33
+ return "";
34
+ if (content.length === 0)
35
+ return "";
36
+ try {
37
+ return convertBlocks(content, 0);
38
+ } catch {
39
+ try {
40
+ return extractPlainText(content);
41
+ } catch {
42
+ return "";
43
+ }
44
+ }
45
+ }
46
+ function getPreviousBlockType(blocks, currentIndex) {
47
+ for (let i = currentIndex - 1;i >= 0; i--) {
48
+ const block = blocks[i];
49
+ if (!block || typeof block !== "object")
50
+ continue;
51
+ const b = block;
52
+ const line = renderBlock(b, 0, 0);
53
+ if (line !== null)
54
+ return b.type || "";
55
+ }
56
+ return "";
57
+ }
58
+ function appendSeparator(parts, prevType, currentType) {
59
+ if (parts.length === 0)
60
+ return;
61
+ const bothList = LIST_BLOCK_TYPES.has(prevType) && LIST_BLOCK_TYPES.has(currentType);
62
+ parts.push(bothList ? `
63
+ ` : `
64
+
65
+ `);
66
+ }
67
+ function appendChildren(parts, block, depth) {
68
+ const children = block.children;
69
+ if (!Array.isArray(children) || children.length === 0)
70
+ return;
71
+ const childOutput = convertBlocks(children, depth + 1);
72
+ if (childOutput) {
73
+ parts.push(`
74
+ `);
75
+ parts.push(childOutput);
76
+ }
77
+ }
78
+ function convertBlocks(blocks, depth) {
79
+ const parts = [];
80
+ let numberedCounter = 0;
81
+ for (let i = 0;i < blocks.length; i++) {
82
+ const block = blocks[i];
83
+ if (!block || typeof block !== "object")
84
+ continue;
85
+ const b = block;
86
+ const type = b.type || "";
87
+ numberedCounter = type === "numberedListItem" ? numberedCounter + 1 : 0;
88
+ const line = renderBlock(b, depth, numberedCounter);
89
+ if (line === null)
90
+ continue;
91
+ const prevType = getPreviousBlockType(blocks, i);
92
+ appendSeparator(parts, prevType, type);
93
+ parts.push(line);
94
+ appendChildren(parts, b, depth);
95
+ }
96
+ return parts.join("");
97
+ }
98
+ function renderBlock(block, depth, numberedCounter) {
99
+ const type = block.type || "";
100
+ const props = block.props || {};
101
+ const content = block.content;
102
+ const indent = " ".repeat(depth);
103
+ switch (type) {
104
+ case "paragraph": {
105
+ const text = renderInlineContent(content);
106
+ if (!text)
107
+ return null;
108
+ return `${indent}${text}`;
109
+ }
110
+ case "heading": {
111
+ const level = props.level || 1;
112
+ const prefix = "#".repeat(Math.min(level, 6));
113
+ const text = renderInlineContent(content);
114
+ return `${indent}${prefix} ${text}`;
115
+ }
116
+ case "bulletListItem": {
117
+ const text = renderInlineContent(content);
118
+ return `${indent}- ${text}`;
119
+ }
120
+ case "numberedListItem": {
121
+ const text = renderInlineContent(content);
122
+ return `${indent}${numberedCounter}. ${text}`;
123
+ }
124
+ case "checkListItem": {
125
+ const checked = props.checked === true;
126
+ const marker = checked ? "[x]" : "[ ]";
127
+ const text = renderInlineContent(content);
128
+ return `${indent}- ${marker} ${text}`;
129
+ }
130
+ case "codeBlock": {
131
+ const language = props.language || "";
132
+ const text = renderInlineContent(content);
133
+ return `${indent}\`\`\`${language}
134
+ ${indent}${text}
135
+ ${indent}\`\`\``;
136
+ }
137
+ case "image": {
138
+ const url = props.url || "";
139
+ const caption = props.caption || "";
140
+ return `${indent}![${caption}](${url})`;
141
+ }
142
+ case "table":
143
+ return renderTable(content, indent);
144
+ case "divider":
145
+ return `${indent}---`;
146
+ default: {
147
+ const text = renderInlineContent(content);
148
+ if (!text)
149
+ return null;
150
+ return `${indent}${text}`;
151
+ }
152
+ }
153
+ }
154
+ function renderInlineContent(content) {
155
+ if (!content)
156
+ return "";
157
+ if (Array.isArray(content)) {
158
+ return content.map(renderInlineItem).join("");
159
+ }
160
+ return "";
161
+ }
162
+ function renderInlineItem(item) {
163
+ if (!item || typeof item !== "object")
164
+ return "";
165
+ const i = item;
166
+ const type = i.type;
167
+ if (type === "text") {
168
+ const text = i.text || "";
169
+ return applyStyles(text, i.styles);
170
+ }
171
+ if (type === "link") {
172
+ const href = i.href || "";
173
+ const linkContent = i.content;
174
+ const text = Array.isArray(linkContent) ? linkContent.map(renderInlineItem).join("") : "";
175
+ return `[${text}](${href})`;
176
+ }
177
+ return "";
178
+ }
179
+ function applyStyles(text, styles) {
180
+ if (!text)
181
+ return text;
182
+ if (!styles || typeof styles !== "object")
183
+ return text;
184
+ const s = styles;
185
+ let result = text;
186
+ if (s.code === true) {
187
+ result = `\`${result}\``;
188
+ }
189
+ if (s.bold === true && s.italic === true) {
190
+ result = `***${result}***`;
191
+ } else if (s.bold === true) {
192
+ result = `**${result}**`;
193
+ } else if (s.italic === true) {
194
+ result = `*${result}*`;
195
+ }
196
+ if (s.strike === true) {
197
+ result = `~~${result}~~`;
198
+ }
199
+ return result;
200
+ }
201
+ function renderTable(content, indent) {
202
+ if (!content || typeof content !== "object")
203
+ return null;
204
+ const tableContent = content;
205
+ const rows = tableContent.rows;
206
+ if (!Array.isArray(rows) || rows.length === 0)
207
+ return null;
208
+ const lines = [];
209
+ for (let rowIndex = 0;rowIndex < rows.length; rowIndex++) {
210
+ const row = rows[rowIndex];
211
+ const cells = row?.cells;
212
+ if (!Array.isArray(cells))
213
+ continue;
214
+ const cellTexts = cells.map((cell) => {
215
+ if (Array.isArray(cell)) {
216
+ return cell.map(renderInlineItem).join("");
217
+ }
218
+ return "";
219
+ });
220
+ lines.push(`${indent}| ${cellTexts.join(" | ")} |`);
221
+ if (rowIndex === 0) {
222
+ const separator = cellTexts.map(() => "---").join(" | ");
223
+ lines.push(`${indent}| ${separator} |`);
224
+ }
225
+ }
226
+ return lines.join(`
227
+ `);
228
+ }
229
+ function extractPlainText(obj) {
230
+ if (typeof obj === "string")
231
+ return obj;
232
+ if (Array.isArray(obj)) {
233
+ return obj.map(extractPlainText).filter(Boolean).join(" ");
234
+ }
235
+ if (obj && typeof obj === "object") {
236
+ const record = obj;
237
+ if (typeof record.text === "string")
238
+ return record.text;
239
+ const parts = [];
240
+ for (const value of Object.values(record)) {
241
+ const text = extractPlainText(value);
242
+ if (text)
243
+ parts.push(text);
244
+ }
245
+ return parts.join(" ");
246
+ }
247
+ return "";
248
+ }
249
+ // ../../packages/shared/src/schemas/ai.ts
25
250
  import { z } from "zod";
26
- var audienceSchema = z.object({
27
- id: z.string().uuid(),
251
+ var TASK_TYPES = ["complex", "generation", "fast"];
252
+ var taskTypeSchema = z.enum(TASK_TYPES);
253
+ var AI_MODEL_NAMES = ["sonnet", "haiku", "opus"];
254
+ var aiModelNameSchema = z.enum(AI_MODEL_NAMES);
255
+ var aiCallLogSchema = z.object({
256
+ id: z.string(),
28
257
  organizationId: z.string(),
29
- name: z.string(),
30
- description: z.string().nullable(),
31
- order: z.number().int(),
32
- createdAt: z.string(),
33
- updatedAt: z.string().nullable()
258
+ userId: z.string(),
259
+ requestId: z.string().nullish(),
260
+ feature: z.string(),
261
+ model: z.string(),
262
+ provider: z.string(),
263
+ taskType: z.string().nullish(),
264
+ inputTokens: z.number().nullable(),
265
+ outputTokens: z.number().nullable(),
266
+ costCents: z.number().nullable(),
267
+ durationMs: z.number().nullable(),
268
+ stopReason: z.string().nullable(),
269
+ error: z.string().nullable(),
270
+ errorType: z.string().nullable(),
271
+ reason: z.string().nullable(),
272
+ correlationId: z.string().nullable(),
273
+ iteration: z.number().nullable(),
274
+ metadata: z.record(z.unknown()).nullable(),
275
+ createdAt: z.string()
276
+ });
277
+ // ../../packages/shared/src/schemas/audience.ts
278
+ import { z as z2 } from "zod";
279
+ var audienceSchema = z2.object({
280
+ id: z2.string().uuid(),
281
+ organizationId: z2.string(),
282
+ name: z2.string(),
283
+ description: z2.string().nullable(),
284
+ order: z2.number().int(),
285
+ createdAt: z2.string(),
286
+ updatedAt: z2.string().nullable()
34
287
  });
35
- var createAudienceSchema = z.object({
36
- name: z.string().min(1),
37
- description: z.string().nullable().optional()
288
+ var createAudienceSchema = z2.object({
289
+ name: z2.string().min(1),
290
+ description: z2.string().nullable().optional()
38
291
  });
39
- var updateAudienceSchema = z.object({
40
- name: z.string().min(1).optional(),
41
- description: z.string().nullable().optional(),
42
- order: z.number().int().optional()
292
+ var updateAudienceSchema = z2.object({
293
+ name: z2.string().min(1).optional(),
294
+ description: z2.string().nullable().optional(),
295
+ order: z2.number().int().optional()
43
296
  });
44
- var audienceListSchema = z.array(audienceSchema);
297
+ var audienceListSchema = z2.array(audienceSchema);
45
298
  // ../../packages/shared/src/schemas/constants.ts
46
- import { z as z2 } from "zod";
299
+ import { z as z3 } from "zod";
47
300
  var HORIZONS = [
48
301
  "inbox",
49
302
  "now",
@@ -54,7 +307,7 @@ var HORIZONS = [
54
307
  "done",
55
308
  "cancelled"
56
309
  ];
57
- var horizonSchema = z2.enum(HORIZONS);
310
+ var horizonSchema = z3.enum(HORIZONS);
58
311
  var ROADMAP_STATUSES = [
59
312
  "not_started",
60
313
  "planning",
@@ -64,17 +317,17 @@ var ROADMAP_STATUSES = [
64
317
  "done",
65
318
  "cancelled"
66
319
  ];
67
- var roadmapStatusSchema = z2.enum(ROADMAP_STATUSES);
320
+ var roadmapStatusSchema = z3.enum(ROADMAP_STATUSES);
68
321
  var EFFORT_SIZES = ["xs", "s", "m", "l", "xl"];
69
- var effortSchema = z2.enum(EFFORT_SIZES);
322
+ var effortSchema = z3.enum(EFFORT_SIZES);
70
323
  var DATE_GRANULARITIES = ["day", "month", "quarter", "half-year", "year"];
71
- var dateGranularitySchema = z2.enum(DATE_GRANULARITIES);
324
+ var dateGranularitySchema = z3.enum(DATE_GRANULARITIES);
72
325
  var PRD_STATUSES = ["draft", "completed"];
73
- var prdStatusSchema = z2.enum(PRD_STATUSES);
326
+ var prdStatusSchema = z3.enum(PRD_STATUSES);
74
327
  var IDEA_STATUSES = ["new", "under-review", "planned", "declined", "done"];
75
- var ideaStatusSchema = z2.enum(IDEA_STATUSES);
328
+ var ideaStatusSchema = z3.enum(IDEA_STATUSES);
76
329
  var FEATURE_TYPES = ["area", "feature"];
77
- var featureTypeSchema = z2.enum(FEATURE_TYPES);
330
+ var featureTypeSchema = z3.enum(FEATURE_TYPES);
78
331
  var PRODUCT_TYPES = [
79
332
  "brand",
80
333
  "product",
@@ -83,439 +336,439 @@ var PRODUCT_TYPES = [
83
336
  "landing_page",
84
337
  "service"
85
338
  ];
86
- var productTypeSchema = z2.enum(PRODUCT_TYPES);
339
+ var productTypeSchema = z3.enum(PRODUCT_TYPES);
87
340
  var AUDIENCE_TYPES = ["stakeholder", "user_persona"];
88
- var audienceTypeSchema = z2.enum(AUDIENCE_TYPES);
341
+ var audienceTypeSchema = z3.enum(AUDIENCE_TYPES);
89
342
  var BRAINSTORM_MEDIA_TYPES = ["image", "video"];
90
- var brainstormMediaTypeSchema = z2.enum(BRAINSTORM_MEDIA_TYPES);
343
+ var brainstormMediaTypeSchema = z3.enum(BRAINSTORM_MEDIA_TYPES);
91
344
  // ../../packages/shared/src/schemas/context.ts
92
- import { z as z3 } from "zod";
93
- var domainContextSchema = z3.object({
94
- definitions: z3.record(z3.string(), z3.string()),
95
- schemas: z3.record(z3.string(), z3.array(z3.string()))
345
+ import { z as z4 } from "zod";
346
+ var domainContextSchema = z4.object({
347
+ definitions: z4.record(z4.string(), z4.string()),
348
+ schemas: z4.record(z4.string(), z4.array(z4.string()))
96
349
  });
97
350
  // ../../packages/shared/src/schemas/export.ts
98
- import { z as z4 } from "zod";
99
- var localEntityTypeSchema = z4.enum(["roadmap", "prd", "epic", "story", "design"]);
100
- var externalSystemSchema = z4.enum(["linear", "notion", "jira", "github"]);
101
- var exportSchema = z4.object({
102
- id: z4.string().uuid(),
103
- roadmapItemId: z4.string().uuid(),
351
+ import { z as z5 } from "zod";
352
+ var localEntityTypeSchema = z5.enum(["roadmap", "prd", "epic", "story", "design"]);
353
+ var externalSystemSchema = z5.enum(["linear", "notion", "jira", "github"]);
354
+ var exportSchema = z5.object({
355
+ id: z5.string().uuid(),
356
+ roadmapItemId: z5.string().uuid(),
104
357
  localEntityType: localEntityTypeSchema,
105
- localEntityId: z4.string().uuid(),
358
+ localEntityId: z5.string().uuid(),
106
359
  externalSystem: externalSystemSchema,
107
- externalObjectType: z4.string(),
108
- externalId: z4.string(),
109
- externalUrl: z4.string().nullable(),
110
- metadata: z4.record(z4.unknown()).nullable(),
111
- createdAt: z4.string(),
112
- updatedAt: z4.string()
360
+ externalObjectType: z5.string(),
361
+ externalId: z5.string(),
362
+ externalUrl: z5.string().nullable(),
363
+ metadata: z5.record(z5.unknown()).nullable(),
364
+ createdAt: z5.string(),
365
+ updatedAt: z5.string()
113
366
  });
114
- var createExportInputSchema = z4.object({
115
- roadmapId: z4.string().uuid(),
367
+ var createExportInputSchema = z5.object({
368
+ roadmapId: z5.string().uuid(),
116
369
  localEntityType: localEntityTypeSchema,
117
- localEntityId: z4.string().uuid(),
370
+ localEntityId: z5.string().uuid(),
118
371
  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()
372
+ externalObjectType: z5.string().min(1),
373
+ externalId: z5.string().min(1),
374
+ externalUrl: z5.string().url().optional(),
375
+ metadata: z5.record(z5.unknown()).optional()
123
376
  });
124
- var updateExportInputSchema = z4.object({
125
- externalUrl: z4.string().url().nullable().optional(),
126
- metadata: z4.record(z4.unknown()).optional()
377
+ var updateExportInputSchema = z5.object({
378
+ externalUrl: z5.string().url().nullable().optional(),
379
+ metadata: z5.record(z5.unknown()).optional()
127
380
  });
128
- var searchExportsInputSchema = z4.object({
129
- roadmapId: z4.string().uuid().optional(),
381
+ var searchExportsInputSchema = z5.object({
382
+ roadmapId: z5.string().uuid().optional(),
130
383
  externalSystem: externalSystemSchema.optional(),
131
384
  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()
385
+ localEntityId: z5.string().uuid().optional(),
386
+ limit: z5.number().int().min(1).max(100).optional(),
387
+ offset: z5.number().int().min(0).optional()
135
388
  });
136
389
  // ../../packages/shared/src/schemas/feature.ts
137
- import { z as z5 } from "zod";
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()
390
+ import { z as z6 } from "zod";
391
+ var featureOutcomeSchema = z6.object({
392
+ id: z6.string().uuid(),
393
+ description: z6.string(),
394
+ order: z6.number().int(),
395
+ createdAt: z6.string(),
396
+ updatedAt: z6.string()
144
397
  });
145
- var featureSchema = z5.object({
146
- id: z5.string().uuid(),
147
- organizationId: z5.string(),
398
+ var featureSchema = z6.object({
399
+ id: z6.string().uuid(),
400
+ organizationId: z6.string(),
148
401
  type: featureTypeSchema,
149
- name: z5.string(),
150
- description: z5.string().nullable(),
151
- parentId: z5.string().uuid().nullable(),
152
- order: z5.number().int(),
153
- isExpanded: z5.boolean(),
154
- deletedAt: z5.string().nullable(),
155
- createdAt: z5.string(),
156
- createdBy: z5.string()
402
+ name: z6.string(),
403
+ description: z6.string().nullable(),
404
+ parentId: z6.string().uuid().nullable(),
405
+ order: z6.number().int(),
406
+ isExpanded: z6.boolean(),
407
+ deletedAt: z6.string().nullable(),
408
+ createdAt: z6.string(),
409
+ createdBy: z6.string()
157
410
  });
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()
411
+ var roadmapLinkSchema = z6.object({
412
+ id: z6.string().uuid(),
413
+ roadmapId: z6.string().uuid(),
414
+ roadmap: z6.object({
415
+ id: z6.string().uuid(),
416
+ title: z6.string(),
417
+ status: z6.string(),
418
+ horizon: z6.string()
166
419
  }),
167
- createdAt: z5.string()
420
+ createdAt: z6.string()
168
421
  });
169
422
  var featureWithRelationsSchema = featureSchema.extend({
170
- outcomes: z5.array(featureOutcomeSchema),
171
- roadmapLinks: z5.array(roadmapLinkSchema),
172
- children: z5.array(featureSchema).optional()
423
+ outcomes: z6.array(featureOutcomeSchema),
424
+ roadmapLinks: z6.array(roadmapLinkSchema),
425
+ children: z6.array(featureSchema).optional()
173
426
  });
174
- var createFeatureSchema = z5.object({
175
- name: z5.string().min(1),
176
- description: z5.string().nullable().optional(),
427
+ var createFeatureSchema = z6.object({
428
+ name: z6.string().min(1),
429
+ description: z6.string().nullable().optional(),
177
430
  type: featureTypeSchema.optional(),
178
- parentId: z5.string().uuid().nullable().optional()
431
+ parentId: z6.string().uuid().nullable().optional()
179
432
  });
180
- var updateFeatureSchema = z5.object({
181
- name: z5.string().min(1).optional(),
182
- description: z5.string().nullable().optional(),
433
+ var updateFeatureSchema = z6.object({
434
+ name: z6.string().min(1).optional(),
435
+ description: z6.string().nullable().optional(),
183
436
  type: featureTypeSchema.optional(),
184
- parentId: z5.string().uuid().nullable().optional(),
185
- order: z5.number().int().optional()
437
+ parentId: z6.string().uuid().nullable().optional(),
438
+ order: z6.number().int().optional()
186
439
  });
187
- var saveFeatureOutcomesSchema = z5.object({
188
- outcomes: z5.array(z5.object({
189
- id: z5.string().uuid().optional(),
190
- description: z5.string()
440
+ var saveFeatureOutcomesSchema = z6.object({
441
+ outcomes: z6.array(z6.object({
442
+ id: z6.string().uuid().optional(),
443
+ description: z6.string()
191
444
  }))
192
445
  });
193
- var featureListSchema = z5.array(featureSchema);
446
+ var featureListSchema = z6.array(featureSchema);
194
447
  // ../../packages/shared/src/schemas/idea.ts
195
- import { z as z6 } from "zod";
196
- var ideaSchema = z6.object({
197
- id: z6.string().uuid(),
198
- organizationId: z6.string(),
199
- title: z6.string(),
200
- description: z6.string().nullable(),
201
- status: ideaStatusSchema,
202
- source: z6.string().nullable(),
203
- submittedBy: z6.string().nullable(),
204
- value: effortSchema.nullable(),
205
- effort: effortSchema.nullable(),
206
- order: z6.number().int(),
207
- createdAt: z6.string(),
208
- createdBy: z6.string()
209
- });
210
- var createIdeaSchema = z6.object({
211
- title: z6.string().min(1),
212
- description: z6.string().nullable().optional(),
213
- status: ideaStatusSchema.optional(),
214
- effort: effortSchema.nullable().optional(),
215
- source: z6.string().nullable().optional()
216
- });
217
- var updateIdeaSchema = z6.object({
218
- title: z6.string().min(1).optional(),
219
- description: z6.string().nullable().optional(),
220
- status: ideaStatusSchema.optional(),
221
- effort: effortSchema.nullable().optional(),
222
- source: z6.string().nullable().optional(),
223
- order: z6.number().int().optional()
224
- });
225
- var ideaListSchema = z6.array(ideaSchema);
226
- // ../../packages/shared/src/schemas/presentation.ts
227
448
  import { z as z7 } from "zod";
228
- var presentationSchema = z7.object({
449
+ var ideaSchema = z7.object({
229
450
  id: z7.string().uuid(),
230
451
  organizationId: z7.string(),
231
452
  title: z7.string(),
232
453
  description: z7.string().nullable(),
454
+ status: ideaStatusSchema,
455
+ source: z7.string().nullable(),
456
+ submittedBy: z7.string().nullable(),
457
+ value: effortSchema.nullable(),
458
+ effort: effortSchema.nullable(),
233
459
  order: z7.number().int(),
234
460
  createdAt: z7.string(),
235
- createdBy: z7.string(),
236
- updatedAt: z7.string().nullable()
461
+ createdBy: z7.string()
237
462
  });
238
- var createPresentationSchema = z7.object({
463
+ var createIdeaSchema = z7.object({
239
464
  title: z7.string().min(1),
240
- description: z7.string().nullable().optional()
465
+ description: z7.string().nullable().optional(),
466
+ status: ideaStatusSchema.optional(),
467
+ effort: effortSchema.nullable().optional(),
468
+ source: z7.string().nullable().optional()
241
469
  });
242
- var updatePresentationSchema = z7.object({
470
+ var updateIdeaSchema = z7.object({
243
471
  title: z7.string().min(1).optional(),
244
- description: z7.string().nullable().optional()
472
+ description: z7.string().nullable().optional(),
473
+ status: ideaStatusSchema.optional(),
474
+ effort: effortSchema.nullable().optional(),
475
+ source: z7.string().nullable().optional(),
476
+ order: z7.number().int().optional()
245
477
  });
246
- var presentationListSchema = z7.array(presentationSchema);
247
- // ../../packages/shared/src/schemas/product.ts
478
+ var ideaListSchema = z7.array(ideaSchema);
479
+ // ../../packages/shared/src/schemas/presentation.ts
248
480
  import { z as z8 } from "zod";
249
- var productSchema = z8.object({
481
+ var presentationSchema = z8.object({
250
482
  id: z8.string().uuid(),
251
483
  organizationId: z8.string(),
252
- parentId: z8.string().uuid().nullable(),
253
- type: productTypeSchema,
254
- name: z8.string(),
484
+ title: z8.string(),
485
+ description: z8.string().nullable(),
255
486
  order: z8.number().int(),
256
- isExpanded: z8.boolean(),
257
- deletedAt: z8.string().nullable(),
258
- createdAt: z8.string()
487
+ createdAt: z8.string(),
488
+ createdBy: z8.string(),
489
+ updatedAt: z8.string().nullable()
490
+ });
491
+ var createPresentationSchema = z8.object({
492
+ title: z8.string().min(1),
493
+ description: z8.string().nullable().optional()
494
+ });
495
+ var updatePresentationSchema = z8.object({
496
+ title: z8.string().min(1).optional(),
497
+ description: z8.string().nullable().optional()
498
+ });
499
+ var presentationListSchema = z8.array(presentationSchema);
500
+ // ../../packages/shared/src/schemas/product.ts
501
+ import { z as z9 } from "zod";
502
+ var productSchema = z9.object({
503
+ id: z9.string().uuid(),
504
+ organizationId: z9.string(),
505
+ parentId: z9.string().uuid().nullable(),
506
+ type: productTypeSchema,
507
+ name: z9.string(),
508
+ order: z9.number().int(),
509
+ isExpanded: z9.boolean(),
510
+ deletedAt: z9.string().nullable(),
511
+ createdAt: z9.string()
259
512
  });
260
- var createProductSchema = z8.object({
261
- name: z8.string().min(1),
262
- description: z8.string().nullable().optional(),
513
+ var createProductSchema = z9.object({
514
+ name: z9.string().min(1),
515
+ description: z9.string().nullable().optional(),
263
516
  type: productTypeSchema,
264
- parentId: z8.string().uuid().nullable().optional()
517
+ parentId: z9.string().uuid().nullable().optional()
265
518
  });
266
- var updateProductSchema = z8.object({
267
- name: z8.string().min(1).optional(),
268
- description: z8.string().nullable().optional(),
519
+ var updateProductSchema = z9.object({
520
+ name: z9.string().min(1).optional(),
521
+ description: z9.string().nullable().optional(),
269
522
  type: productTypeSchema.optional(),
270
- parentId: z8.string().uuid().nullable().optional(),
271
- order: z8.number().int().optional()
523
+ parentId: z9.string().uuid().nullable().optional(),
524
+ order: z9.number().int().optional()
272
525
  });
273
- var productListSchema = z8.array(productSchema);
526
+ var productListSchema = z9.array(productSchema);
274
527
  // ../../packages/shared/src/schemas/roadmap.ts
275
- import { z as z10 } from "zod";
528
+ import { z as z11 } from "zod";
276
529
 
277
530
  // ../../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()
531
+ import { z as z10 } from "zod";
532
+ var epicSchema = z10.object({
533
+ id: z10.string().uuid(),
534
+ roadmapItemId: z10.string().uuid(),
535
+ organizationId: z10.string(),
536
+ title: z10.string(),
537
+ description: z10.string().nullable(),
538
+ order: z10.number().int(),
539
+ createdAt: z10.string(),
540
+ updatedAt: z10.string(),
541
+ deletedAt: z10.string().nullable()
289
542
  });
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()
543
+ var storySchema = z10.object({
544
+ id: z10.string().uuid(),
545
+ roadmapItemId: z10.string().uuid(),
546
+ epicId: z10.string().uuid().nullable(),
547
+ organizationId: z10.string(),
548
+ title: z10.string(),
549
+ description: z10.string().nullable(),
550
+ order: z10.number().int(),
551
+ createdAt: z10.string(),
552
+ updatedAt: z10.string(),
553
+ deletedAt: z10.string().nullable()
301
554
  });
302
555
  var epicWithStoriesSchema = epicSchema.extend({
303
- stories: z9.array(storySchema)
556
+ stories: z10.array(storySchema)
304
557
  });
305
- var createEpicSchema = z9.object({
306
- title: z9.string().min(1),
307
- description: z9.string().nullable().optional()
558
+ var createEpicSchema = z10.object({
559
+ title: z10.string().min(1),
560
+ description: z10.string().nullable().optional()
308
561
  });
309
- var createStorySchema = z9.object({
310
- title: z9.string().min(1),
311
- description: z9.string().nullable().optional()
562
+ var createStorySchema = z10.object({
563
+ title: z10.string().min(1),
564
+ description: z10.string().nullable().optional()
312
565
  });
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()
566
+ var saveStoriesInputSchema = z10.object({
567
+ epics: z10.array(z10.object({
568
+ title: z10.string().min(1),
569
+ description: z10.string().nullable().optional(),
570
+ stories: z10.array(z10.object({
571
+ title: z10.string().min(1),
572
+ description: z10.string().nullable().optional()
320
573
  })).optional().default([])
321
574
  })).optional().default([]),
322
- stories: z9.array(z9.object({
323
- title: z9.string().min(1),
324
- description: z9.string().nullable().optional()
575
+ stories: z10.array(z10.object({
576
+ title: z10.string().min(1),
577
+ description: z10.string().nullable().optional()
325
578
  })).optional().default([])
326
579
  });
327
- var updateEpicSchema = z9.object({
328
- title: z9.string().min(1).optional(),
329
- description: z9.string().nullable().optional()
580
+ var updateEpicSchema = z10.object({
581
+ title: z10.string().min(1).optional(),
582
+ description: z10.string().nullable().optional()
330
583
  });
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()
584
+ var updateStorySchema = z10.object({
585
+ title: z10.string().min(1).optional(),
586
+ description: z10.string().nullable().optional(),
587
+ epicId: z10.string().uuid().nullable().optional()
335
588
  });
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()
589
+ var reorderStoriesSchema = z10.object({
590
+ epicOrder: z10.array(z10.string().uuid()).optional(),
591
+ storyOrder: z10.record(z10.string(), z10.array(z10.string().uuid())).optional(),
592
+ standaloneOrder: z10.array(z10.string().uuid()).optional()
340
593
  });
341
594
 
342
595
  // ../../packages/shared/src/schemas/roadmap.ts
343
- var flexibleDateSchema = z10.object({
344
- value: z10.string(),
596
+ var flexibleDateSchema = z11.object({
597
+ value: z11.string(),
345
598
  granularity: dateGranularitySchema
346
599
  });
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()
600
+ var labelSchema = z11.object({
601
+ id: z11.string().uuid(),
602
+ type: z11.enum(["category", "location", "label"]),
603
+ name: z11.string(),
604
+ color: z11.string().nullable(),
605
+ address: z11.string().nullable()
353
606
  });
354
- var appSchema = z10.object({
355
- id: z10.string().uuid(),
356
- name: z10.string()
607
+ var appSchema = z11.object({
608
+ id: z11.string().uuid(),
609
+ name: z11.string()
357
610
  });
358
- var roadmapSchema = z10.object({
359
- id: z10.string().uuid(),
360
- organizationId: z10.string(),
361
- title: z10.string(),
611
+ var roadmapSchema = z11.object({
612
+ id: z11.string().uuid(),
613
+ organizationId: z11.string(),
614
+ title: z11.string(),
362
615
  horizon: horizonSchema.nullable(),
363
616
  status: roadmapStatusSchema.nullable(),
364
617
  value: effortSchema.nullable(),
365
618
  effort: effortSchema.nullable(),
366
- order: z10.number().int(),
367
- estimatedSeconds: z10.number().int().nullable(),
619
+ order: z11.number().int(),
620
+ estimatedSeconds: z11.number().int().nullable(),
368
621
  date: flexibleDateSchema.nullable(),
369
622
  target: flexibleDateSchema.nullable(),
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)
623
+ completedAt: z11.string().nullable(),
624
+ createdAt: z11.string(),
625
+ createdBy: z11.string(),
626
+ prompt: z11.string().nullable(),
627
+ labels: z11.array(labelSchema),
628
+ apps: z11.array(appSchema)
376
629
  });
377
- var createRoadmapSchema = z10.object({
378
- title: z10.string().min(1),
630
+ var createRoadmapSchema = z11.object({
631
+ title: z11.string().min(1),
379
632
  status: roadmapStatusSchema.optional(),
380
633
  horizon: horizonSchema.optional(),
381
634
  value: effortSchema.nullable().optional(),
382
635
  effort: effortSchema.nullable().optional(),
383
- estimatedSeconds: z10.number().int().nullable().optional(),
636
+ estimatedSeconds: z11.number().int().nullable().optional(),
384
637
  date: flexibleDateSchema.nullable().optional(),
385
638
  target: flexibleDateSchema.nullable().optional(),
386
- prompt: z10.string().nullable().optional(),
387
- brainstormNotes: z10.string().nullable().optional()
639
+ prompt: z11.string().nullable().optional(),
640
+ brainstormNotes: z11.string().nullable().optional()
388
641
  });
389
- var updateRoadmapSchema = z10.object({
390
- title: z10.string().min(1).optional(),
642
+ var updateRoadmapSchema = z11.object({
643
+ title: z11.string().min(1).optional(),
391
644
  status: roadmapStatusSchema.optional(),
392
645
  horizon: horizonSchema.optional(),
393
646
  value: effortSchema.nullable().optional(),
394
647
  effort: effortSchema.nullable().optional(),
395
- order: z10.number().int().optional(),
396
- estimatedSeconds: z10.number().int().nullable().optional(),
648
+ order: z11.number().int().optional(),
649
+ estimatedSeconds: z11.number().int().nullable().optional(),
397
650
  date: flexibleDateSchema.nullable().optional(),
398
651
  target: flexibleDateSchema.nullable().optional(),
399
- prompt: z10.string().nullable().optional(),
400
- brainstormNotes: z10.string().nullable().optional()
652
+ prompt: z11.string().nullable().optional(),
653
+ brainstormNotes: z11.string().nullable().optional()
401
654
  });
402
- var prdOutcomeSchema = z10.object({
403
- id: z10.string().uuid(),
404
- description: z10.string(),
655
+ var prdOutcomeSchema = z11.object({
656
+ id: z11.string().uuid(),
657
+ description: z11.string(),
405
658
  status: prdStatusSchema,
406
- order: z10.number().int(),
407
- completedAt: z10.string().nullable()
659
+ order: z11.number().int(),
660
+ completedAt: z11.string().nullable()
408
661
  });
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)
662
+ var prdSchema = z11.object({
663
+ id: z11.string().uuid(),
664
+ what: z11.string().nullable(),
665
+ why: z11.string().nullable(),
666
+ outcomes: z11.array(prdOutcomeSchema)
414
667
  });
415
- var savePrdInputSchema = z10.object({
416
- what: z10.string().nullable(),
417
- why: z10.string().nullable(),
668
+ var savePrdInputSchema = z11.object({
669
+ what: z11.string().nullable(),
670
+ why: z11.string().nullable(),
418
671
  status: prdStatusSchema,
419
- outcomes: z10.array(z10.object({
420
- id: z10.string().uuid().optional(),
421
- description: z10.string(),
422
- order: z10.number().int().min(0)
672
+ outcomes: z11.array(z11.object({
673
+ id: z11.string().uuid().optional(),
674
+ description: z11.string(),
675
+ order: z11.number().int().min(0)
423
676
  }))
424
677
  });
425
- var brainstormMediaSchema = z10.object({
426
- id: z10.string().uuid(),
427
- mediaUrl: z10.string(),
678
+ var brainstormMediaSchema = z11.object({
679
+ id: z11.string().uuid(),
680
+ mediaUrl: z11.string(),
428
681
  mediaType: brainstormMediaTypeSchema,
429
- description: z10.string().nullable(),
430
- order: z10.number().int(),
431
- createdAt: z10.string()
682
+ description: z11.string().nullable(),
683
+ order: z11.number().int(),
684
+ createdAt: z11.string()
432
685
  });
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()
686
+ var wireframeSchema = z11.object({
687
+ id: z11.string().uuid(),
688
+ description: z11.string().nullable(),
689
+ imageUrl: z11.string().nullable(),
690
+ order: z11.number().int()
438
691
  });
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()
692
+ var prototypeSchema = z11.object({
693
+ id: z11.string().uuid(),
694
+ publicUrl: z11.string().url(),
695
+ expiresAt: z11.string().datetime(),
696
+ fileCount: z11.number().int().positive(),
697
+ entryPoint: z11.string(),
698
+ createdAt: z11.string().datetime()
446
699
  });
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"])
700
+ var featureLinkSchema = z11.object({
701
+ id: z11.string().uuid(),
702
+ featureId: z11.string().uuid(),
703
+ feature: z11.object({
704
+ id: z11.string().uuid(),
705
+ name: z11.string(),
706
+ type: z11.enum(["area", "feature"])
454
707
  }),
455
- createdAt: z10.string()
708
+ createdAt: z11.string()
456
709
  });
457
- var phaseDesignSchema = z10.object({
458
- id: z10.string().uuid(),
459
- description: z10.string().nullable()
710
+ var phaseDesignSchema = z11.object({
711
+ id: z11.string().uuid(),
712
+ description: z11.string().nullable()
460
713
  });
461
- var phasePlanSchema = z10.object({
462
- id: z10.string().uuid(),
463
- description: z10.string().nullable()
714
+ var phasePlanSchema = z11.object({
715
+ id: z11.string().uuid(),
716
+ description: z11.string().nullable()
464
717
  });
465
- var phaseBuildSchema = z10.object({
466
- id: z10.string().uuid(),
467
- description: z10.string().nullable(),
468
- prompt: z10.string().nullable()
718
+ var phaseBuildSchema = z11.object({
719
+ id: z11.string().uuid(),
720
+ description: z11.string().nullable(),
721
+ prompt: z11.string().nullable()
469
722
  });
470
- var phaseReleaseSchema = z10.object({
471
- id: z10.string().uuid(),
472
- description: z10.string().nullable()
723
+ var phaseReleaseSchema = z11.object({
724
+ id: z11.string().uuid(),
725
+ description: z11.string().nullable()
473
726
  });
474
727
  var roadmapDetailSchema = roadmapSchema.extend({
475
728
  prd: prdSchema.nullable(),
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),
729
+ wireframes: z11.array(wireframeSchema),
730
+ prototypes: z11.array(prototypeSchema),
731
+ brainstormMedia: z11.array(brainstormMediaSchema),
732
+ brainstormNotes: z11.string().nullable(),
733
+ featureLinks: z11.array(featureLinkSchema),
734
+ epics: z11.array(epicWithStoriesSchema),
735
+ stories: z11.array(storySchema),
483
736
  design: phaseDesignSchema.nullable(),
484
737
  plan: phasePlanSchema.nullable(),
485
738
  build: phaseBuildSchema.nullable(),
486
739
  release: phaseReleaseSchema.nullable(),
487
- exports: z10.array(exportSchema)
740
+ exports: z11.array(exportSchema)
488
741
  });
489
- var roadmapListSchema = z10.array(roadmapSchema);
742
+ var roadmapListSchema = z11.array(roadmapSchema);
490
743
  // ../../packages/shared/src/schemas/scenario.ts
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()
744
+ import { z as z12 } from "zod";
745
+ var scenarioSchema = z12.object({
746
+ id: z12.string().uuid(),
747
+ title: z12.string().min(1),
748
+ given: z12.string().nullable(),
749
+ when: z12.string().nullable(),
750
+ then: z12.string().nullable(),
751
+ order: z12.number().int(),
752
+ createdAt: z12.string().datetime(),
753
+ updatedAt: z12.string().datetime()
501
754
  });
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()
755
+ var createScenarioSchema = z12.object({
756
+ title: z12.string().min(1),
757
+ given: z12.string().nullable().optional(),
758
+ when: z12.string().nullable().optional(),
759
+ then: z12.string().nullable().optional(),
760
+ roadmapId: z12.string().uuid()
508
761
  });
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()
762
+ var updateScenarioSchema = z12.object({
763
+ title: z12.string().min(1).optional(),
764
+ given: z12.string().nullable().optional(),
765
+ when: z12.string().nullable().optional(),
766
+ then: z12.string().nullable().optional(),
767
+ order: z12.number().int().optional()
515
768
  });
516
- var scenarioListSchema = z11.array(scenarioSchema);
769
+ var scenarioListSchema = z12.array(scenarioSchema);
517
770
  // ../../packages/shared/src/schemas/slide.ts
518
- import { z as z12 } from "zod";
771
+ import { z as z13 } from "zod";
519
772
  var SLIDE_TYPES = [
520
773
  "title",
521
774
  "section_header",
@@ -530,150 +783,150 @@ var SLIDE_TYPES = [
530
783
  "mermaid",
531
784
  "paragraph"
532
785
  ];
533
- var slideTypeSchema = z12.enum(SLIDE_TYPES);
534
- var titleContentSchema = z12.object({
535
- title: z12.string(),
536
- subtitle: z12.string().optional()
786
+ var slideTypeSchema = z13.enum(SLIDE_TYPES);
787
+ var titleContentSchema = z13.object({
788
+ title: z13.string(),
789
+ subtitle: z13.string().optional()
537
790
  });
538
- var sectionHeaderContentSchema = z12.object({
539
- title: z12.string(),
540
- subtitle: z12.string().optional()
791
+ var sectionHeaderContentSchema = z13.object({
792
+ title: z13.string(),
793
+ subtitle: z13.string().optional()
541
794
  });
542
- var bulletsContentSchema = z12.object({
543
- title: z12.string().optional(),
544
- items: z12.array(z12.string()).default([])
795
+ var bulletsContentSchema = z13.object({
796
+ title: z13.string().optional(),
797
+ items: z13.array(z13.string()).default([])
545
798
  });
546
- var twoColumnContentSchema = z12.object({
547
- title: z12.string().optional(),
548
- left: z12.string().default(""),
549
- right: z12.string().default("")
799
+ var twoColumnContentSchema = z13.object({
800
+ title: z13.string().optional(),
801
+ left: z13.string().default(""),
802
+ right: z13.string().default("")
550
803
  });
551
- var comparisonContentSchema = z12.object({
552
- leftLabel: z12.string().default(""),
553
- leftContent: z12.string().default(""),
554
- rightLabel: z12.string().default(""),
555
- rightContent: z12.string().default("")
804
+ var comparisonContentSchema = z13.object({
805
+ leftLabel: z13.string().default(""),
806
+ leftContent: z13.string().default(""),
807
+ rightLabel: z13.string().default(""),
808
+ rightContent: z13.string().default("")
556
809
  });
557
- var timelineStepSchema = z12.object({
558
- title: z12.string(),
559
- description: z12.string().optional()
810
+ var timelineStepSchema = z13.object({
811
+ title: z13.string(),
812
+ description: z13.string().optional()
560
813
  });
561
- var timelineContentSchema = z12.object({
562
- title: z12.string().optional(),
563
- steps: z12.array(timelineStepSchema).default([])
814
+ var timelineContentSchema = z13.object({
815
+ title: z13.string().optional(),
816
+ steps: z13.array(timelineStepSchema).default([])
564
817
  });
565
- var imageContentSchema = z12.object({
566
- title: z12.string().optional(),
567
- imageUrl: z12.string().optional(),
568
- caption: z12.string().optional()
818
+ var imageContentSchema = z13.object({
819
+ title: z13.string().optional(),
820
+ imageUrl: z13.string().optional(),
821
+ caption: z13.string().optional()
569
822
  });
570
- var quoteContentSchema = z12.object({
571
- quote: z12.string().default(""),
572
- attribution: z12.string().optional()
823
+ var quoteContentSchema = z13.object({
824
+ quote: z13.string().default(""),
825
+ attribution: z13.string().optional()
573
826
  });
574
- var codeContentSchema = z12.object({
575
- title: z12.string().optional(),
576
- code: z12.string().default(""),
577
- language: z12.string().optional(),
578
- highlightLines: z12.array(z12.number()).optional()
827
+ var codeContentSchema = z13.object({
828
+ title: z13.string().optional(),
829
+ code: z13.string().default(""),
830
+ language: z13.string().optional(),
831
+ highlightLines: z13.array(z13.number()).optional()
579
832
  });
580
- var thankYouContentSchema = z12.object({
581
- title: z12.string().default("Thank You"),
582
- subtitle: z12.string().optional(),
583
- ctaText: z12.string().optional(),
584
- ctaUrl: z12.string().optional()
833
+ var thankYouContentSchema = z13.object({
834
+ title: z13.string().default("Thank You"),
835
+ subtitle: z13.string().optional(),
836
+ ctaText: z13.string().optional(),
837
+ ctaUrl: z13.string().optional()
585
838
  });
586
- var mermaidContentSchema = z12.object({
587
- title: z12.string().optional(),
588
- code: z12.string().default("")
839
+ var mermaidContentSchema = z13.object({
840
+ title: z13.string().optional(),
841
+ code: z13.string().default("")
589
842
  });
590
- var paragraphContentSchema = z12.object({
591
- title: z12.string().optional(),
592
- body: z12.string().default("")
843
+ var paragraphContentSchema = z13.object({
844
+ title: z13.string().optional(),
845
+ body: z13.string().default("")
593
846
  });
594
- var typedSlideContentSchema = z12.discriminatedUnion("type", [
595
- z12.object({ type: z12.literal("title"), ...titleContentSchema.shape }),
596
- z12.object({ type: z12.literal("section_header"), ...sectionHeaderContentSchema.shape }),
597
- z12.object({ type: z12.literal("bullets"), ...bulletsContentSchema.shape }),
598
- z12.object({ type: z12.literal("two_column"), ...twoColumnContentSchema.shape }),
599
- z12.object({ type: z12.literal("comparison"), ...comparisonContentSchema.shape }),
600
- z12.object({ type: z12.literal("timeline"), ...timelineContentSchema.shape }),
601
- z12.object({ type: z12.literal("image"), ...imageContentSchema.shape }),
602
- z12.object({ type: z12.literal("quote"), ...quoteContentSchema.shape }),
603
- z12.object({ type: z12.literal("code"), ...codeContentSchema.shape }),
604
- z12.object({ type: z12.literal("thank_you"), ...thankYouContentSchema.shape }),
605
- z12.object({ type: z12.literal("mermaid"), ...mermaidContentSchema.shape }),
606
- z12.object({ type: z12.literal("paragraph"), ...paragraphContentSchema.shape })
847
+ var typedSlideContentSchema = z13.discriminatedUnion("type", [
848
+ z13.object({ type: z13.literal("title"), ...titleContentSchema.shape }),
849
+ z13.object({ type: z13.literal("section_header"), ...sectionHeaderContentSchema.shape }),
850
+ z13.object({ type: z13.literal("bullets"), ...bulletsContentSchema.shape }),
851
+ z13.object({ type: z13.literal("two_column"), ...twoColumnContentSchema.shape }),
852
+ z13.object({ type: z13.literal("comparison"), ...comparisonContentSchema.shape }),
853
+ z13.object({ type: z13.literal("timeline"), ...timelineContentSchema.shape }),
854
+ z13.object({ type: z13.literal("image"), ...imageContentSchema.shape }),
855
+ z13.object({ type: z13.literal("quote"), ...quoteContentSchema.shape }),
856
+ z13.object({ type: z13.literal("code"), ...codeContentSchema.shape }),
857
+ z13.object({ type: z13.literal("thank_you"), ...thankYouContentSchema.shape }),
858
+ z13.object({ type: z13.literal("mermaid"), ...mermaidContentSchema.shape }),
859
+ z13.object({ type: z13.literal("paragraph"), ...paragraphContentSchema.shape })
607
860
  ]);
608
- var slideContentSchema = z12.object({
609
- body: z12.string().optional()
861
+ var slideContentSchema = z13.object({
862
+ body: z13.string().optional()
610
863
  });
611
- var slideSchema = z12.object({
612
- id: z12.string().uuid(),
613
- variantId: z12.string().uuid(),
864
+ var slideSchema = z13.object({
865
+ id: z13.string().uuid(),
866
+ variantId: z13.string().uuid(),
614
867
  slideType: slideTypeSchema,
615
- title: z12.string(),
616
- content: z12.unknown().nullable(),
617
- speakerNotes: z12.string().nullable(),
618
- order: z12.number().int(),
619
- createdAt: z12.string(),
620
- createdBy: z12.string(),
621
- updatedAt: z12.string().nullable()
868
+ title: z13.string(),
869
+ content: z13.unknown().nullable(),
870
+ speakerNotes: z13.string().nullable(),
871
+ order: z13.number().int(),
872
+ createdAt: z13.string(),
873
+ createdBy: z13.string(),
874
+ updatedAt: z13.string().nullable()
622
875
  });
623
- var createSlideSchema = z12.object({
876
+ var createSlideSchema = z13.object({
624
877
  slideType: slideTypeSchema,
625
- content: z12.unknown().optional(),
626
- speakerNotes: z12.string().nullable().optional()
878
+ content: z13.unknown().optional(),
879
+ speakerNotes: z13.string().nullable().optional()
627
880
  });
628
- var updateSlideSchema = z12.object({
629
- content: z12.unknown().optional(),
630
- speakerNotes: z12.string().nullable().optional()
881
+ var updateSlideSchema = z13.object({
882
+ content: z13.unknown().optional(),
883
+ speakerNotes: z13.string().nullable().optional()
631
884
  });
632
- var slideListSchema = z12.array(slideSchema);
885
+ var slideListSchema = z13.array(slideSchema);
633
886
  // ../../packages/shared/src/schemas/status-update.ts
634
- import { z as z13 } from "zod";
635
- var statusUpdateItemSchema = z13.object({
636
- id: z13.string().uuid(),
637
- roadmapItemId: z13.string().uuid(),
638
- titleAtSnapshot: z13.string(),
639
- statusAtSnapshot: z13.string(),
640
- designWalkthroughUrl: z13.string().nullable(),
641
- releaseWalkthroughUrl: z13.string().nullable()
642
- });
643
- var statusUpdateSchema = z13.object({
644
- id: z13.string().uuid(),
645
- title: z13.string().nullable(),
646
- startDate: z13.string(),
647
- endDate: z13.string(),
648
- content: z13.string(),
649
- createdAt: z13.string(),
650
- items: z13.array(statusUpdateItemSchema).optional()
651
- });
652
- var statusUpdateListSchema = z13.array(statusUpdateSchema);
653
- // ../../packages/shared/src/schemas/variant.ts
654
887
  import { z as z14 } from "zod";
655
- var variantSchema = z14.object({
888
+ var statusUpdateItemSchema = z14.object({
889
+ id: z14.string().uuid(),
890
+ roadmapItemId: z14.string().uuid(),
891
+ titleAtSnapshot: z14.string(),
892
+ statusAtSnapshot: z14.string(),
893
+ designWalkthroughUrl: z14.string().nullable(),
894
+ releaseWalkthroughUrl: z14.string().nullable()
895
+ });
896
+ var statusUpdateSchema = z14.object({
656
897
  id: z14.string().uuid(),
657
- presentationId: z14.string().uuid(),
658
- name: z14.string(),
659
- audienceId: z14.string().uuid().nullable(),
660
- isDefault: z14.boolean(),
661
- order: z14.number().int(),
898
+ title: z14.string().nullable(),
899
+ startDate: z14.string(),
900
+ endDate: z14.string(),
901
+ content: z14.string(),
662
902
  createdAt: z14.string(),
663
- createdBy: z14.string(),
664
- updatedAt: z14.string().nullable()
903
+ items: z14.array(statusUpdateItemSchema).optional()
665
904
  });
666
- var createVariantSchema = z14.object({
667
- name: z14.string().min(1),
668
- audienceId: z14.string().uuid().nullable().optional()
905
+ var statusUpdateListSchema = z14.array(statusUpdateSchema);
906
+ // ../../packages/shared/src/schemas/variant.ts
907
+ import { z as z15 } from "zod";
908
+ var variantSchema = z15.object({
909
+ id: z15.string().uuid(),
910
+ presentationId: z15.string().uuid(),
911
+ name: z15.string(),
912
+ audienceId: z15.string().uuid().nullable(),
913
+ isDefault: z15.boolean(),
914
+ order: z15.number().int(),
915
+ createdAt: z15.string(),
916
+ createdBy: z15.string(),
917
+ updatedAt: z15.string().nullable()
669
918
  });
670
- var updateVariantSchema = z14.object({
671
- name: z14.string().min(1).optional(),
672
- audienceId: z14.string().uuid().nullable().optional()
919
+ var createVariantSchema = z15.object({
920
+ name: z15.string().min(1),
921
+ audienceId: z15.string().uuid().nullable().optional()
673
922
  });
674
- var variantListSchema = z14.array(variantSchema);
923
+ var updateVariantSchema = z15.object({
924
+ name: z15.string().min(1).optional(),
925
+ audienceId: z15.string().uuid().nullable().optional()
926
+ });
927
+ var variantListSchema = z15.array(variantSchema);
675
928
  // src/tools/index.ts
676
- import { z as z15 } from "zod";
929
+ import { z as z16 } from "zod";
677
930
 
678
931
  // src/auth.ts
679
932
  function getCredentials() {
@@ -1162,6 +1415,10 @@ class ApiClient {
1162
1415
  });
1163
1416
  return response.data;
1164
1417
  }
1418
+ async listPrototypes(roadmapId) {
1419
+ const response = await this.request(`/v1/roadmaps/${roadmapId}/prototypes`);
1420
+ return response.data;
1421
+ }
1165
1422
  async uploadFile(uploadUrl, content, contentType) {
1166
1423
  const response = await fetch(uploadUrl, {
1167
1424
  method: "PUT",
@@ -1441,6 +1698,7 @@ function registerAllTools(server) {
1441
1698
  registerUploadDesignWalkthrough(server);
1442
1699
  registerUploadReleaseWalkthrough(server);
1443
1700
  registerPublishPrototype(server);
1701
+ registerListPrototypes(server);
1444
1702
  registerCreateFeedbackSession(server);
1445
1703
  registerListFeedbackSessions(server);
1446
1704
  registerGetFeedbackSummary(server);
@@ -1494,13 +1752,13 @@ function registerSearchRoadmaps(server) {
1494
1752
  server.registerTool("search_roadmaps", {
1495
1753
  description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
1496
1754
  inputSchema: {
1497
- query: z15.string().optional().describe("Search query to match against title or description"),
1755
+ query: z16.string().optional().describe("Search query to match against title or description"),
1498
1756
  status: roadmapStatusSchema.optional().describe("Filter by status"),
1499
1757
  horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1500
- phase: z15.string().optional().describe("Filter by phase"),
1501
- phaseStep: z15.string().optional().describe("Filter by phase step"),
1502
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1503
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
1758
+ phase: z16.string().optional().describe("Filter by phase"),
1759
+ phaseStep: z16.string().optional().describe("Filter by phase step"),
1760
+ limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1761
+ offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
1504
1762
  }
1505
1763
  }, async ({
1506
1764
  query,
@@ -1551,7 +1809,7 @@ function registerGetRoadmap(server) {
1551
1809
  server.registerTool("get_roadmap", {
1552
1810
  description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
1553
1811
  inputSchema: {
1554
- id: z15.string().describe("The UUID of the roadmap item")
1812
+ id: z16.string().describe("The UUID of the roadmap item")
1555
1813
  }
1556
1814
  }, async ({ id }) => {
1557
1815
  const client2 = getApiClient();
@@ -1568,8 +1826,16 @@ function registerGetRoadmap(server) {
1568
1826
  value: roadmap2.value,
1569
1827
  effort: roadmap2.effort,
1570
1828
  order: roadmap2.order,
1571
- prd: roadmap2.prd,
1572
- brainstormNotes: roadmap2.brainstormNotes,
1829
+ prd: roadmap2.prd ? {
1830
+ ...roadmap2.prd,
1831
+ what: contentToMarkdown(roadmap2.prd.what),
1832
+ why: contentToMarkdown(roadmap2.prd.why),
1833
+ outcomes: roadmap2.prd.outcomes?.map((o) => ({
1834
+ ...o,
1835
+ description: contentToMarkdown(o.description)
1836
+ }))
1837
+ } : null,
1838
+ brainstormNotes: contentToMarkdown(roadmap2.brainstormNotes),
1573
1839
  wireframes: roadmap2.wireframes?.map((w) => ({
1574
1840
  id: w.id,
1575
1841
  imageUrl: w.imageUrl,
@@ -1589,10 +1855,10 @@ function registerGetRoadmap(server) {
1589
1855
  })),
1590
1856
  epics: roadmap2.epics,
1591
1857
  stories: roadmap2.stories,
1592
- designDescription: roadmap2.design?.description ?? null,
1593
- planDescription: roadmap2.plan?.description ?? null,
1594
- buildDescription: roadmap2.build?.description ?? null,
1595
- releaseDescription: roadmap2.release?.description ?? null,
1858
+ designDescription: contentToMarkdown(roadmap2.design?.description),
1859
+ planDescription: contentToMarkdown(roadmap2.plan?.description),
1860
+ buildDescription: contentToMarkdown(roadmap2.build?.description),
1861
+ releaseDescription: contentToMarkdown(roadmap2.release?.description),
1596
1862
  prompt: roadmap2.build?.prompt ?? roadmap2.prompt ?? null,
1597
1863
  createdAt: roadmap2.createdAt
1598
1864
  }, null, 2)
@@ -1605,7 +1871,7 @@ function registerSearchFeatures(server) {
1605
1871
  server.registerTool("search_features", {
1606
1872
  description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
1607
1873
  inputSchema: {
1608
- query: z15.string().optional().describe("Search query to match against name"),
1874
+ query: z16.string().optional().describe("Search query to match against name"),
1609
1875
  type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
1610
1876
  }
1611
1877
  }, async ({ query, type }) => {
@@ -1637,7 +1903,7 @@ function registerGetFeature(server) {
1637
1903
  server.registerTool("get_feature", {
1638
1904
  description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
1639
1905
  inputSchema: {
1640
- id: z15.string().describe("The UUID of the feature")
1906
+ id: z16.string().describe("The UUID of the feature")
1641
1907
  }
1642
1908
  }, async ({ id }) => {
1643
1909
  const client2 = getApiClient();
@@ -1653,7 +1919,7 @@ function registerGetFeature(server) {
1653
1919
  parentId: feature2.parentId,
1654
1920
  outcomes: feature2.outcomes?.map((o) => ({
1655
1921
  id: o.id,
1656
- description: o.description
1922
+ description: contentToMarkdown(o.description)
1657
1923
  })),
1658
1924
  children: feature2.children?.map((c) => ({
1659
1925
  id: c.id,
@@ -1676,7 +1942,7 @@ function registerSearchIdeas(server) {
1676
1942
  server.registerTool("search_ideas", {
1677
1943
  description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
1678
1944
  inputSchema: {
1679
- query: z15.string().optional().describe("Search query to match against title or description"),
1945
+ query: z16.string().optional().describe("Search query to match against title or description"),
1680
1946
  status: ideaStatusSchema.optional().describe("Filter by status")
1681
1947
  }
1682
1948
  }, async ({ query, status }) => {
@@ -1696,7 +1962,7 @@ function registerSearchIdeas(server) {
1696
1962
  text: JSON.stringify(ideas.map((i) => ({
1697
1963
  id: i.id,
1698
1964
  title: i.title,
1699
- description: i.description,
1965
+ description: contentToMarkdown(i.description),
1700
1966
  status: i.status,
1701
1967
  source: i.source
1702
1968
  })), null, 2)
@@ -1733,8 +1999,8 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
1733
1999
  type: "text",
1734
2000
  text: JSON.stringify({
1735
2001
  strategy: {
1736
- vision: strategy.vision,
1737
- mission: strategy.mission
2002
+ vision: contentToMarkdown(strategy.vision),
2003
+ mission: contentToMarkdown(strategy.mission)
1738
2004
  },
1739
2005
  products: products.map((p) => ({
1740
2006
  id: p.id,
@@ -1776,9 +2042,9 @@ function registerCaptureIdea(server) {
1776
2042
  server.registerTool("capture_idea", {
1777
2043
  description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
1778
2044
  inputSchema: {
1779
- title: z15.string().describe("Title of the idea"),
1780
- description: z15.string().optional().describe("Detailed description of the idea"),
1781
- source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
2045
+ title: z16.string().describe("Title of the idea"),
2046
+ description: z16.string().optional().describe("Detailed description of the idea"),
2047
+ source: z16.string().optional().describe('Source of the idea (defaults to "claude-code")')
1782
2048
  }
1783
2049
  }, async ({
1784
2050
  title,
@@ -1815,16 +2081,16 @@ function registerCreateRoadmapItem(server) {
1815
2081
  server.registerTool("create_roadmap_item", {
1816
2082
  description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
1817
2083
  inputSchema: {
1818
- title: z15.string().describe("Title of the roadmap item"),
2084
+ title: z16.string().describe("Title of the roadmap item"),
1819
2085
  status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
1820
2086
  horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1821
- phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
1822
- phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
1823
- initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
2087
+ phase: z16.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
2088
+ phaseStep: z16.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
2089
+ initiativeId: z16.string().optional().describe("UUID of initiative to link this item to on creation"),
1824
2090
  dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1825
- dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2091
+ dateValue: z16.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1826
2092
  targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1827
- targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2093
+ targetValue: z16.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1828
2094
  }
1829
2095
  }, async ({
1830
2096
  title,
@@ -1886,30 +2152,30 @@ function registerCreateRoadmapItem(server) {
1886
2152
  };
1887
2153
  });
1888
2154
  }
1889
- var effortSizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
2155
+ var effortSizeSchema = z16.enum(["xs", "s", "m", "l", "xl"]);
1890
2156
  function registerUpdateRoadmapItem(server) {
1891
2157
  server.registerTool("update_roadmap_item", {
1892
2158
  description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
1893
2159
  inputSchema: {
1894
- id: z15.string().describe("The UUID of the roadmap item to update"),
1895
- title: z15.string().optional().describe("New title"),
2160
+ id: z16.string().describe("The UUID of the roadmap item to update"),
2161
+ title: z16.string().optional().describe("New title"),
1896
2162
  status: roadmapStatusSchema.optional().describe("New status"),
1897
2163
  horizon: horizonSchema.optional().describe("New planning horizon"),
1898
- phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
1899
- phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
1900
- value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
2164
+ phase: z16.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
2165
+ phaseStep: z16.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
2166
+ value: z16.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
1901
2167
  effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
1902
- order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
1903
- initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
1904
- designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
1905
- planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
1906
- buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
1907
- releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
1908
- prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
2168
+ order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
2169
+ initiativeId: z16.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
2170
+ designDescription: z16.string().nullable().optional().describe("Description for the Design phase"),
2171
+ planDescription: z16.string().nullable().optional().describe("Description for the Planning phase"),
2172
+ buildDescription: z16.string().nullable().optional().describe("Description for the Build phase"),
2173
+ releaseDescription: z16.string().nullable().optional().describe("Description for the Release phase"),
2174
+ prompt: z16.string().nullable().optional().describe("Build prompt for the roadmap item"),
1909
2175
  dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1910
- dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2176
+ dateValue: z16.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1911
2177
  targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1912
- targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2178
+ targetValue: z16.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1913
2179
  }
1914
2180
  }, async ({
1915
2181
  id,
@@ -2020,12 +2286,12 @@ function registerAddFeature(server) {
2020
2286
  server.registerTool("add_feature", {
2021
2287
  description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
2022
2288
  inputSchema: {
2023
- name: z15.string().describe("Name of the feature"),
2024
- description: z15.string().optional().describe("Description of the feature"),
2289
+ name: z16.string().describe("Name of the feature"),
2290
+ description: z16.string().optional().describe("Description of the feature"),
2025
2291
  type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
2026
- parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
2027
- outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
2028
- linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
2292
+ parentId: z16.string().optional().describe("UUID of parent feature/area to nest under"),
2293
+ outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes for this feature"),
2294
+ linkToRoadmapId: z16.string().optional().describe("UUID of roadmap item to link this feature to")
2029
2295
  }
2030
2296
  }, async ({
2031
2297
  name,
@@ -2072,10 +2338,10 @@ function registerSavePrd(server) {
2072
2338
  server.registerTool("save_prd", {
2073
2339
  description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
2074
2340
  inputSchema: {
2075
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
2076
- what: z15.string().nullable().describe("What is being built - the feature description"),
2077
- why: z15.string().nullable().describe("Why this is being built - the business justification"),
2078
- outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
2341
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
2342
+ what: z16.string().nullable().describe("What is being built - the feature description"),
2343
+ why: z16.string().nullable().describe("Why this is being built - the business justification"),
2344
+ outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes/success criteria")
2079
2345
  }
2080
2346
  }, async ({
2081
2347
  roadmapId,
@@ -2113,8 +2379,8 @@ function registerUpdateBrainstormNotes(server) {
2113
2379
  server.registerTool("update_brainstorm_notes", {
2114
2380
  description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
2115
2381
  inputSchema: {
2116
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
2117
- notes: z15.string().describe("The brainstorm notes content")
2382
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
2383
+ notes: z16.string().describe("The brainstorm notes content")
2118
2384
  }
2119
2385
  }, async ({ roadmapId, notes }) => {
2120
2386
  const client2 = getApiClient();
@@ -2143,7 +2409,7 @@ function registerDeleteRoadmapItem(server) {
2143
2409
  server.registerTool("delete_roadmap_item", {
2144
2410
  description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
2145
2411
  inputSchema: {
2146
- id: z15.string().describe("The UUID of the roadmap item to delete")
2412
+ id: z16.string().describe("The UUID of the roadmap item to delete")
2147
2413
  }
2148
2414
  }, async ({ id }) => {
2149
2415
  const client2 = getApiClient();
@@ -2165,9 +2431,9 @@ function registerReorderRoadmaps(server) {
2165
2431
  server.registerTool("reorder_roadmaps", {
2166
2432
  description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
2167
2433
  inputSchema: {
2168
- items: z15.array(z15.object({
2169
- id: z15.string().describe("The UUID of the roadmap item"),
2170
- order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
2434
+ items: z16.array(z16.object({
2435
+ id: z16.string().describe("The UUID of the roadmap item"),
2436
+ order: z16.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
2171
2437
  })).describe("Array of roadmap items with their new order values")
2172
2438
  }
2173
2439
  }, async ({ items }) => {
@@ -2191,10 +2457,10 @@ function registerUpdateFeature(server) {
2191
2457
  server.registerTool("update_feature", {
2192
2458
  description: "Update an existing feature. Can update name, type, or parent.",
2193
2459
  inputSchema: {
2194
- id: z15.string().describe("The UUID of the feature to update"),
2195
- name: z15.string().optional().describe("New name for the feature"),
2460
+ id: z16.string().describe("The UUID of the feature to update"),
2461
+ name: z16.string().optional().describe("New name for the feature"),
2196
2462
  type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
2197
- parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2463
+ parentId: z16.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2198
2464
  }
2199
2465
  }, async ({
2200
2466
  id,
@@ -2233,7 +2499,7 @@ function registerDeleteFeature(server) {
2233
2499
  server.registerTool("delete_feature", {
2234
2500
  description: "Delete a feature. This is a soft delete that also deletes all child features.",
2235
2501
  inputSchema: {
2236
- id: z15.string().describe("The UUID of the feature to delete")
2502
+ id: z16.string().describe("The UUID of the feature to delete")
2237
2503
  }
2238
2504
  }, async ({ id }) => {
2239
2505
  const client2 = getApiClient();
@@ -2255,7 +2521,7 @@ function registerGetIdea(server) {
2255
2521
  server.registerTool("get_idea", {
2256
2522
  description: "Get full details of a single idea by ID.",
2257
2523
  inputSchema: {
2258
- id: z15.string().describe("The UUID of the idea")
2524
+ id: z16.string().describe("The UUID of the idea")
2259
2525
  }
2260
2526
  }, async ({ id }) => {
2261
2527
  const client2 = getApiClient();
@@ -2267,7 +2533,7 @@ function registerGetIdea(server) {
2267
2533
  text: JSON.stringify({
2268
2534
  id: idea2.id,
2269
2535
  title: idea2.title,
2270
- description: idea2.description,
2536
+ description: contentToMarkdown(idea2.description),
2271
2537
  status: idea2.status,
2272
2538
  source: idea2.source,
2273
2539
  submittedBy: idea2.submittedBy,
@@ -2284,12 +2550,12 @@ function registerUpdateIdea(server) {
2284
2550
  server.registerTool("update_idea", {
2285
2551
  description: "Update an existing idea. Can update title, description, status, value, or effort.",
2286
2552
  inputSchema: {
2287
- id: z15.string().describe("The UUID of the idea to update"),
2288
- title: z15.string().optional().describe("New title"),
2289
- description: z15.string().nullable().optional().describe("New description"),
2553
+ id: z16.string().describe("The UUID of the idea to update"),
2554
+ title: z16.string().optional().describe("New title"),
2555
+ description: z16.string().nullable().optional().describe("New description"),
2290
2556
  status: ideaStatusSchema.optional().describe("New status"),
2291
- value: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
2292
- effort: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
2557
+ value: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
2558
+ effort: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
2293
2559
  }
2294
2560
  }, async ({
2295
2561
  id,
@@ -2336,7 +2602,7 @@ function registerDeleteIdea(server) {
2336
2602
  server.registerTool("delete_idea", {
2337
2603
  description: "Delete an idea. This is a soft delete.",
2338
2604
  inputSchema: {
2339
- id: z15.string().describe("The UUID of the idea to delete")
2605
+ id: z16.string().describe("The UUID of the idea to delete")
2340
2606
  }
2341
2607
  }, async ({ id }) => {
2342
2608
  const client2 = getApiClient();
@@ -2365,7 +2631,10 @@ function registerGetStrategy(server) {
2365
2631
  content: [
2366
2632
  {
2367
2633
  type: "text",
2368
- text: JSON.stringify(strategy, null, 2)
2634
+ text: JSON.stringify({
2635
+ vision: contentToMarkdown(strategy.vision),
2636
+ mission: contentToMarkdown(strategy.mission)
2637
+ }, null, 2)
2369
2638
  }
2370
2639
  ]
2371
2640
  };
@@ -2375,8 +2644,8 @@ function registerUpdateStrategy(server) {
2375
2644
  server.registerTool("update_strategy", {
2376
2645
  description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
2377
2646
  inputSchema: {
2378
- vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
2379
- mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
2647
+ vision: z16.string().nullable().optional().describe("The vision statement - where the product is headed"),
2648
+ mission: z16.string().nullable().optional().describe("The mission statement - why the product exists")
2380
2649
  }
2381
2650
  }, async ({ vision, mission }) => {
2382
2651
  const client2 = getApiClient();
@@ -2424,8 +2693,8 @@ function registerCreateScenario(server) {
2424
2693
  server.registerTool("create_scenario", {
2425
2694
  description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
2426
2695
  inputSchema: {
2427
- title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
2428
- description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
2696
+ title: z16.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
2697
+ description: z16.string().nullable().optional().describe("Detailed description of the scenario workflow")
2429
2698
  }
2430
2699
  }, async ({ title, description }) => {
2431
2700
  const client2 = getApiClient();
@@ -2454,9 +2723,9 @@ function registerUpdateScenario(server) {
2454
2723
  server.registerTool("update_scenario", {
2455
2724
  description: "Update an existing scenario.",
2456
2725
  inputSchema: {
2457
- id: z15.string().describe("The UUID of the scenario to update"),
2458
- title: z15.string().optional().describe("New title"),
2459
- description: z15.string().nullable().optional().describe("New description")
2726
+ id: z16.string().describe("The UUID of the scenario to update"),
2727
+ title: z16.string().optional().describe("New title"),
2728
+ description: z16.string().nullable().optional().describe("New description")
2460
2729
  }
2461
2730
  }, async ({
2462
2731
  id,
@@ -2491,7 +2760,7 @@ function registerDeleteScenario(server) {
2491
2760
  server.registerTool("delete_scenario", {
2492
2761
  description: "Delete a scenario. This is a soft delete.",
2493
2762
  inputSchema: {
2494
- id: z15.string().describe("The UUID of the scenario to delete")
2763
+ id: z16.string().describe("The UUID of the scenario to delete")
2495
2764
  }
2496
2765
  }, async ({ id }) => {
2497
2766
  const client2 = getApiClient();
@@ -2506,7 +2775,7 @@ function registerDeleteScenario(server) {
2506
2775
  };
2507
2776
  });
2508
2777
  }
2509
- var productTypeSchema2 = z15.enum([
2778
+ var productTypeSchema2 = z16.enum([
2510
2779
  "brand",
2511
2780
  "product",
2512
2781
  "app",
@@ -2519,8 +2788,8 @@ function registerCreateProduct(server) {
2519
2788
  description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
2520
2789
  inputSchema: {
2521
2790
  type: productTypeSchema2.describe("Type of product"),
2522
- name: z15.string().describe("Name of the product"),
2523
- parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
2791
+ name: z16.string().describe("Name of the product"),
2792
+ parentId: z16.string().nullable().optional().describe("UUID of parent product to nest under")
2524
2793
  }
2525
2794
  }, async ({
2526
2795
  type,
@@ -2555,9 +2824,9 @@ function registerUpdateProduct(server) {
2555
2824
  server.registerTool("update_product", {
2556
2825
  description: "Update an existing product.",
2557
2826
  inputSchema: {
2558
- id: z15.string().describe("The UUID of the product to update"),
2559
- name: z15.string().optional().describe("New name"),
2560
- parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
2827
+ id: z16.string().describe("The UUID of the product to update"),
2828
+ name: z16.string().optional().describe("New name"),
2829
+ parentId: z16.string().nullable().optional().describe("New parent product UUID, or null to move to root")
2561
2830
  }
2562
2831
  }, async ({ id, name, parentId }) => {
2563
2832
  const client2 = getApiClient();
@@ -2589,7 +2858,7 @@ function registerDeleteProduct(server) {
2589
2858
  server.registerTool("delete_product", {
2590
2859
  description: "Delete a product. This is a soft delete that also deletes all child products.",
2591
2860
  inputSchema: {
2592
- id: z15.string().describe("The UUID of the product to delete")
2861
+ id: z16.string().describe("The UUID of the product to delete")
2593
2862
  }
2594
2863
  }, async ({ id }) => {
2595
2864
  const client2 = getApiClient();
@@ -2612,7 +2881,7 @@ function registerGetProduct(server) {
2612
2881
  server.registerTool("get_product", {
2613
2882
  description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
2614
2883
  inputSchema: {
2615
- id: z15.string().describe("The UUID of the product")
2884
+ id: z16.string().describe("The UUID of the product")
2616
2885
  }
2617
2886
  }, async ({ id }) => {
2618
2887
  const client2 = getApiClient();
@@ -2635,8 +2904,8 @@ function registerGetProduct(server) {
2635
2904
  createdAt: product2.createdAt
2636
2905
  },
2637
2906
  documentation: documentation ? {
2638
- designSystem: documentation.designSystem,
2639
- adrs: documentation.adrs,
2907
+ designSystem: contentToMarkdown(documentation.designSystem),
2908
+ adrs: contentToMarkdown(documentation.adrs),
2640
2909
  updatedAt: documentation.updatedAt
2641
2910
  } : null
2642
2911
  }, null, 2)
@@ -2649,7 +2918,7 @@ function registerSearchProducts(server) {
2649
2918
  server.registerTool("search_products", {
2650
2919
  description: "Search for products by name. Returns a list of matching products with basic info.",
2651
2920
  inputSchema: {
2652
- query: z15.string().optional().describe("Search query to match against product name"),
2921
+ query: z16.string().optional().describe("Search query to match against product name"),
2653
2922
  type: productTypeSchema2.optional().describe("Filter by product type")
2654
2923
  }
2655
2924
  }, async ({ query, type }) => {
@@ -2684,7 +2953,7 @@ function registerGetProductDocumentation(server) {
2684
2953
  server.registerTool("get_product_documentation", {
2685
2954
  description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
2686
2955
  inputSchema: {
2687
- productId: z15.string().describe("The UUID of the product")
2956
+ productId: z16.string().describe("The UUID of the product")
2688
2957
  }
2689
2958
  }, async ({ productId }) => {
2690
2959
  const client2 = getApiClient();
@@ -2697,8 +2966,8 @@ function registerGetProductDocumentation(server) {
2697
2966
  productId,
2698
2967
  documentation: documentation ? {
2699
2968
  id: documentation.id,
2700
- designSystem: documentation.designSystem,
2701
- adrs: documentation.adrs,
2969
+ designSystem: contentToMarkdown(documentation.designSystem),
2970
+ adrs: contentToMarkdown(documentation.adrs),
2702
2971
  createdAt: documentation.createdAt,
2703
2972
  updatedAt: documentation.updatedAt
2704
2973
  } : null
@@ -2712,9 +2981,9 @@ function registerUpdateProductDocumentation(server) {
2712
2981
  server.registerTool("update_product_documentation", {
2713
2982
  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.",
2714
2983
  inputSchema: {
2715
- productId: z15.string().describe("The UUID of the product"),
2716
- designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2717
- adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
2984
+ productId: z16.string().describe("The UUID of the product"),
2985
+ designSystem: z16.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2986
+ adrs: z16.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
2718
2987
  }
2719
2988
  }, async ({
2720
2989
  productId,
@@ -2751,8 +3020,8 @@ function registerCreateAudience(server) {
2751
3020
  server.registerTool("create_audience", {
2752
3021
  description: "Create a new audience member. Audiences represent who the product serves.",
2753
3022
  inputSchema: {
2754
- name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
2755
- description: z15.string().nullable().optional().describe("Description of the audience")
3023
+ name: z16.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
3024
+ description: z16.string().nullable().optional().describe("Description of the audience")
2756
3025
  }
2757
3026
  }, async ({ name, description }) => {
2758
3027
  const client2 = getApiClient();
@@ -2781,9 +3050,9 @@ function registerUpdateAudience(server) {
2781
3050
  server.registerTool("update_audience", {
2782
3051
  description: "Update an existing audience member.",
2783
3052
  inputSchema: {
2784
- id: z15.string().describe("The UUID of the audience to update"),
2785
- name: z15.string().optional().describe("New name"),
2786
- description: z15.string().nullable().optional().describe("New description")
3053
+ id: z16.string().describe("The UUID of the audience to update"),
3054
+ name: z16.string().optional().describe("New name"),
3055
+ description: z16.string().nullable().optional().describe("New description")
2787
3056
  }
2788
3057
  }, async ({
2789
3058
  id,
@@ -2818,7 +3087,7 @@ function registerDeleteAudience(server) {
2818
3087
  server.registerTool("delete_audience", {
2819
3088
  description: "Delete an audience member. This is a soft delete.",
2820
3089
  inputSchema: {
2821
- id: z15.string().describe("The UUID of the audience to delete")
3090
+ id: z16.string().describe("The UUID of the audience to delete")
2822
3091
  }
2823
3092
  }, async ({ id }) => {
2824
3093
  const client2 = getApiClient();
@@ -2860,9 +3129,9 @@ function registerGetHistory(server) {
2860
3129
  server.registerTool("get_history", {
2861
3130
  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.",
2862
3131
  inputSchema: {
2863
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2864
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
2865
- entityType: z15.enum([
3132
+ startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3133
+ endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
3134
+ entityType: z16.enum([
2866
3135
  "roadmap",
2867
3136
  "feature",
2868
3137
  "idea",
@@ -2894,8 +3163,8 @@ function registerGetHistorySummary(server) {
2894
3163
  server.registerTool("get_history_summary", {
2895
3164
  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.",
2896
3165
  inputSchema: {
2897
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2898
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
3166
+ startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3167
+ endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
2899
3168
  }
2900
3169
  }, async ({ startDate, endDate }) => {
2901
3170
  const client2 = getApiClient();
@@ -2914,13 +3183,13 @@ function registerCreateStatusUpdate(server) {
2914
3183
  server.registerTool("create_status_update", {
2915
3184
  description: "Create a new status report. Use this after generating the report content from history events.",
2916
3185
  inputSchema: {
2917
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
2918
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
2919
- content: z15.string().describe("The markdown content of the status report"),
2920
- title: z15.string().optional().describe("Optional title for the report"),
2921
- items: z15.array(z15.object({
2922
- roadmapItemId: z15.string().describe("UUID of the roadmap item"),
2923
- status: z15.string().describe("Status of the item at report creation time")
3186
+ startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
3187
+ endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
3188
+ content: z16.string().describe("The markdown content of the status report"),
3189
+ title: z16.string().optional().describe("Optional title for the report"),
3190
+ items: z16.array(z16.object({
3191
+ roadmapItemId: z16.string().describe("UUID of the roadmap item"),
3192
+ status: z16.string().describe("Status of the item at report creation time")
2924
3193
  })).optional().describe("Roadmap items to include in the report snapshot")
2925
3194
  }
2926
3195
  }, async ({
@@ -2961,18 +3230,18 @@ function registerSaveStories(server) {
2961
3230
  server.registerTool("save_stories", {
2962
3231
  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.",
2963
3232
  inputSchema: {
2964
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
2965
- epics: z15.array(z15.object({
2966
- title: z15.string().min(1).describe("Title of the epic"),
2967
- description: z15.string().nullable().optional().describe("Description of the epic"),
2968
- stories: z15.array(z15.object({
2969
- title: z15.string().min(1).describe("Title of the story"),
2970
- description: z15.string().nullable().optional().describe("Description of the story")
3233
+ roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
3234
+ epics: z16.array(z16.object({
3235
+ title: z16.string().min(1).describe("Title of the epic"),
3236
+ description: z16.string().nullable().optional().describe("Description of the epic"),
3237
+ stories: z16.array(z16.object({
3238
+ title: z16.string().min(1).describe("Title of the story"),
3239
+ description: z16.string().nullable().optional().describe("Description of the story")
2971
3240
  })).optional().describe("Stories within this epic")
2972
3241
  })).optional().describe("List of epics with their nested stories"),
2973
- stories: z15.array(z15.object({
2974
- title: z15.string().min(1).describe("Title of the story"),
2975
- description: z15.string().nullable().optional().describe("Description of the story")
3242
+ stories: z16.array(z16.object({
3243
+ title: z16.string().min(1).describe("Title of the story"),
3244
+ description: z16.string().nullable().optional().describe("Description of the story")
2976
3245
  })).optional().describe("List of standalone stories (not part of any epic)")
2977
3246
  }
2978
3247
  }, async ({
@@ -3004,10 +3273,10 @@ function registerUploadWireframe(server) {
3004
3273
  server.registerTool("upload_wireframe", {
3005
3274
  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.",
3006
3275
  inputSchema: {
3007
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3008
- filePath: z15.string().describe("Absolute path to the image file on disk"),
3009
- description: z15.string().optional().describe("Optional description of the wireframe"),
3010
- outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
3276
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
3277
+ filePath: z16.string().describe("Absolute path to the image file on disk"),
3278
+ description: z16.string().optional().describe("Optional description of the wireframe"),
3279
+ outcomeIds: z16.array(z16.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
3011
3280
  }
3012
3281
  }, async ({
3013
3282
  roadmapId,
@@ -3061,9 +3330,9 @@ function registerUpdateWireframe(server) {
3061
3330
  server.registerTool("update_wireframe", {
3062
3331
  description: "Update a wireframe's description or outcome tags.",
3063
3332
  inputSchema: {
3064
- id: z15.string().describe("The UUID of the wireframe"),
3065
- description: z15.string().nullable().optional().describe("New description for the wireframe"),
3066
- outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
3333
+ id: z16.string().describe("The UUID of the wireframe"),
3334
+ description: z16.string().nullable().optional().describe("New description for the wireframe"),
3335
+ outcomeIds: z16.array(z16.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
3067
3336
  }
3068
3337
  }, async ({
3069
3338
  id,
@@ -3099,7 +3368,7 @@ function registerDeleteWireframe(server) {
3099
3368
  server.registerTool("delete_wireframe", {
3100
3369
  description: "Delete a wireframe (soft delete).",
3101
3370
  inputSchema: {
3102
- id: z15.string().describe("The UUID of the wireframe to delete")
3371
+ id: z16.string().describe("The UUID of the wireframe to delete")
3103
3372
  }
3104
3373
  }, async ({ id }) => {
3105
3374
  const client2 = getApiClient();
@@ -3118,9 +3387,9 @@ function registerUploadBrainstormMedia(server) {
3118
3387
  server.registerTool("upload_brainstorm_media", {
3119
3388
  description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
3120
3389
  inputSchema: {
3121
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3122
- filePath: z15.string().describe("Absolute path to the image or video file on disk"),
3123
- description: z15.string().optional().describe("Optional description of the media")
3390
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
3391
+ filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3392
+ description: z16.string().optional().describe("Optional description of the media")
3124
3393
  }
3125
3394
  }, async ({
3126
3395
  roadmapId,
@@ -3172,8 +3441,8 @@ function registerUpdateBrainstormMedia(server) {
3172
3441
  server.registerTool("update_brainstorm_media", {
3173
3442
  description: "Update a brainstorm media item's description.",
3174
3443
  inputSchema: {
3175
- id: z15.string().describe("The UUID of the brainstorm media"),
3176
- description: z15.string().nullable().describe("New description for the media")
3444
+ id: z16.string().describe("The UUID of the brainstorm media"),
3445
+ description: z16.string().nullable().describe("New description for the media")
3177
3446
  }
3178
3447
  }, async ({ id, description }) => {
3179
3448
  const client2 = getApiClient();
@@ -3197,7 +3466,7 @@ function registerDeleteBrainstormMedia(server) {
3197
3466
  server.registerTool("delete_brainstorm_media", {
3198
3467
  description: "Delete a brainstorm media item (soft delete).",
3199
3468
  inputSchema: {
3200
- id: z15.string().describe("The UUID of the brainstorm media to delete")
3469
+ id: z16.string().describe("The UUID of the brainstorm media to delete")
3201
3470
  }
3202
3471
  }, async ({ id }) => {
3203
3472
  const client2 = getApiClient();
@@ -3216,9 +3485,9 @@ function registerUploadProductDesignMedia(server) {
3216
3485
  server.registerTool("upload_product_design_media", {
3217
3486
  description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
3218
3487
  inputSchema: {
3219
- productId: z15.string().describe("The UUID of the product"),
3220
- filePath: z15.string().describe("Absolute path to the image or video file on disk"),
3221
- description: z15.string().optional().describe("Optional description of the media")
3488
+ productId: z16.string().describe("The UUID of the product"),
3489
+ filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3490
+ description: z16.string().optional().describe("Optional description of the media")
3222
3491
  }
3223
3492
  }, async ({
3224
3493
  productId,
@@ -3271,9 +3540,9 @@ function registerUpdateProductDesignMedia(server) {
3271
3540
  server.registerTool("update_product_design_media", {
3272
3541
  description: "Update a product design media item's description.",
3273
3542
  inputSchema: {
3274
- productId: z15.string().describe("The UUID of the product"),
3275
- mediaId: z15.string().describe("The UUID of the design media"),
3276
- description: z15.string().nullable().describe("New description for the media")
3543
+ productId: z16.string().describe("The UUID of the product"),
3544
+ mediaId: z16.string().describe("The UUID of the design media"),
3545
+ description: z16.string().nullable().describe("New description for the media")
3277
3546
  }
3278
3547
  }, async ({
3279
3548
  productId,
@@ -3301,8 +3570,8 @@ function registerDeleteProductDesignMedia(server) {
3301
3570
  server.registerTool("delete_product_design_media", {
3302
3571
  description: "Delete a product design media item (soft delete).",
3303
3572
  inputSchema: {
3304
- productId: z15.string().describe("The UUID of the product"),
3305
- mediaId: z15.string().describe("The UUID of the design media to delete")
3573
+ productId: z16.string().describe("The UUID of the product"),
3574
+ mediaId: z16.string().describe("The UUID of the design media to delete")
3306
3575
  }
3307
3576
  }, async ({ productId, mediaId }) => {
3308
3577
  const client2 = getApiClient();
@@ -3324,8 +3593,8 @@ function registerUploadDesignWalkthrough(server) {
3324
3593
  server.registerTool("upload_design_walkthrough", {
3325
3594
  description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
3326
3595
  inputSchema: {
3327
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3328
- filePath: z15.string().describe("Absolute path to the video file on disk")
3596
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
3597
+ filePath: z16.string().describe("Absolute path to the video file on disk")
3329
3598
  }
3330
3599
  }, async ({ roadmapId, filePath }) => {
3331
3600
  const client2 = getApiClient();
@@ -3367,8 +3636,8 @@ function registerUploadReleaseWalkthrough(server) {
3367
3636
  server.registerTool("upload_release_walkthrough", {
3368
3637
  description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
3369
3638
  inputSchema: {
3370
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3371
- filePath: z15.string().describe("Absolute path to the video file on disk")
3639
+ roadmapId: z16.string().describe("The UUID of the roadmap item"),
3640
+ filePath: z16.string().describe("Absolute path to the video file on disk")
3372
3641
  }
3373
3642
  }, async ({ roadmapId, filePath }) => {
3374
3643
  const client2 = getApiClient();
@@ -3426,9 +3695,9 @@ function registerPublishPrototype(server) {
3426
3695
  server.registerTool("publish_prototype", {
3427
3696
  description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
3428
3697
  inputSchema: {
3429
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
3430
- folderPath: z15.string().describe("Absolute path to the local mockup folder"),
3431
- entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
3698
+ roadmapId: z16.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
3699
+ folderPath: z16.string().describe("Absolute path to the local mockup folder"),
3700
+ entryPoint: z16.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
3432
3701
  }
3433
3702
  }, async ({
3434
3703
  roadmapId,
@@ -3574,6 +3843,8 @@ function registerPublishPrototype(server) {
3574
3843
  type: "text",
3575
3844
  text: `Published ${uploaded} files!
3576
3845
 
3846
+ Prototype ID: ${prototype.id}
3847
+
3577
3848
  Share this link:
3578
3849
  ${prototype.publicUrl}
3579
3850
 
@@ -3583,15 +3854,63 @@ Expires: ${expiryDate}`
3583
3854
  };
3584
3855
  });
3585
3856
  }
3586
- var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
3857
+ function registerListPrototypes(server) {
3858
+ server.registerTool("list_prototypes", {
3859
+ description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
3860
+ inputSchema: {
3861
+ roadmapId: z16.string().uuid().describe("The UUID of the roadmap item")
3862
+ }
3863
+ }, async ({ roadmapId }) => {
3864
+ const client2 = getApiClient();
3865
+ const prototypes = await client2.listPrototypes(roadmapId);
3866
+ if (prototypes.length === 0) {
3867
+ return {
3868
+ content: [
3869
+ {
3870
+ type: "text",
3871
+ text: "No prototypes found for this roadmap item."
3872
+ }
3873
+ ]
3874
+ };
3875
+ }
3876
+ const lines = prototypes.map((p) => {
3877
+ const expiryDate = new Date(p.expiresAt).toLocaleDateString("en-US", {
3878
+ month: "long",
3879
+ day: "numeric",
3880
+ year: "numeric"
3881
+ });
3882
+ const createdDate = new Date(p.createdAt).toLocaleDateString("en-US", {
3883
+ month: "long",
3884
+ day: "numeric",
3885
+ year: "numeric"
3886
+ });
3887
+ return `ID: ${p.id}
3888
+ URL: ${p.publicUrl}
3889
+ Files: ${p.fileCount} | Created: ${createdDate} | Expires: ${expiryDate}`;
3890
+ });
3891
+ return {
3892
+ content: [
3893
+ {
3894
+ type: "text",
3895
+ text: `Found ${prototypes.length} prototype(s):
3896
+
3897
+ ${lines.join(`
3898
+
3899
+ `)}`
3900
+ }
3901
+ ]
3902
+ };
3903
+ });
3904
+ }
3905
+ var dateGranularitySchema2 = z16.enum(["day", "month", "quarter", "half-year", "year"]);
3587
3906
  function registerSearchInitiatives(server) {
3588
3907
  server.registerTool("search_initiatives", {
3589
3908
  description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
3590
3909
  inputSchema: {
3591
- query: z15.string().optional().describe("Search query to match against title or description"),
3910
+ query: z16.string().optional().describe("Search query to match against title or description"),
3592
3911
  horizon: horizonSchema.optional().describe("Filter by planning horizon"),
3593
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3594
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3912
+ limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3913
+ offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3595
3914
  }
3596
3915
  }, async ({
3597
3916
  query,
@@ -3618,7 +3937,7 @@ function registerSearchInitiatives(server) {
3618
3937
  items: paginatedInitiatives.map((i) => ({
3619
3938
  id: i.id,
3620
3939
  title: i.title,
3621
- description: i.description,
3940
+ description: contentToMarkdown(i.description),
3622
3941
  horizon: i.horizon,
3623
3942
  targetDate: i.targetDate,
3624
3943
  itemCount: i.itemCount,
@@ -3641,7 +3960,7 @@ function registerGetInitiative(server) {
3641
3960
  server.registerTool("get_initiative", {
3642
3961
  description: "Get full details of an initiative including all linked roadmap items.",
3643
3962
  inputSchema: {
3644
- id: z15.string().describe("The UUID of the initiative")
3963
+ id: z16.string().describe("The UUID of the initiative")
3645
3964
  }
3646
3965
  }, async ({ id }) => {
3647
3966
  const client2 = getApiClient();
@@ -3650,7 +3969,13 @@ function registerGetInitiative(server) {
3650
3969
  content: [
3651
3970
  {
3652
3971
  type: "text",
3653
- text: JSON.stringify(result, null, 2)
3972
+ text: JSON.stringify({
3973
+ ...result,
3974
+ initiative: {
3975
+ ...result.initiative,
3976
+ description: contentToMarkdown(result.initiative.description)
3977
+ }
3978
+ }, null, 2)
3654
3979
  }
3655
3980
  ]
3656
3981
  };
@@ -3660,12 +3985,12 @@ function registerCreateInitiative(server) {
3660
3985
  server.registerTool("create_initiative", {
3661
3986
  description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
3662
3987
  inputSchema: {
3663
- title: z15.string().describe("Title of the initiative"),
3664
- description: z15.string().optional().describe("Description of the initiative (markdown)"),
3988
+ title: z16.string().describe("Title of the initiative"),
3989
+ description: z16.string().optional().describe("Description of the initiative (markdown)"),
3665
3990
  horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
3666
3991
  dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
3667
- dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3668
- targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
3992
+ dateValue: z16.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3993
+ targetDate: z16.string().optional().describe("Target date in YYYY-MM-DD format")
3669
3994
  }
3670
3995
  }, async ({
3671
3996
  title,
@@ -3709,14 +4034,14 @@ function registerUpdateInitiative(server) {
3709
4034
  server.registerTool("update_initiative", {
3710
4035
  description: "Update an existing initiative.",
3711
4036
  inputSchema: {
3712
- id: z15.string().describe("The UUID of the initiative to update"),
3713
- title: z15.string().optional().describe("New title"),
3714
- description: z15.string().nullable().optional().describe("New description (null to clear)"),
4037
+ id: z16.string().describe("The UUID of the initiative to update"),
4038
+ title: z16.string().optional().describe("New title"),
4039
+ description: z16.string().nullable().optional().describe("New description (null to clear)"),
3715
4040
  horizon: horizonSchema.optional().describe("New planning horizon"),
3716
4041
  dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
3717
- dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
3718
- targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
3719
- order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
4042
+ dateValue: z16.string().nullable().optional().describe("New target date value (null to clear)"),
4043
+ targetDate: z16.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
4044
+ order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
3720
4045
  }
3721
4046
  }, async ({
3722
4047
  id,
@@ -3771,7 +4096,7 @@ function registerDeleteInitiative(server) {
3771
4096
  server.registerTool("delete_initiative", {
3772
4097
  description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
3773
4098
  inputSchema: {
3774
- id: z15.string().describe("The UUID of the initiative to delete")
4099
+ id: z16.string().describe("The UUID of the initiative to delete")
3775
4100
  }
3776
4101
  }, async ({ id }) => {
3777
4102
  const client2 = getApiClient();
@@ -3790,9 +4115,9 @@ function registerReorderInitiatives(server) {
3790
4115
  server.registerTool("reorder_initiatives", {
3791
4116
  description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
3792
4117
  inputSchema: {
3793
- items: z15.array(z15.object({
3794
- id: z15.string().describe("The UUID of the initiative"),
3795
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4118
+ items: z16.array(z16.object({
4119
+ id: z16.string().describe("The UUID of the initiative"),
4120
+ order: z16.number().int().min(0).describe("The new order value (0-based)")
3796
4121
  })).describe("Array of initiatives with their new order values")
3797
4122
  }
3798
4123
  }, async ({ items }) => {
@@ -3812,12 +4137,12 @@ function registerSearchExports(server) {
3812
4137
  server.registerTool("search_exports", {
3813
4138
  description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
3814
4139
  inputSchema: {
3815
- roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
3816
- externalSystem: z15.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
3817
- localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
3818
- localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
3819
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3820
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
4140
+ roadmapId: z16.string().uuid().optional().describe("Filter by roadmap item ID"),
4141
+ externalSystem: z16.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
4142
+ localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
4143
+ localEntityId: z16.string().uuid().optional().describe("Filter by local entity ID"),
4144
+ limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
4145
+ offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3821
4146
  }
3822
4147
  }, async ({
3823
4148
  roadmapId,
@@ -3854,7 +4179,7 @@ function registerGetExport(server) {
3854
4179
  server.registerTool("get_export", {
3855
4180
  description: "Get full details of a single export record by ID.",
3856
4181
  inputSchema: {
3857
- id: z15.string().uuid().describe("The UUID of the export record")
4182
+ id: z16.string().uuid().describe("The UUID of the export record")
3858
4183
  }
3859
4184
  }, async ({ id }) => {
3860
4185
  const client2 = getApiClient();
@@ -3873,14 +4198,14 @@ function registerCreateExport(server) {
3873
4198
  server.registerTool("create_export", {
3874
4199
  description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
3875
4200
  inputSchema: {
3876
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
3877
- localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
3878
- localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
3879
- externalSystem: z15.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
3880
- externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
3881
- externalId: z15.string().min(1).describe("ID of the object in the external system"),
3882
- externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
3883
- metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
4201
+ roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
4202
+ localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
4203
+ localEntityId: z16.string().uuid().describe("The UUID of the local entity"),
4204
+ externalSystem: z16.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
4205
+ externalObjectType: z16.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
4206
+ externalId: z16.string().min(1).describe("ID of the object in the external system"),
4207
+ externalUrl: z16.string().url().optional().describe("URL to the object in the external system"),
4208
+ metadata: z16.record(z16.unknown()).optional().describe("Additional metadata about the export")
3884
4209
  }
3885
4210
  }, async ({
3886
4211
  roadmapId,
@@ -3917,9 +4242,9 @@ function registerUpdateExport(server) {
3917
4242
  server.registerTool("update_export", {
3918
4243
  description: "Update an export record. Can update the external URL or metadata.",
3919
4244
  inputSchema: {
3920
- id: z15.string().uuid().describe("The UUID of the export record to update"),
3921
- externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
3922
- metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
4245
+ id: z16.string().uuid().describe("The UUID of the export record to update"),
4246
+ externalUrl: z16.string().url().nullable().optional().describe("New URL to the object in the external system"),
4247
+ metadata: z16.record(z16.unknown()).optional().describe("New metadata to replace existing metadata")
3923
4248
  }
3924
4249
  }, async ({
3925
4250
  id,
@@ -3942,7 +4267,7 @@ function registerDeleteExport(server) {
3942
4267
  server.registerTool("delete_export", {
3943
4268
  description: "Delete an export record. This is a soft delete.",
3944
4269
  inputSchema: {
3945
- id: z15.string().uuid().describe("The UUID of the export record to delete")
4270
+ id: z16.string().uuid().describe("The UUID of the export record to delete")
3946
4271
  }
3947
4272
  }, async ({ id }) => {
3948
4273
  const client2 = getApiClient();
@@ -3978,7 +4303,7 @@ function registerGetPresentation(server) {
3978
4303
  server.registerTool("get_presentation", {
3979
4304
  description: "Get presentation with variants and slides.",
3980
4305
  inputSchema: {
3981
- id: z15.string().describe("The UUID of the presentation")
4306
+ id: z16.string().describe("The UUID of the presentation")
3982
4307
  }
3983
4308
  }, async ({ id }) => {
3984
4309
  const client2 = getApiClient();
@@ -4008,8 +4333,8 @@ function registerCreatePresentation(server) {
4008
4333
  server.registerTool("create_presentation", {
4009
4334
  description: "Create a new presentation.",
4010
4335
  inputSchema: {
4011
- title: z15.string().describe("Title of the presentation"),
4012
- description: z15.string().nullable().optional().describe("Description of the presentation")
4336
+ title: z16.string().describe("Title of the presentation"),
4337
+ description: z16.string().nullable().optional().describe("Description of the presentation")
4013
4338
  }
4014
4339
  }, async ({ title, description }) => {
4015
4340
  const client2 = getApiClient();
@@ -4031,9 +4356,9 @@ function registerUpdatePresentation(server) {
4031
4356
  server.registerTool("update_presentation", {
4032
4357
  description: "Update an existing presentation.",
4033
4358
  inputSchema: {
4034
- id: z15.string().describe("The UUID of the presentation to update"),
4035
- title: z15.string().optional().describe("New title"),
4036
- description: z15.string().nullable().optional().describe("New description")
4359
+ id: z16.string().describe("The UUID of the presentation to update"),
4360
+ title: z16.string().optional().describe("New title"),
4361
+ description: z16.string().nullable().optional().describe("New description")
4037
4362
  }
4038
4363
  }, async ({
4039
4364
  id,
@@ -4061,7 +4386,7 @@ function registerDeletePresentation(server) {
4061
4386
  server.registerTool("delete_presentation", {
4062
4387
  description: "Delete a presentation.",
4063
4388
  inputSchema: {
4064
- id: z15.string().describe("The UUID of the presentation to delete")
4389
+ id: z16.string().describe("The UUID of the presentation to delete")
4065
4390
  }
4066
4391
  }, async ({ id }) => {
4067
4392
  const client2 = getApiClient();
@@ -4080,9 +4405,9 @@ function registerReorderPresentations(server) {
4080
4405
  server.registerTool("reorder_presentations", {
4081
4406
  description: "Reorder presentations by setting their order values. Lower order values appear first.",
4082
4407
  inputSchema: {
4083
- items: z15.array(z15.object({
4084
- id: z15.string().describe("The UUID of the presentation"),
4085
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4408
+ items: z16.array(z16.object({
4409
+ id: z16.string().describe("The UUID of the presentation"),
4410
+ order: z16.number().int().min(0).describe("The new order value (0-based)")
4086
4411
  })).describe("Array of presentations with their new order values")
4087
4412
  }
4088
4413
  }, async ({ items }) => {
@@ -4102,7 +4427,7 @@ function registerListVariants(server) {
4102
4427
  server.registerTool("list_variants", {
4103
4428
  description: "List all variants for a presentation.",
4104
4429
  inputSchema: {
4105
- presentationId: z15.string().describe("The UUID of the presentation")
4430
+ presentationId: z16.string().describe("The UUID of the presentation")
4106
4431
  }
4107
4432
  }, async ({ presentationId }) => {
4108
4433
  const client2 = getApiClient();
@@ -4121,8 +4446,8 @@ function registerGetVariant(server) {
4121
4446
  server.registerTool("get_variant", {
4122
4447
  description: "Get variant with its slides.",
4123
4448
  inputSchema: {
4124
- presentationId: z15.string().describe("The UUID of the presentation"),
4125
- variantId: z15.string().describe("The UUID of the variant")
4449
+ presentationId: z16.string().describe("The UUID of the presentation"),
4450
+ variantId: z16.string().describe("The UUID of the variant")
4126
4451
  }
4127
4452
  }, async ({ presentationId, variantId }) => {
4128
4453
  const client2 = getApiClient();
@@ -4145,9 +4470,9 @@ function registerCreateVariant(server) {
4145
4470
  server.registerTool("create_variant", {
4146
4471
  description: "Create a new variant for a presentation.",
4147
4472
  inputSchema: {
4148
- presentationId: z15.string().describe("The UUID of the presentation"),
4149
- name: z15.string().describe("Name of the variant"),
4150
- audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
4473
+ presentationId: z16.string().describe("The UUID of the presentation"),
4474
+ name: z16.string().describe("Name of the variant"),
4475
+ audienceId: z16.string().nullable().optional().describe("The UUID of the target audience")
4151
4476
  }
4152
4477
  }, async ({
4153
4478
  presentationId,
@@ -4173,10 +4498,10 @@ function registerUpdateVariant(server) {
4173
4498
  server.registerTool("update_variant", {
4174
4499
  description: "Update an existing variant.",
4175
4500
  inputSchema: {
4176
- presentationId: z15.string().describe("The UUID of the presentation"),
4177
- variantId: z15.string().describe("The UUID of the variant to update"),
4178
- name: z15.string().optional().describe("New name"),
4179
- audienceId: z15.string().nullable().optional().describe("New target audience UUID")
4501
+ presentationId: z16.string().describe("The UUID of the presentation"),
4502
+ variantId: z16.string().describe("The UUID of the variant to update"),
4503
+ name: z16.string().optional().describe("New name"),
4504
+ audienceId: z16.string().nullable().optional().describe("New target audience UUID")
4180
4505
  }
4181
4506
  }, async ({
4182
4507
  presentationId,
@@ -4205,8 +4530,8 @@ function registerDeleteVariant(server) {
4205
4530
  server.registerTool("delete_variant", {
4206
4531
  description: "Delete a variant.",
4207
4532
  inputSchema: {
4208
- presentationId: z15.string().describe("The UUID of the presentation"),
4209
- variantId: z15.string().describe("The UUID of the variant to delete")
4533
+ presentationId: z16.string().describe("The UUID of the presentation"),
4534
+ variantId: z16.string().describe("The UUID of the variant to delete")
4210
4535
  }
4211
4536
  }, async ({ presentationId, variantId }) => {
4212
4537
  const client2 = getApiClient();
@@ -4225,10 +4550,10 @@ function registerReorderVariants(server) {
4225
4550
  server.registerTool("reorder_variants", {
4226
4551
  description: "Reorder variants by setting their order values. Lower order values appear first.",
4227
4552
  inputSchema: {
4228
- presentationId: z15.string().describe("The UUID of the presentation"),
4229
- items: z15.array(z15.object({
4230
- id: z15.string().describe("The UUID of the variant"),
4231
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4553
+ presentationId: z16.string().describe("The UUID of the presentation"),
4554
+ items: z16.array(z16.object({
4555
+ id: z16.string().describe("The UUID of the variant"),
4556
+ order: z16.number().int().min(0).describe("The new order value (0-based)")
4232
4557
  })).describe("Array of variants with their new order values")
4233
4558
  }
4234
4559
  }, async ({
@@ -4251,8 +4576,8 @@ function registerCloneVariant(server) {
4251
4576
  server.registerTool("clone_variant", {
4252
4577
  description: "Clone a variant with all its slides.",
4253
4578
  inputSchema: {
4254
- presentationId: z15.string().describe("The UUID of the presentation"),
4255
- variantId: z15.string().describe("The UUID of the variant to clone")
4579
+ presentationId: z16.string().describe("The UUID of the presentation"),
4580
+ variantId: z16.string().describe("The UUID of the variant to clone")
4256
4581
  }
4257
4582
  }, async ({ presentationId, variantId }) => {
4258
4583
  const client2 = getApiClient();
@@ -4271,8 +4596,8 @@ function registerSetDefaultVariant(server) {
4271
4596
  server.registerTool("set_default_variant", {
4272
4597
  description: "Set a variant as the default for the presentation.",
4273
4598
  inputSchema: {
4274
- presentationId: z15.string().describe("The UUID of the presentation"),
4275
- variantId: z15.string().describe("The UUID of the variant to set as default")
4599
+ presentationId: z16.string().describe("The UUID of the presentation"),
4600
+ variantId: z16.string().describe("The UUID of the variant to set as default")
4276
4601
  }
4277
4602
  }, async ({ presentationId, variantId }) => {
4278
4603
  const client2 = getApiClient();
@@ -4291,7 +4616,7 @@ function registerListSlides(server) {
4291
4616
  server.registerTool("list_slides", {
4292
4617
  description: "List all slides in a variant.",
4293
4618
  inputSchema: {
4294
- variantId: z15.string().describe("The UUID of the variant")
4619
+ variantId: z16.string().describe("The UUID of the variant")
4295
4620
  }
4296
4621
  }, async ({ variantId }) => {
4297
4622
  const client2 = getApiClient();
@@ -4321,8 +4646,8 @@ function registerGetSlide(server) {
4321
4646
  server.registerTool("get_slide", {
4322
4647
  description: "Get a slide by ID.",
4323
4648
  inputSchema: {
4324
- variantId: z15.string().describe("The UUID of the variant"),
4325
- slideId: z15.string().describe("The UUID of the slide")
4649
+ variantId: z16.string().describe("The UUID of the variant"),
4650
+ slideId: z16.string().describe("The UUID of the slide")
4326
4651
  }
4327
4652
  }, async ({ variantId, slideId }) => {
4328
4653
  const client2 = getApiClient();
@@ -4352,8 +4677,8 @@ function registerCreateSlide(server) {
4352
4677
  server.registerTool("create_slide", {
4353
4678
  description: "Create a new slide in a variant. Slide types: title (title + subtitle), section_header (title + subtitle), bullets (title + items array), two_column (title + left/right text), comparison (leftLabel + leftContent + rightLabel + rightContent), timeline (title + steps array of {title, description}), image (title + imageUrl + caption), quote (quote + attribution), code (title + code + language), thank_you (title + subtitle), mermaid (title + code with mermaid diagram syntax), paragraph (title + body with markdown text).",
4354
4679
  inputSchema: {
4355
- variantId: z15.string().describe("The UUID of the variant"),
4356
- slideType: z15.enum([
4680
+ variantId: z16.string().describe("The UUID of the variant"),
4681
+ slideType: z16.enum([
4357
4682
  "title",
4358
4683
  "section_header",
4359
4684
  "bullets",
@@ -4367,8 +4692,8 @@ function registerCreateSlide(server) {
4367
4692
  "mermaid",
4368
4693
  "paragraph"
4369
4694
  ]).default("bullets").describe("The type of slide to create"),
4370
- content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
4371
- speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
4695
+ content: z16.record(z16.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
4696
+ speakerNotes: z16.string().nullable().optional().describe("Speaker notes for the slide")
4372
4697
  }
4373
4698
  }, async ({
4374
4699
  variantId,
@@ -4407,11 +4732,11 @@ function registerUpdateSlide(server) {
4407
4732
  server.registerTool("update_slide", {
4408
4733
  description: "Update an existing slide.",
4409
4734
  inputSchema: {
4410
- variantId: z15.string().describe("The UUID of the variant"),
4411
- slideId: z15.string().describe("The UUID of the slide to update"),
4412
- title: z15.string().optional().describe("New title"),
4413
- content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
4414
- speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
4735
+ variantId: z16.string().describe("The UUID of the variant"),
4736
+ slideId: z16.string().describe("The UUID of the slide to update"),
4737
+ title: z16.string().optional().describe("New title"),
4738
+ content: z16.object({ body: z16.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
4739
+ speakerNotes: z16.string().nullable().optional().describe("New speaker notes")
4415
4740
  }
4416
4741
  }, async ({
4417
4742
  variantId,
@@ -4454,8 +4779,8 @@ function registerDeleteSlide(server) {
4454
4779
  server.registerTool("delete_slide", {
4455
4780
  description: "Delete a slide (soft delete).",
4456
4781
  inputSchema: {
4457
- variantId: z15.string().describe("The UUID of the variant"),
4458
- slideId: z15.string().describe("The UUID of the slide to delete")
4782
+ variantId: z16.string().describe("The UUID of the variant"),
4783
+ slideId: z16.string().describe("The UUID of the slide to delete")
4459
4784
  }
4460
4785
  }, async ({ variantId, slideId }) => {
4461
4786
  const client2 = getApiClient();
@@ -4485,10 +4810,10 @@ function registerReorderSlides(server) {
4485
4810
  server.registerTool("reorder_slides", {
4486
4811
  description: "Reorder slides by setting their order values. Lower order values appear first.",
4487
4812
  inputSchema: {
4488
- variantId: z15.string().describe("The UUID of the variant"),
4489
- items: z15.array(z15.object({
4490
- id: z15.string().describe("The UUID of the slide"),
4491
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4813
+ variantId: z16.string().describe("The UUID of the variant"),
4814
+ items: z16.array(z16.object({
4815
+ id: z16.string().describe("The UUID of the slide"),
4816
+ order: z16.number().int().min(0).describe("The new order value (0-based)")
4492
4817
  })).describe("Array of slides with their new order values")
4493
4818
  }
4494
4819
  }, async ({
@@ -4522,9 +4847,9 @@ function registerUploadSlideImage(server) {
4522
4847
  server.registerTool("upload_slide_image", {
4523
4848
  description: 'Upload an image to a slide. Gets a presigned URL and returns a curl command to execute for the upload, then updates the slide content with the image URL. The slide must be of type "image".',
4524
4849
  inputSchema: {
4525
- variantId: z15.string().describe("The UUID of the variant"),
4526
- slideId: z15.string().describe("The UUID of the slide to add the image to"),
4527
- filePath: z15.string().describe("Absolute path to the image file on disk")
4850
+ variantId: z16.string().describe("The UUID of the variant"),
4851
+ slideId: z16.string().describe("The UUID of the slide to add the image to"),
4852
+ filePath: z16.string().describe("Absolute path to the image file on disk")
4528
4853
  }
4529
4854
  }, async ({
4530
4855
  variantId,
@@ -4598,9 +4923,9 @@ function registerCreateFeedbackSession(server) {
4598
4923
  server.registerTool("create_feedback_session", {
4599
4924
  description: "Create a feedback session for a prototype and get a shareable review link. Reviewers who open the link can optionally enter their name before leaving pin-based feedback.",
4600
4925
  inputSchema: {
4601
- prototypeId: z15.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
4602
- name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
4603
- expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
4926
+ prototypeId: z16.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
4927
+ name: z16.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
4928
+ expiresInDays: z16.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
4604
4929
  }
4605
4930
  }, async ({
4606
4931
  prototypeId,
@@ -4649,7 +4974,7 @@ function registerListFeedbackSessions(server) {
4649
4974
  server.registerTool("list_feedback_sessions", {
4650
4975
  description: "List all feedback sessions for a prototype with comment counts and status.",
4651
4976
  inputSchema: {
4652
- prototypeId: z15.string().uuid().describe("The UUID of the prototype")
4977
+ prototypeId: z16.string().uuid().describe("The UUID of the prototype")
4653
4978
  }
4654
4979
  }, async ({ prototypeId }) => {
4655
4980
  const client2 = getApiClient();
@@ -4700,9 +5025,9 @@ function registerGetFeedbackSummary(server) {
4700
5025
  server.registerTool("get_feedback_summary", {
4701
5026
  description: "Get a human-readable summary of feedback for a session, grouped by page. Shows pin numbers, reviewer names, comment text, and which element was pinned. Use this for a quick overview of feedback.",
4702
5027
  inputSchema: {
4703
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4704
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4705
- filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
5028
+ prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5029
+ sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5030
+ filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
4706
5031
  }
4707
5032
  }, async ({
4708
5033
  prototypeId,
@@ -4743,10 +5068,10 @@ function registerGetFeedbackDetail(server) {
4743
5068
  server.registerTool("get_feedback_detail", {
4744
5069
  description: "Get full raw pin data for feedback comments, including CSS selectors, bounding boxes, parent/sibling DOM context, and coordinates. Use this when you need exact element information to make targeted code changes.",
4745
5070
  inputSchema: {
4746
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4747
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4748
- commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
4749
- filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
5071
+ prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5072
+ sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5073
+ commentId: z16.string().uuid().optional().describe("Optional: get detail for a single comment"),
5074
+ filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
4750
5075
  }
4751
5076
  }, async ({
4752
5077
  prototypeId,
@@ -4792,9 +5117,9 @@ function registerResolveFeedbackComment(server) {
4792
5117
  server.registerTool("resolve_feedback_comment", {
4793
5118
  description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
4794
5119
  inputSchema: {
4795
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4796
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4797
- commentId: z15.string().uuid().describe("The UUID of the comment to resolve/unresolve")
5120
+ prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5121
+ sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5122
+ commentId: z16.string().uuid().describe("The UUID of the comment to resolve/unresolve")
4798
5123
  }
4799
5124
  }, async ({
4800
5125
  prototypeId,