@ourroadmaps/mcp 0.28.1 → 0.30.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 +1271 -943
  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,151 +783,596 @@ 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({
656
889
  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(),
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({
897
+ id: z14.string().uuid(),
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()
904
+ });
905
+ var statusUpdateListSchema = z14.array(statusUpdateSchema);
906
+ // ../../packages/shared/src/schemas/tool-inputs.ts
907
+ import { z as z15 } from "zod";
908
+ var paginationFields = {
909
+ limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
910
+ offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
911
+ };
912
+ var idField = (entity) => z15.string().describe(`The UUID of the ${entity}`);
913
+ var uuidField = (entity) => z15.string().uuid().describe(`The UUID of the ${entity}`);
914
+ var orderItemsField = (entity) => z15.array(z15.object({
915
+ id: z15.string().describe(`The UUID of the ${entity}`),
916
+ order: z15.number().int().min(0).describe("The new order value (0-based)")
917
+ })).describe(`Array of ${entity}s with their new order values`);
918
+ var yyyyMmDdField = (description) => z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe(description);
919
+ var sizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
920
+ var searchRoadmapsInput = {
921
+ query: z15.string().optional().describe("Search query to match against title or description"),
922
+ status: roadmapStatusSchema.optional().describe("Filter by status"),
923
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
924
+ phase: z15.string().optional().describe("Filter by phase"),
925
+ phaseStep: z15.string().optional().describe("Filter by phase step"),
926
+ ...paginationFields
927
+ };
928
+ var getRoadmapInput = {
929
+ id: idField("roadmap item")
930
+ };
931
+ var createRoadmapItemInput = {
932
+ title: z15.string().describe("Title of the roadmap item"),
933
+ status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
934
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
935
+ phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
936
+ phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
937
+ initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
938
+ dateGranularity: dateGranularitySchema.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
939
+ dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
940
+ targetGranularity: dateGranularitySchema.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
941
+ targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
942
+ };
943
+ var updateRoadmapItemInput = {
944
+ id: idField("roadmap item to update"),
945
+ title: z15.string().optional().describe("New title"),
946
+ status: roadmapStatusSchema.optional().describe("New status"),
947
+ horizon: horizonSchema.optional().describe("New planning horizon"),
948
+ phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
949
+ phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
950
+ value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
951
+ effort: effortSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
952
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
953
+ initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
954
+ designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
955
+ planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
956
+ buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
957
+ releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
958
+ prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
959
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
960
+ dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
961
+ targetGranularity: dateGranularitySchema.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
962
+ targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
963
+ };
964
+ var deleteRoadmapItemInput = {
965
+ id: idField("roadmap item to delete")
966
+ };
967
+ var reorderRoadmapsInput = {
968
+ items: z15.array(z15.object({
969
+ id: z15.string().describe("The UUID of the roadmap item"),
970
+ order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
971
+ })).describe("Array of roadmap items with their new order values")
972
+ };
973
+ var savePrdInput = {
974
+ roadmapId: idField("roadmap item"),
975
+ what: z15.string().nullable().describe("What is being built - the feature description"),
976
+ why: z15.string().nullable().describe("Why this is being built - the business justification"),
977
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
978
+ };
979
+ var updateBrainstormNotesInput = {
980
+ roadmapId: idField("roadmap item"),
981
+ notes: z15.string().describe("The brainstorm notes content")
982
+ };
983
+ var searchFeaturesInput = {
984
+ query: z15.string().optional().describe("Search query to match against name"),
985
+ type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
986
+ };
987
+ var getFeatureInput = {
988
+ id: idField("feature")
989
+ };
990
+ var addFeatureInput = {
991
+ name: z15.string().describe("Name of the feature"),
992
+ description: z15.string().optional().describe("Description of the feature"),
993
+ type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
994
+ parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
995
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
996
+ linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
997
+ };
998
+ var updateFeatureInput = {
999
+ id: idField("feature to update"),
1000
+ name: z15.string().optional().describe("New name for the feature"),
1001
+ type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
1002
+ parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
1003
+ };
1004
+ var deleteFeatureInput = {
1005
+ id: idField("feature to delete")
1006
+ };
1007
+ var searchIdeasInput = {
1008
+ query: z15.string().optional().describe("Search query to match against title or description"),
1009
+ status: ideaStatusSchema.optional().describe("Filter by status")
1010
+ };
1011
+ var getIdeaInput = {
1012
+ id: idField("idea")
1013
+ };
1014
+ var captureIdeaInput = {
1015
+ title: z15.string().describe("Title of the idea"),
1016
+ description: z15.string().optional().describe("Detailed description of the idea"),
1017
+ source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
1018
+ };
1019
+ var updateIdeaInput = {
1020
+ id: idField("idea to update"),
1021
+ title: z15.string().optional().describe("New title"),
1022
+ description: z15.string().nullable().optional().describe("New description"),
1023
+ status: ideaStatusSchema.optional().describe("New status"),
1024
+ value: sizeSchema.nullable().optional().describe("Estimated value"),
1025
+ effort: sizeSchema.nullable().optional().describe("Estimated effort")
1026
+ };
1027
+ var deleteIdeaInput = {
1028
+ id: idField("idea to delete")
1029
+ };
1030
+ var updateStrategyInput = {
1031
+ vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
1032
+ mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
1033
+ };
1034
+ var createScenarioInput = {
1035
+ title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
1036
+ description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
1037
+ };
1038
+ var updateScenarioInput = {
1039
+ id: idField("scenario to update"),
1040
+ title: z15.string().optional().describe("New title"),
1041
+ description: z15.string().nullable().optional().describe("New description")
1042
+ };
1043
+ var deleteScenarioInput = {
1044
+ id: idField("scenario to delete")
1045
+ };
1046
+ var searchProductsInput = {
1047
+ query: z15.string().optional().describe("Search query to match against product name"),
1048
+ type: productTypeSchema.optional().describe("Filter by product type")
1049
+ };
1050
+ var getProductInput = {
1051
+ id: idField("product")
1052
+ };
1053
+ var createProductInput = {
1054
+ type: productTypeSchema.describe("Type of product"),
1055
+ name: z15.string().describe("Name of the product"),
1056
+ parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
1057
+ };
1058
+ var updateProductInput = {
1059
+ id: idField("product to update"),
1060
+ name: z15.string().optional().describe("New name"),
1061
+ parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
1062
+ };
1063
+ var deleteProductInput = {
1064
+ id: idField("product to delete")
1065
+ };
1066
+ var getProductDocumentationInput = {
1067
+ productId: idField("product")
1068
+ };
1069
+ var updateProductDocumentationInput = {
1070
+ productId: idField("product"),
1071
+ designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
1072
+ adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
1073
+ };
1074
+ var createAudienceInput = {
1075
+ name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
1076
+ description: z15.string().nullable().optional().describe("Description of the audience")
1077
+ };
1078
+ var updateAudienceInput = {
1079
+ id: idField("audience to update"),
1080
+ name: z15.string().optional().describe("New name"),
1081
+ description: z15.string().nullable().optional().describe("New description")
1082
+ };
1083
+ var deleteAudienceInput = {
1084
+ id: idField("audience to delete")
1085
+ };
1086
+ var getHistoryInput = {
1087
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1088
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format"),
1089
+ entityType: z15.enum([
1090
+ "roadmap",
1091
+ "feature",
1092
+ "idea",
1093
+ "prd",
1094
+ "wireframe",
1095
+ "product",
1096
+ "audience",
1097
+ "scenario"
1098
+ ]).optional().describe("Filter to specific entity type")
1099
+ };
1100
+ var getHistorySummaryInput = {
1101
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1102
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format")
1103
+ };
1104
+ var createStatusUpdateInput = {
1105
+ startDate: yyyyMmDdField("Report period start date in YYYY-MM-DD format"),
1106
+ endDate: yyyyMmDdField("Report period end date in YYYY-MM-DD format"),
1107
+ content: z15.string().describe("The markdown content of the status report"),
1108
+ title: z15.string().optional().describe("Optional title for the report"),
1109
+ items: z15.array(z15.object({
1110
+ roadmapItemId: z15.string().describe("UUID of the roadmap item"),
1111
+ status: z15.string().describe("Status of the item at report creation time")
1112
+ })).optional().describe("Roadmap items to include in the report snapshot")
1113
+ };
1114
+ var saveStoriesInput = {
1115
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1116
+ epics: z15.array(z15.object({
1117
+ title: z15.string().min(1).describe("Title of the epic"),
1118
+ description: z15.string().nullable().optional().describe("Description of the epic"),
1119
+ stories: z15.array(z15.object({
1120
+ title: z15.string().min(1).describe("Title of the story"),
1121
+ description: z15.string().nullable().optional().describe("Description of the story")
1122
+ })).optional().describe("Stories within this epic")
1123
+ })).optional().describe("List of epics with their nested stories"),
1124
+ stories: z15.array(z15.object({
1125
+ title: z15.string().min(1).describe("Title of the story"),
1126
+ description: z15.string().nullable().optional().describe("Description of the story")
1127
+ })).optional().describe("List of standalone stories (not part of any epic)")
1128
+ };
1129
+ var searchInitiativesInput = {
1130
+ query: z15.string().optional().describe("Search query to match against title or description"),
1131
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1132
+ ...paginationFields
1133
+ };
1134
+ var getInitiativeInput = {
1135
+ id: idField("initiative")
1136
+ };
1137
+ var createInitiativeInput = {
1138
+ title: z15.string().describe("Title of the initiative"),
1139
+ description: z15.string().optional().describe("Description of the initiative (markdown)"),
1140
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1141
+ dateGranularity: dateGranularitySchema.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
1142
+ dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
1143
+ targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
1144
+ };
1145
+ var updateInitiativeInput = {
1146
+ id: idField("initiative to update"),
1147
+ title: z15.string().optional().describe("New title"),
1148
+ description: z15.string().nullable().optional().describe("New description (null to clear)"),
1149
+ horizon: horizonSchema.optional().describe("New planning horizon"),
1150
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("New target date granularity (null to clear)"),
1151
+ dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
1152
+ targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
1153
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
1154
+ };
1155
+ var deleteInitiativeInput = {
1156
+ id: idField("initiative to delete")
1157
+ };
1158
+ var reorderInitiativesInput = {
1159
+ items: orderItemsField("initiative")
1160
+ };
1161
+ var uploadWireframeInput = {
1162
+ roadmapId: idField("roadmap item"),
1163
+ filePath: z15.string().describe("Absolute path to the image file on disk"),
1164
+ description: z15.string().optional().describe("Optional description of the wireframe"),
1165
+ outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
1166
+ };
1167
+ var updateWireframeInput = {
1168
+ id: idField("wireframe"),
1169
+ description: z15.string().nullable().optional().describe("New description for the wireframe"),
1170
+ outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
1171
+ };
1172
+ var deleteWireframeInput = {
1173
+ id: idField("wireframe to delete")
1174
+ };
1175
+ var uploadBrainstormMediaInput = {
1176
+ roadmapId: idField("roadmap item"),
1177
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1178
+ description: z15.string().optional().describe("Optional description of the media")
1179
+ };
1180
+ var updateBrainstormMediaInput = {
1181
+ id: idField("brainstorm media"),
1182
+ description: z15.string().nullable().describe("New description for the media")
1183
+ };
1184
+ var deleteBrainstormMediaInput = {
1185
+ id: idField("brainstorm media to delete")
1186
+ };
1187
+ var uploadProductDesignMediaInput = {
1188
+ productId: idField("product"),
1189
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1190
+ description: z15.string().optional().describe("Optional description of the media")
1191
+ };
1192
+ var updateProductDesignMediaInput2 = {
1193
+ productId: idField("product"),
1194
+ mediaId: idField("design media"),
1195
+ description: z15.string().nullable().describe("New description for the media")
1196
+ };
1197
+ var deleteProductDesignMediaInput = {
1198
+ productId: idField("product"),
1199
+ mediaId: idField("design media to delete")
1200
+ };
1201
+ var uploadDesignWalkthroughInput = {
1202
+ roadmapId: idField("roadmap item"),
1203
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1204
+ };
1205
+ var uploadReleaseWalkthroughInput = {
1206
+ roadmapId: idField("roadmap item"),
1207
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1208
+ };
1209
+ var publishPrototypeInput = {
1210
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
1211
+ folderPath: z15.string().describe("Absolute path to the local mockup folder"),
1212
+ entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
1213
+ };
1214
+ var listPrototypesInput = {
1215
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
1216
+ };
1217
+ var createFeedbackSessionInput = {
1218
+ prototypeId: uuidField("prototype to create a feedback session for"),
1219
+ name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
1220
+ expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
1221
+ };
1222
+ var listFeedbackSessionsInput = {
1223
+ prototypeId: uuidField("prototype")
1224
+ };
1225
+ var getFeedbackSummaryInput = {
1226
+ prototypeId: uuidField("prototype"),
1227
+ sessionId: uuidField("feedback session"),
1228
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
1229
+ };
1230
+ var getFeedbackDetailInput = {
1231
+ prototypeId: uuidField("prototype"),
1232
+ sessionId: uuidField("feedback session"),
1233
+ commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
1234
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
1235
+ };
1236
+ var resolveFeedbackCommentInput = {
1237
+ prototypeId: uuidField("prototype"),
1238
+ sessionId: uuidField("feedback session"),
1239
+ commentId: uuidField("comment to resolve/unresolve")
1240
+ };
1241
+ var searchExportsInput = {
1242
+ roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
1243
+ externalSystem: externalSystemSchema.optional().describe("Filter by external system"),
1244
+ localEntityType: localEntityTypeSchema.optional().describe("Filter by local entity type"),
1245
+ localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
1246
+ ...paginationFields
1247
+ };
1248
+ var getExportInput = {
1249
+ id: z15.string().uuid().describe("The UUID of the export record")
1250
+ };
1251
+ var createExportInput = {
1252
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1253
+ localEntityType: localEntityTypeSchema.describe("Type of local entity being exported"),
1254
+ localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
1255
+ externalSystem: externalSystemSchema.describe("External system where the entity was exported"),
1256
+ externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
1257
+ externalId: z15.string().min(1).describe("ID of the object in the external system"),
1258
+ externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
1259
+ metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
1260
+ };
1261
+ var updateExportInput = {
1262
+ id: z15.string().uuid().describe("The UUID of the export record to update"),
1263
+ externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
1264
+ metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
1265
+ };
1266
+ var deleteExportInput = {
1267
+ id: z15.string().uuid().describe("The UUID of the export record to delete")
1268
+ };
1269
+ var getPresentationInput = {
1270
+ id: idField("presentation")
1271
+ };
1272
+ var createPresentationInput = {
1273
+ title: z15.string().describe("Title of the presentation"),
1274
+ description: z15.string().nullable().optional().describe("Description of the presentation")
1275
+ };
1276
+ var updatePresentationInput = {
1277
+ id: idField("presentation to update"),
1278
+ title: z15.string().optional().describe("New title"),
1279
+ description: z15.string().nullable().optional().describe("New description")
1280
+ };
1281
+ var deletePresentationInput = {
1282
+ id: idField("presentation to delete")
1283
+ };
1284
+ var reorderPresentationsInput = {
1285
+ items: orderItemsField("presentation")
1286
+ };
1287
+ var listVariantsInput = {
1288
+ presentationId: idField("presentation")
1289
+ };
1290
+ var getVariantInput = {
1291
+ presentationId: idField("presentation"),
1292
+ variantId: idField("variant")
1293
+ };
1294
+ var createVariantInput = {
1295
+ presentationId: idField("presentation"),
1296
+ name: z15.string().describe("Name of the variant"),
1297
+ audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
1298
+ };
1299
+ var updateVariantInput = {
1300
+ presentationId: idField("presentation"),
1301
+ variantId: idField("variant to update"),
1302
+ name: z15.string().optional().describe("New name"),
1303
+ audienceId: z15.string().nullable().optional().describe("New target audience UUID")
1304
+ };
1305
+ var deleteVariantInput = {
1306
+ presentationId: idField("presentation"),
1307
+ variantId: idField("variant to delete")
1308
+ };
1309
+ var reorderVariantsInput = {
1310
+ presentationId: idField("presentation"),
1311
+ items: orderItemsField("variant")
1312
+ };
1313
+ var cloneVariantInput = {
1314
+ presentationId: idField("presentation"),
1315
+ variantId: idField("variant to clone")
1316
+ };
1317
+ var setDefaultVariantInput = {
1318
+ presentationId: idField("presentation"),
1319
+ variantId: idField("variant to set as default")
1320
+ };
1321
+ var listSlidesInput = {
1322
+ variantId: idField("variant")
1323
+ };
1324
+ var getSlideInput = {
1325
+ variantId: idField("variant"),
1326
+ slideId: idField("slide")
1327
+ };
1328
+ var createSlideInput = {
1329
+ variantId: idField("variant"),
1330
+ slideType: slideTypeSchema.default("bullets").describe("The type of slide to create"),
1331
+ 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.'),
1332
+ speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
1333
+ };
1334
+ var updateSlideInput = {
1335
+ variantId: idField("variant"),
1336
+ slideId: idField("slide to update"),
1337
+ title: z15.string().optional().describe("New title"),
1338
+ content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
1339
+ speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
1340
+ };
1341
+ var deleteSlideInput = {
1342
+ variantId: idField("variant"),
1343
+ slideId: idField("slide to delete")
1344
+ };
1345
+ var reorderSlidesInput = {
1346
+ variantId: idField("variant"),
1347
+ items: orderItemsField("slide")
1348
+ };
1349
+ var uploadSlideImageInput = {
1350
+ variantId: idField("variant"),
1351
+ slideId: idField("slide to add the image to"),
1352
+ filePath: z15.string().describe("Absolute path to the image file on disk")
1353
+ };
1354
+ // ../../packages/shared/src/schemas/variant.ts
1355
+ import { z as z16 } from "zod";
1356
+ var variantSchema = z16.object({
1357
+ id: z16.string().uuid(),
1358
+ presentationId: z16.string().uuid(),
1359
+ name: z16.string(),
1360
+ audienceId: z16.string().uuid().nullable(),
1361
+ isDefault: z16.boolean(),
1362
+ order: z16.number().int(),
1363
+ createdAt: z16.string(),
1364
+ createdBy: z16.string(),
1365
+ updatedAt: z16.string().nullable()
665
1366
  });
666
- var createVariantSchema = z14.object({
667
- name: z14.string().min(1),
668
- audienceId: z14.string().uuid().nullable().optional()
1367
+ var createVariantSchema = z16.object({
1368
+ name: z16.string().min(1),
1369
+ audienceId: z16.string().uuid().nullable().optional()
669
1370
  });
670
- var updateVariantSchema = z14.object({
671
- name: z14.string().min(1).optional(),
672
- audienceId: z14.string().uuid().nullable().optional()
1371
+ var updateVariantSchema = z16.object({
1372
+ name: z16.string().min(1).optional(),
1373
+ audienceId: z16.string().uuid().nullable().optional()
673
1374
  });
674
- var variantListSchema = z14.array(variantSchema);
675
- // src/tools/index.ts
676
- import { z as z15 } from "zod";
677
-
1375
+ var variantListSchema = z16.array(variantSchema);
678
1376
  // src/auth.ts
679
1377
  function getCredentials() {
680
1378
  const apiKey = process.env.ROADMAPS_API_KEY;
@@ -1498,15 +2196,7 @@ function registerGetWorkflows(server) {
1498
2196
  function registerSearchRoadmaps(server) {
1499
2197
  server.registerTool("search_roadmaps", {
1500
2198
  description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
1501
- inputSchema: {
1502
- query: z15.string().optional().describe("Search query to match against title or description"),
1503
- status: roadmapStatusSchema.optional().describe("Filter by status"),
1504
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1505
- phase: z15.string().optional().describe("Filter by phase"),
1506
- phaseStep: z15.string().optional().describe("Filter by phase step"),
1507
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1508
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
1509
- }
2199
+ inputSchema: searchRoadmapsInput
1510
2200
  }, async ({
1511
2201
  query,
1512
2202
  status,
@@ -1555,9 +2245,7 @@ function registerSearchRoadmaps(server) {
1555
2245
  function registerGetRoadmap(server) {
1556
2246
  server.registerTool("get_roadmap", {
1557
2247
  description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
1558
- inputSchema: {
1559
- id: z15.string().describe("The UUID of the roadmap item")
1560
- }
2248
+ inputSchema: getRoadmapInput
1561
2249
  }, async ({ id }) => {
1562
2250
  const client2 = getApiClient();
1563
2251
  const roadmap2 = await client2.getRoadmap(id);
@@ -1573,8 +2261,16 @@ function registerGetRoadmap(server) {
1573
2261
  value: roadmap2.value,
1574
2262
  effort: roadmap2.effort,
1575
2263
  order: roadmap2.order,
1576
- prd: roadmap2.prd,
1577
- brainstormNotes: roadmap2.brainstormNotes,
2264
+ prd: roadmap2.prd ? {
2265
+ ...roadmap2.prd,
2266
+ what: contentToMarkdown(roadmap2.prd.what),
2267
+ why: contentToMarkdown(roadmap2.prd.why),
2268
+ outcomes: roadmap2.prd.outcomes?.map((o) => ({
2269
+ ...o,
2270
+ description: contentToMarkdown(o.description)
2271
+ }))
2272
+ } : null,
2273
+ brainstormNotes: contentToMarkdown(roadmap2.brainstormNotes),
1578
2274
  wireframes: roadmap2.wireframes?.map((w) => ({
1579
2275
  id: w.id,
1580
2276
  imageUrl: w.imageUrl,
@@ -1594,10 +2290,10 @@ function registerGetRoadmap(server) {
1594
2290
  })),
1595
2291
  epics: roadmap2.epics,
1596
2292
  stories: roadmap2.stories,
1597
- designDescription: roadmap2.design?.description ?? null,
1598
- planDescription: roadmap2.plan?.description ?? null,
1599
- buildDescription: roadmap2.build?.description ?? null,
1600
- releaseDescription: roadmap2.release?.description ?? null,
2293
+ designDescription: contentToMarkdown(roadmap2.design?.description),
2294
+ planDescription: contentToMarkdown(roadmap2.plan?.description),
2295
+ buildDescription: contentToMarkdown(roadmap2.build?.description),
2296
+ releaseDescription: contentToMarkdown(roadmap2.release?.description),
1601
2297
  prompt: roadmap2.build?.prompt ?? roadmap2.prompt ?? null,
1602
2298
  createdAt: roadmap2.createdAt
1603
2299
  }, null, 2)
@@ -1609,10 +2305,7 @@ function registerGetRoadmap(server) {
1609
2305
  function registerSearchFeatures(server) {
1610
2306
  server.registerTool("search_features", {
1611
2307
  description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
1612
- inputSchema: {
1613
- query: z15.string().optional().describe("Search query to match against name"),
1614
- type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
1615
- }
2308
+ inputSchema: searchFeaturesInput
1616
2309
  }, async ({ query, type }) => {
1617
2310
  const client2 = getApiClient();
1618
2311
  let features = await client2.listFeatures();
@@ -1641,9 +2334,7 @@ function registerSearchFeatures(server) {
1641
2334
  function registerGetFeature(server) {
1642
2335
  server.registerTool("get_feature", {
1643
2336
  description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
1644
- inputSchema: {
1645
- id: z15.string().describe("The UUID of the feature")
1646
- }
2337
+ inputSchema: getFeatureInput
1647
2338
  }, async ({ id }) => {
1648
2339
  const client2 = getApiClient();
1649
2340
  const feature2 = await client2.getFeature(id);
@@ -1658,7 +2349,7 @@ function registerGetFeature(server) {
1658
2349
  parentId: feature2.parentId,
1659
2350
  outcomes: feature2.outcomes?.map((o) => ({
1660
2351
  id: o.id,
1661
- description: o.description
2352
+ description: contentToMarkdown(o.description)
1662
2353
  })),
1663
2354
  children: feature2.children?.map((c) => ({
1664
2355
  id: c.id,
@@ -1680,10 +2371,7 @@ function registerGetFeature(server) {
1680
2371
  function registerSearchIdeas(server) {
1681
2372
  server.registerTool("search_ideas", {
1682
2373
  description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
1683
- inputSchema: {
1684
- query: z15.string().optional().describe("Search query to match against title or description"),
1685
- status: ideaStatusSchema.optional().describe("Filter by status")
1686
- }
2374
+ inputSchema: searchIdeasInput
1687
2375
  }, async ({ query, status }) => {
1688
2376
  const client2 = getApiClient();
1689
2377
  let ideas = await client2.listIdeas();
@@ -1701,7 +2389,7 @@ function registerSearchIdeas(server) {
1701
2389
  text: JSON.stringify(ideas.map((i) => ({
1702
2390
  id: i.id,
1703
2391
  title: i.title,
1704
- description: i.description,
2392
+ description: contentToMarkdown(i.description),
1705
2393
  status: i.status,
1706
2394
  source: i.source
1707
2395
  })), null, 2)
@@ -1738,8 +2426,8 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
1738
2426
  type: "text",
1739
2427
  text: JSON.stringify({
1740
2428
  strategy: {
1741
- vision: strategy.vision,
1742
- mission: strategy.mission
2429
+ vision: contentToMarkdown(strategy.vision),
2430
+ mission: contentToMarkdown(strategy.mission)
1743
2431
  },
1744
2432
  products: products.map((p) => ({
1745
2433
  id: p.id,
@@ -1780,11 +2468,7 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
1780
2468
  function registerCaptureIdea(server) {
1781
2469
  server.registerTool("capture_idea", {
1782
2470
  description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
1783
- inputSchema: {
1784
- title: z15.string().describe("Title of the idea"),
1785
- description: z15.string().optional().describe("Detailed description of the idea"),
1786
- source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
1787
- }
2471
+ inputSchema: captureIdeaInput
1788
2472
  }, async ({
1789
2473
  title,
1790
2474
  description,
@@ -1819,18 +2503,7 @@ function registerCaptureIdea(server) {
1819
2503
  function registerCreateRoadmapItem(server) {
1820
2504
  server.registerTool("create_roadmap_item", {
1821
2505
  description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
1822
- inputSchema: {
1823
- title: z15.string().describe("Title of the roadmap item"),
1824
- status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
1825
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1826
- phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
1827
- phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
1828
- initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
1829
- dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1830
- dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1831
- targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1832
- targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1833
- }
2506
+ inputSchema: createRoadmapItemInput
1834
2507
  }, async ({
1835
2508
  title,
1836
2509
  status,
@@ -1891,31 +2564,10 @@ function registerCreateRoadmapItem(server) {
1891
2564
  };
1892
2565
  });
1893
2566
  }
1894
- var effortSizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
1895
2567
  function registerUpdateRoadmapItem(server) {
1896
2568
  server.registerTool("update_roadmap_item", {
1897
2569
  description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
1898
- inputSchema: {
1899
- id: z15.string().describe("The UUID of the roadmap item to update"),
1900
- title: z15.string().optional().describe("New title"),
1901
- status: roadmapStatusSchema.optional().describe("New status"),
1902
- horizon: horizonSchema.optional().describe("New planning horizon"),
1903
- phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
1904
- phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
1905
- value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
1906
- effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
1907
- order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
1908
- initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
1909
- designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
1910
- planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
1911
- buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
1912
- releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
1913
- prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
1914
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
1915
- dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
1916
- targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
1917
- targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
1918
- }
2570
+ inputSchema: updateRoadmapItemInput
1919
2571
  }, async ({
1920
2572
  id,
1921
2573
  title,
@@ -2024,14 +2676,7 @@ function registerUpdateRoadmapItem(server) {
2024
2676
  function registerAddFeature(server) {
2025
2677
  server.registerTool("add_feature", {
2026
2678
  description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
2027
- inputSchema: {
2028
- name: z15.string().describe("Name of the feature"),
2029
- description: z15.string().optional().describe("Description of the feature"),
2030
- type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
2031
- parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
2032
- outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
2033
- linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
2034
- }
2679
+ inputSchema: addFeatureInput
2035
2680
  }, async ({
2036
2681
  name,
2037
2682
  description,
@@ -2076,12 +2721,7 @@ function registerAddFeature(server) {
2076
2721
  function registerSavePrd(server) {
2077
2722
  server.registerTool("save_prd", {
2078
2723
  description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
2079
- inputSchema: {
2080
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
2081
- what: z15.string().nullable().describe("What is being built - the feature description"),
2082
- why: z15.string().nullable().describe("Why this is being built - the business justification"),
2083
- outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
2084
- }
2724
+ inputSchema: savePrdInput
2085
2725
  }, async ({
2086
2726
  roadmapId,
2087
2727
  what,
@@ -2117,10 +2757,7 @@ function registerSavePrd(server) {
2117
2757
  function registerUpdateBrainstormNotes(server) {
2118
2758
  server.registerTool("update_brainstorm_notes", {
2119
2759
  description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
2120
- inputSchema: {
2121
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
2122
- notes: z15.string().describe("The brainstorm notes content")
2123
- }
2760
+ inputSchema: updateBrainstormNotesInput
2124
2761
  }, async ({ roadmapId, notes }) => {
2125
2762
  const client2 = getApiClient();
2126
2763
  const roadmap2 = await client2.updateRoadmap(roadmapId, {
@@ -2147,9 +2784,7 @@ function registerUpdateBrainstormNotes(server) {
2147
2784
  function registerDeleteRoadmapItem(server) {
2148
2785
  server.registerTool("delete_roadmap_item", {
2149
2786
  description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
2150
- inputSchema: {
2151
- id: z15.string().describe("The UUID of the roadmap item to delete")
2152
- }
2787
+ inputSchema: deleteRoadmapItemInput
2153
2788
  }, async ({ id }) => {
2154
2789
  const client2 = getApiClient();
2155
2790
  await client2.deleteRoadmap(id);
@@ -2169,12 +2804,7 @@ function registerDeleteRoadmapItem(server) {
2169
2804
  function registerReorderRoadmaps(server) {
2170
2805
  server.registerTool("reorder_roadmaps", {
2171
2806
  description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
2172
- inputSchema: {
2173
- items: z15.array(z15.object({
2174
- id: z15.string().describe("The UUID of the roadmap item"),
2175
- order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
2176
- })).describe("Array of roadmap items with their new order values")
2177
- }
2807
+ inputSchema: reorderRoadmapsInput
2178
2808
  }, async ({ items }) => {
2179
2809
  const client2 = getApiClient();
2180
2810
  const result = await client2.reorderRoadmaps(items);
@@ -2195,12 +2825,7 @@ function registerReorderRoadmaps(server) {
2195
2825
  function registerUpdateFeature(server) {
2196
2826
  server.registerTool("update_feature", {
2197
2827
  description: "Update an existing feature. Can update name, type, or parent.",
2198
- inputSchema: {
2199
- id: z15.string().describe("The UUID of the feature to update"),
2200
- name: z15.string().optional().describe("New name for the feature"),
2201
- type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
2202
- parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2203
- }
2828
+ inputSchema: updateFeatureInput
2204
2829
  }, async ({
2205
2830
  id,
2206
2831
  name,
@@ -2237,9 +2862,7 @@ function registerUpdateFeature(server) {
2237
2862
  function registerDeleteFeature(server) {
2238
2863
  server.registerTool("delete_feature", {
2239
2864
  description: "Delete a feature. This is a soft delete that also deletes all child features.",
2240
- inputSchema: {
2241
- id: z15.string().describe("The UUID of the feature to delete")
2242
- }
2865
+ inputSchema: deleteFeatureInput
2243
2866
  }, async ({ id }) => {
2244
2867
  const client2 = getApiClient();
2245
2868
  await client2.deleteFeature(id);
@@ -2259,9 +2882,7 @@ function registerDeleteFeature(server) {
2259
2882
  function registerGetIdea(server) {
2260
2883
  server.registerTool("get_idea", {
2261
2884
  description: "Get full details of a single idea by ID.",
2262
- inputSchema: {
2263
- id: z15.string().describe("The UUID of the idea")
2264
- }
2885
+ inputSchema: getIdeaInput
2265
2886
  }, async ({ id }) => {
2266
2887
  const client2 = getApiClient();
2267
2888
  const idea2 = await client2.getIdea(id);
@@ -2272,7 +2893,7 @@ function registerGetIdea(server) {
2272
2893
  text: JSON.stringify({
2273
2894
  id: idea2.id,
2274
2895
  title: idea2.title,
2275
- description: idea2.description,
2896
+ description: contentToMarkdown(idea2.description),
2276
2897
  status: idea2.status,
2277
2898
  source: idea2.source,
2278
2899
  submittedBy: idea2.submittedBy,
@@ -2288,14 +2909,7 @@ function registerGetIdea(server) {
2288
2909
  function registerUpdateIdea(server) {
2289
2910
  server.registerTool("update_idea", {
2290
2911
  description: "Update an existing idea. Can update title, description, status, value, or effort.",
2291
- inputSchema: {
2292
- id: z15.string().describe("The UUID of the idea to update"),
2293
- title: z15.string().optional().describe("New title"),
2294
- description: z15.string().nullable().optional().describe("New description"),
2295
- status: ideaStatusSchema.optional().describe("New status"),
2296
- value: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
2297
- effort: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
2298
- }
2912
+ inputSchema: updateIdeaInput
2299
2913
  }, async ({
2300
2914
  id,
2301
2915
  title,
@@ -2340,9 +2954,7 @@ function registerUpdateIdea(server) {
2340
2954
  function registerDeleteIdea(server) {
2341
2955
  server.registerTool("delete_idea", {
2342
2956
  description: "Delete an idea. This is a soft delete.",
2343
- inputSchema: {
2344
- id: z15.string().describe("The UUID of the idea to delete")
2345
- }
2957
+ inputSchema: deleteIdeaInput
2346
2958
  }, async ({ id }) => {
2347
2959
  const client2 = getApiClient();
2348
2960
  await client2.deleteIdea(id);
@@ -2370,7 +2982,10 @@ function registerGetStrategy(server) {
2370
2982
  content: [
2371
2983
  {
2372
2984
  type: "text",
2373
- text: JSON.stringify(strategy, null, 2)
2985
+ text: JSON.stringify({
2986
+ vision: contentToMarkdown(strategy.vision),
2987
+ mission: contentToMarkdown(strategy.mission)
2988
+ }, null, 2)
2374
2989
  }
2375
2990
  ]
2376
2991
  };
@@ -2379,10 +2994,7 @@ function registerGetStrategy(server) {
2379
2994
  function registerUpdateStrategy(server) {
2380
2995
  server.registerTool("update_strategy", {
2381
2996
  description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
2382
- inputSchema: {
2383
- vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
2384
- mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
2385
- }
2997
+ inputSchema: updateStrategyInput
2386
2998
  }, async ({ vision, mission }) => {
2387
2999
  const client2 = getApiClient();
2388
3000
  const updates = {};
@@ -2428,10 +3040,7 @@ function registerListScenarios(server) {
2428
3040
  function registerCreateScenario(server) {
2429
3041
  server.registerTool("create_scenario", {
2430
3042
  description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
2431
- inputSchema: {
2432
- title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
2433
- description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
2434
- }
3043
+ inputSchema: createScenarioInput
2435
3044
  }, async ({ title, description }) => {
2436
3045
  const client2 = getApiClient();
2437
3046
  const scenario2 = await client2.createScenario({
@@ -2458,11 +3067,7 @@ function registerCreateScenario(server) {
2458
3067
  function registerUpdateScenario(server) {
2459
3068
  server.registerTool("update_scenario", {
2460
3069
  description: "Update an existing scenario.",
2461
- inputSchema: {
2462
- id: z15.string().describe("The UUID of the scenario to update"),
2463
- title: z15.string().optional().describe("New title"),
2464
- description: z15.string().nullable().optional().describe("New description")
2465
- }
3070
+ inputSchema: updateScenarioInput
2466
3071
  }, async ({
2467
3072
  id,
2468
3073
  title,
@@ -2495,9 +3100,7 @@ function registerUpdateScenario(server) {
2495
3100
  function registerDeleteScenario(server) {
2496
3101
  server.registerTool("delete_scenario", {
2497
3102
  description: "Delete a scenario. This is a soft delete.",
2498
- inputSchema: {
2499
- id: z15.string().describe("The UUID of the scenario to delete")
2500
- }
3103
+ inputSchema: deleteScenarioInput
2501
3104
  }, async ({ id }) => {
2502
3105
  const client2 = getApiClient();
2503
3106
  await client2.deleteScenario(id);
@@ -2511,22 +3114,10 @@ function registerDeleteScenario(server) {
2511
3114
  };
2512
3115
  });
2513
3116
  }
2514
- var productTypeSchema2 = z15.enum([
2515
- "brand",
2516
- "product",
2517
- "app",
2518
- "marketing_site",
2519
- "landing_page",
2520
- "service"
2521
- ]);
2522
3117
  function registerCreateProduct(server) {
2523
3118
  server.registerTool("create_product", {
2524
3119
  description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
2525
- inputSchema: {
2526
- type: productTypeSchema2.describe("Type of product"),
2527
- name: z15.string().describe("Name of the product"),
2528
- parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
2529
- }
3120
+ inputSchema: createProductInput
2530
3121
  }, async ({
2531
3122
  type,
2532
3123
  name,
@@ -2559,11 +3150,7 @@ function registerCreateProduct(server) {
2559
3150
  function registerUpdateProduct(server) {
2560
3151
  server.registerTool("update_product", {
2561
3152
  description: "Update an existing product.",
2562
- inputSchema: {
2563
- id: z15.string().describe("The UUID of the product to update"),
2564
- name: z15.string().optional().describe("New name"),
2565
- parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
2566
- }
3153
+ inputSchema: updateProductInput
2567
3154
  }, async ({ id, name, parentId }) => {
2568
3155
  const client2 = getApiClient();
2569
3156
  const updates = {};
@@ -2593,9 +3180,7 @@ function registerUpdateProduct(server) {
2593
3180
  function registerDeleteProduct(server) {
2594
3181
  server.registerTool("delete_product", {
2595
3182
  description: "Delete a product. This is a soft delete that also deletes all child products.",
2596
- inputSchema: {
2597
- id: z15.string().describe("The UUID of the product to delete")
2598
- }
3183
+ inputSchema: deleteProductInput
2599
3184
  }, async ({ id }) => {
2600
3185
  const client2 = getApiClient();
2601
3186
  const result = await client2.deleteProduct(id);
@@ -2616,9 +3201,7 @@ function registerDeleteProduct(server) {
2616
3201
  function registerGetProduct(server) {
2617
3202
  server.registerTool("get_product", {
2618
3203
  description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
2619
- inputSchema: {
2620
- id: z15.string().describe("The UUID of the product")
2621
- }
3204
+ inputSchema: getProductInput
2622
3205
  }, async ({ id }) => {
2623
3206
  const client2 = getApiClient();
2624
3207
  const [product2, documentation] = await Promise.all([
@@ -2640,8 +3223,8 @@ function registerGetProduct(server) {
2640
3223
  createdAt: product2.createdAt
2641
3224
  },
2642
3225
  documentation: documentation ? {
2643
- designSystem: documentation.designSystem,
2644
- adrs: documentation.adrs,
3226
+ designSystem: contentToMarkdown(documentation.designSystem),
3227
+ adrs: contentToMarkdown(documentation.adrs),
2645
3228
  updatedAt: documentation.updatedAt
2646
3229
  } : null
2647
3230
  }, null, 2)
@@ -2653,10 +3236,7 @@ function registerGetProduct(server) {
2653
3236
  function registerSearchProducts(server) {
2654
3237
  server.registerTool("search_products", {
2655
3238
  description: "Search for products by name. Returns a list of matching products with basic info.",
2656
- inputSchema: {
2657
- query: z15.string().optional().describe("Search query to match against product name"),
2658
- type: productTypeSchema2.optional().describe("Filter by product type")
2659
- }
3239
+ inputSchema: searchProductsInput
2660
3240
  }, async ({ query, type }) => {
2661
3241
  const client2 = getApiClient();
2662
3242
  let products = await client2.listProducts();
@@ -2688,9 +3268,7 @@ function registerSearchProducts(server) {
2688
3268
  function registerGetProductDocumentation(server) {
2689
3269
  server.registerTool("get_product_documentation", {
2690
3270
  description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
2691
- inputSchema: {
2692
- productId: z15.string().describe("The UUID of the product")
2693
- }
3271
+ inputSchema: getProductDocumentationInput
2694
3272
  }, async ({ productId }) => {
2695
3273
  const client2 = getApiClient();
2696
3274
  const documentation = await client2.getProductDocumentation(productId);
@@ -2702,8 +3280,8 @@ function registerGetProductDocumentation(server) {
2702
3280
  productId,
2703
3281
  documentation: documentation ? {
2704
3282
  id: documentation.id,
2705
- designSystem: documentation.designSystem,
2706
- adrs: documentation.adrs,
3283
+ designSystem: contentToMarkdown(documentation.designSystem),
3284
+ adrs: contentToMarkdown(documentation.adrs),
2707
3285
  createdAt: documentation.createdAt,
2708
3286
  updatedAt: documentation.updatedAt
2709
3287
  } : null
@@ -2716,11 +3294,7 @@ function registerGetProductDocumentation(server) {
2716
3294
  function registerUpdateProductDocumentation(server) {
2717
3295
  server.registerTool("update_product_documentation", {
2718
3296
  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.",
2719
- inputSchema: {
2720
- productId: z15.string().describe("The UUID of the product"),
2721
- designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2722
- adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
2723
- }
3297
+ inputSchema: updateProductDocumentationInput
2724
3298
  }, async ({
2725
3299
  productId,
2726
3300
  designSystem,
@@ -2755,10 +3329,7 @@ function registerUpdateProductDocumentation(server) {
2755
3329
  function registerCreateAudience(server) {
2756
3330
  server.registerTool("create_audience", {
2757
3331
  description: "Create a new audience member. Audiences represent who the product serves.",
2758
- inputSchema: {
2759
- name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
2760
- description: z15.string().nullable().optional().describe("Description of the audience")
2761
- }
3332
+ inputSchema: createAudienceInput
2762
3333
  }, async ({ name, description }) => {
2763
3334
  const client2 = getApiClient();
2764
3335
  const audience2 = await client2.createAudience({
@@ -2785,11 +3356,7 @@ function registerCreateAudience(server) {
2785
3356
  function registerUpdateAudience(server) {
2786
3357
  server.registerTool("update_audience", {
2787
3358
  description: "Update an existing audience member.",
2788
- inputSchema: {
2789
- id: z15.string().describe("The UUID of the audience to update"),
2790
- name: z15.string().optional().describe("New name"),
2791
- description: z15.string().nullable().optional().describe("New description")
2792
- }
3359
+ inputSchema: updateAudienceInput
2793
3360
  }, async ({
2794
3361
  id,
2795
3362
  name,
@@ -2822,9 +3389,7 @@ function registerUpdateAudience(server) {
2822
3389
  function registerDeleteAudience(server) {
2823
3390
  server.registerTool("delete_audience", {
2824
3391
  description: "Delete an audience member. This is a soft delete.",
2825
- inputSchema: {
2826
- id: z15.string().describe("The UUID of the audience to delete")
2827
- }
3392
+ inputSchema: deleteAudienceInput
2828
3393
  }, async ({ id }) => {
2829
3394
  const client2 = getApiClient();
2830
3395
  await client2.deleteAudience(id);
@@ -2864,20 +3429,7 @@ function registerListStatusUpdates(server) {
2864
3429
  function registerGetHistory(server) {
2865
3430
  server.registerTool("get_history", {
2866
3431
  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.",
2867
- inputSchema: {
2868
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2869
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
2870
- entityType: z15.enum([
2871
- "roadmap",
2872
- "feature",
2873
- "idea",
2874
- "prd",
2875
- "wireframe",
2876
- "product",
2877
- "audience",
2878
- "scenario"
2879
- ]).optional().describe("Filter to specific entity type")
2880
- }
3432
+ inputSchema: getHistoryInput
2881
3433
  }, async ({
2882
3434
  startDate,
2883
3435
  endDate,
@@ -2898,10 +3450,7 @@ function registerGetHistory(server) {
2898
3450
  function registerGetHistorySummary(server) {
2899
3451
  server.registerTool("get_history_summary", {
2900
3452
  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.",
2901
- inputSchema: {
2902
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
2903
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
2904
- }
3453
+ inputSchema: getHistorySummaryInput
2905
3454
  }, async ({ startDate, endDate }) => {
2906
3455
  const client2 = getApiClient();
2907
3456
  const summary = await client2.getHistorySummary({ startDate, endDate });
@@ -2918,16 +3467,7 @@ function registerGetHistorySummary(server) {
2918
3467
  function registerCreateStatusUpdate(server) {
2919
3468
  server.registerTool("create_status_update", {
2920
3469
  description: "Create a new status report. Use this after generating the report content from history events.",
2921
- inputSchema: {
2922
- startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
2923
- endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
2924
- content: z15.string().describe("The markdown content of the status report"),
2925
- title: z15.string().optional().describe("Optional title for the report"),
2926
- items: z15.array(z15.object({
2927
- roadmapItemId: z15.string().describe("UUID of the roadmap item"),
2928
- status: z15.string().describe("Status of the item at report creation time")
2929
- })).optional().describe("Roadmap items to include in the report snapshot")
2930
- }
3470
+ inputSchema: createStatusUpdateInput
2931
3471
  }, async ({
2932
3472
  startDate,
2933
3473
  endDate,
@@ -2965,21 +3505,7 @@ function registerCreateStatusUpdate(server) {
2965
3505
  function registerSaveStories(server) {
2966
3506
  server.registerTool("save_stories", {
2967
3507
  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.",
2968
- inputSchema: {
2969
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
2970
- epics: z15.array(z15.object({
2971
- title: z15.string().min(1).describe("Title of the epic"),
2972
- description: z15.string().nullable().optional().describe("Description of the epic"),
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")
2976
- })).optional().describe("Stories within this epic")
2977
- })).optional().describe("List of epics with their nested stories"),
2978
- stories: z15.array(z15.object({
2979
- title: z15.string().min(1).describe("Title of the story"),
2980
- description: z15.string().nullable().optional().describe("Description of the story")
2981
- })).optional().describe("List of standalone stories (not part of any epic)")
2982
- }
3508
+ inputSchema: saveStoriesInput
2983
3509
  }, async ({
2984
3510
  roadmapId,
2985
3511
  epics,
@@ -3008,12 +3534,7 @@ function registerSaveStories(server) {
3008
3534
  function registerUploadWireframe(server) {
3009
3535
  server.registerTool("upload_wireframe", {
3010
3536
  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.",
3011
- inputSchema: {
3012
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3013
- filePath: z15.string().describe("Absolute path to the image file on disk"),
3014
- description: z15.string().optional().describe("Optional description of the wireframe"),
3015
- outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
3016
- }
3537
+ inputSchema: uploadWireframeInput
3017
3538
  }, async ({
3018
3539
  roadmapId,
3019
3540
  filePath,
@@ -3065,11 +3586,7 @@ function registerUploadWireframe(server) {
3065
3586
  function registerUpdateWireframe(server) {
3066
3587
  server.registerTool("update_wireframe", {
3067
3588
  description: "Update a wireframe's description or outcome tags.",
3068
- inputSchema: {
3069
- id: z15.string().describe("The UUID of the wireframe"),
3070
- description: z15.string().nullable().optional().describe("New description for the wireframe"),
3071
- outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
3072
- }
3589
+ inputSchema: updateWireframeInput
3073
3590
  }, async ({
3074
3591
  id,
3075
3592
  description,
@@ -3103,9 +3620,7 @@ function registerUpdateWireframe(server) {
3103
3620
  function registerDeleteWireframe(server) {
3104
3621
  server.registerTool("delete_wireframe", {
3105
3622
  description: "Delete a wireframe (soft delete).",
3106
- inputSchema: {
3107
- id: z15.string().describe("The UUID of the wireframe to delete")
3108
- }
3623
+ inputSchema: deleteWireframeInput
3109
3624
  }, async ({ id }) => {
3110
3625
  const client2 = getApiClient();
3111
3626
  await client2.deleteWireframe(id);
@@ -3122,11 +3637,7 @@ function registerDeleteWireframe(server) {
3122
3637
  function registerUploadBrainstormMedia(server) {
3123
3638
  server.registerTool("upload_brainstorm_media", {
3124
3639
  description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
3125
- inputSchema: {
3126
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3127
- filePath: z15.string().describe("Absolute path to the image or video file on disk"),
3128
- description: z15.string().optional().describe("Optional description of the media")
3129
- }
3640
+ inputSchema: uploadBrainstormMediaInput
3130
3641
  }, async ({
3131
3642
  roadmapId,
3132
3643
  filePath,
@@ -3176,10 +3687,7 @@ function registerUploadBrainstormMedia(server) {
3176
3687
  function registerUpdateBrainstormMedia(server) {
3177
3688
  server.registerTool("update_brainstorm_media", {
3178
3689
  description: "Update a brainstorm media item's description.",
3179
- inputSchema: {
3180
- id: z15.string().describe("The UUID of the brainstorm media"),
3181
- description: z15.string().nullable().describe("New description for the media")
3182
- }
3690
+ inputSchema: updateBrainstormMediaInput
3183
3691
  }, async ({ id, description }) => {
3184
3692
  const client2 = getApiClient();
3185
3693
  const media = await client2.updateBrainstormMedia(id, { description });
@@ -3201,9 +3709,7 @@ function registerUpdateBrainstormMedia(server) {
3201
3709
  function registerDeleteBrainstormMedia(server) {
3202
3710
  server.registerTool("delete_brainstorm_media", {
3203
3711
  description: "Delete a brainstorm media item (soft delete).",
3204
- inputSchema: {
3205
- id: z15.string().describe("The UUID of the brainstorm media to delete")
3206
- }
3712
+ inputSchema: deleteBrainstormMediaInput
3207
3713
  }, async ({ id }) => {
3208
3714
  const client2 = getApiClient();
3209
3715
  await client2.deleteBrainstormMedia(id);
@@ -3220,11 +3726,7 @@ function registerDeleteBrainstormMedia(server) {
3220
3726
  function registerUploadProductDesignMedia(server) {
3221
3727
  server.registerTool("upload_product_design_media", {
3222
3728
  description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
3223
- inputSchema: {
3224
- productId: z15.string().describe("The UUID of the product"),
3225
- filePath: z15.string().describe("Absolute path to the image or video file on disk"),
3226
- description: z15.string().optional().describe("Optional description of the media")
3227
- }
3729
+ inputSchema: uploadProductDesignMediaInput
3228
3730
  }, async ({
3229
3731
  productId,
3230
3732
  filePath,
@@ -3275,11 +3777,7 @@ function registerUploadProductDesignMedia(server) {
3275
3777
  function registerUpdateProductDesignMedia(server) {
3276
3778
  server.registerTool("update_product_design_media", {
3277
3779
  description: "Update a product design media item's description.",
3278
- inputSchema: {
3279
- productId: z15.string().describe("The UUID of the product"),
3280
- mediaId: z15.string().describe("The UUID of the design media"),
3281
- description: z15.string().nullable().describe("New description for the media")
3282
- }
3780
+ inputSchema: updateProductDesignMediaInput
3283
3781
  }, async ({
3284
3782
  productId,
3285
3783
  mediaId,
@@ -3305,10 +3803,7 @@ function registerUpdateProductDesignMedia(server) {
3305
3803
  function registerDeleteProductDesignMedia(server) {
3306
3804
  server.registerTool("delete_product_design_media", {
3307
3805
  description: "Delete a product design media item (soft delete).",
3308
- inputSchema: {
3309
- productId: z15.string().describe("The UUID of the product"),
3310
- mediaId: z15.string().describe("The UUID of the design media to delete")
3311
- }
3806
+ inputSchema: deleteProductDesignMediaInput
3312
3807
  }, async ({ productId, mediaId }) => {
3313
3808
  const client2 = getApiClient();
3314
3809
  await client2.deleteProductDesignMedia(productId, mediaId);
@@ -3328,10 +3823,7 @@ function isVideoContentType(contentType) {
3328
3823
  function registerUploadDesignWalkthrough(server) {
3329
3824
  server.registerTool("upload_design_walkthrough", {
3330
3825
  description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
3331
- inputSchema: {
3332
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3333
- filePath: z15.string().describe("Absolute path to the video file on disk")
3334
- }
3826
+ inputSchema: uploadDesignWalkthroughInput
3335
3827
  }, async ({ roadmapId, filePath }) => {
3336
3828
  const client2 = getApiClient();
3337
3829
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3371,10 +3863,7 @@ function registerUploadDesignWalkthrough(server) {
3371
3863
  function registerUploadReleaseWalkthrough(server) {
3372
3864
  server.registerTool("upload_release_walkthrough", {
3373
3865
  description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
3374
- inputSchema: {
3375
- roadmapId: z15.string().describe("The UUID of the roadmap item"),
3376
- filePath: z15.string().describe("Absolute path to the video file on disk")
3377
- }
3866
+ inputSchema: uploadReleaseWalkthroughInput
3378
3867
  }, async ({ roadmapId, filePath }) => {
3379
3868
  const client2 = getApiClient();
3380
3869
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3430,11 +3919,7 @@ function getPrototypeContentType(filename) {
3430
3919
  function registerPublishPrototype(server) {
3431
3920
  server.registerTool("publish_prototype", {
3432
3921
  description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
3433
- inputSchema: {
3434
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
3435
- folderPath: z15.string().describe("Absolute path to the local mockup folder"),
3436
- entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
3437
- }
3922
+ inputSchema: publishPrototypeInput
3438
3923
  }, async ({
3439
3924
  roadmapId,
3440
3925
  folderPath,
@@ -3593,9 +4078,7 @@ Expires: ${expiryDate}`
3593
4078
  function registerListPrototypes(server) {
3594
4079
  server.registerTool("list_prototypes", {
3595
4080
  description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
3596
- inputSchema: {
3597
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
3598
- }
4081
+ inputSchema: listPrototypesInput
3599
4082
  }, async ({ roadmapId }) => {
3600
4083
  const client2 = getApiClient();
3601
4084
  const prototypes = await client2.listPrototypes(roadmapId);
@@ -3638,16 +4121,10 @@ ${lines.join(`
3638
4121
  };
3639
4122
  });
3640
4123
  }
3641
- var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
3642
4124
  function registerSearchInitiatives(server) {
3643
4125
  server.registerTool("search_initiatives", {
3644
4126
  description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
3645
- inputSchema: {
3646
- query: z15.string().optional().describe("Search query to match against title or description"),
3647
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
3648
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3649
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3650
- }
4127
+ inputSchema: searchInitiativesInput
3651
4128
  }, async ({
3652
4129
  query,
3653
4130
  horizon,
@@ -3673,7 +4150,7 @@ function registerSearchInitiatives(server) {
3673
4150
  items: paginatedInitiatives.map((i) => ({
3674
4151
  id: i.id,
3675
4152
  title: i.title,
3676
- description: i.description,
4153
+ description: contentToMarkdown(i.description),
3677
4154
  horizon: i.horizon,
3678
4155
  targetDate: i.targetDate,
3679
4156
  itemCount: i.itemCount,
@@ -3695,9 +4172,7 @@ function registerSearchInitiatives(server) {
3695
4172
  function registerGetInitiative(server) {
3696
4173
  server.registerTool("get_initiative", {
3697
4174
  description: "Get full details of an initiative including all linked roadmap items.",
3698
- inputSchema: {
3699
- id: z15.string().describe("The UUID of the initiative")
3700
- }
4175
+ inputSchema: getInitiativeInput
3701
4176
  }, async ({ id }) => {
3702
4177
  const client2 = getApiClient();
3703
4178
  const result = await client2.getInitiative(id);
@@ -3705,7 +4180,13 @@ function registerGetInitiative(server) {
3705
4180
  content: [
3706
4181
  {
3707
4182
  type: "text",
3708
- text: JSON.stringify(result, null, 2)
4183
+ text: JSON.stringify({
4184
+ ...result,
4185
+ initiative: {
4186
+ ...result.initiative,
4187
+ description: contentToMarkdown(result.initiative.description)
4188
+ }
4189
+ }, null, 2)
3709
4190
  }
3710
4191
  ]
3711
4192
  };
@@ -3714,14 +4195,7 @@ function registerGetInitiative(server) {
3714
4195
  function registerCreateInitiative(server) {
3715
4196
  server.registerTool("create_initiative", {
3716
4197
  description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
3717
- inputSchema: {
3718
- title: z15.string().describe("Title of the initiative"),
3719
- description: z15.string().optional().describe("Description of the initiative (markdown)"),
3720
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
3721
- dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
3722
- dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3723
- targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
3724
- }
4198
+ inputSchema: createInitiativeInput
3725
4199
  }, async ({
3726
4200
  title,
3727
4201
  description,
@@ -3763,16 +4237,7 @@ function registerCreateInitiative(server) {
3763
4237
  function registerUpdateInitiative(server) {
3764
4238
  server.registerTool("update_initiative", {
3765
4239
  description: "Update an existing initiative.",
3766
- inputSchema: {
3767
- id: z15.string().describe("The UUID of the initiative to update"),
3768
- title: z15.string().optional().describe("New title"),
3769
- description: z15.string().nullable().optional().describe("New description (null to clear)"),
3770
- horizon: horizonSchema.optional().describe("New planning horizon"),
3771
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
3772
- dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
3773
- targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
3774
- order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
3775
- }
4240
+ inputSchema: updateInitiativeInput
3776
4241
  }, async ({
3777
4242
  id,
3778
4243
  title,
@@ -3825,9 +4290,7 @@ function registerUpdateInitiative(server) {
3825
4290
  function registerDeleteInitiative(server) {
3826
4291
  server.registerTool("delete_initiative", {
3827
4292
  description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
3828
- inputSchema: {
3829
- id: z15.string().describe("The UUID of the initiative to delete")
3830
- }
4293
+ inputSchema: deleteInitiativeInput
3831
4294
  }, async ({ id }) => {
3832
4295
  const client2 = getApiClient();
3833
4296
  await client2.deleteInitiative(id);
@@ -3844,12 +4307,7 @@ function registerDeleteInitiative(server) {
3844
4307
  function registerReorderInitiatives(server) {
3845
4308
  server.registerTool("reorder_initiatives", {
3846
4309
  description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
3847
- inputSchema: {
3848
- items: z15.array(z15.object({
3849
- id: z15.string().describe("The UUID of the initiative"),
3850
- order: z15.number().int().min(0).describe("The new order value (0-based)")
3851
- })).describe("Array of initiatives with their new order values")
3852
- }
4310
+ inputSchema: reorderInitiativesInput
3853
4311
  }, async ({ items }) => {
3854
4312
  const client2 = getApiClient();
3855
4313
  await client2.reorderInitiatives(items);
@@ -3866,14 +4324,7 @@ function registerReorderInitiatives(server) {
3866
4324
  function registerSearchExports(server) {
3867
4325
  server.registerTool("search_exports", {
3868
4326
  description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
3869
- inputSchema: {
3870
- roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
3871
- externalSystem: z15.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
3872
- localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
3873
- localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
3874
- limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3875
- offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3876
- }
4327
+ inputSchema: searchExportsInput
3877
4328
  }, async ({
3878
4329
  roadmapId,
3879
4330
  externalSystem,
@@ -3908,9 +4359,7 @@ function registerSearchExports(server) {
3908
4359
  function registerGetExport(server) {
3909
4360
  server.registerTool("get_export", {
3910
4361
  description: "Get full details of a single export record by ID.",
3911
- inputSchema: {
3912
- id: z15.string().uuid().describe("The UUID of the export record")
3913
- }
4362
+ inputSchema: getExportInput
3914
4363
  }, async ({ id }) => {
3915
4364
  const client2 = getApiClient();
3916
4365
  const exportRecord = await client2.getExport(id);
@@ -3927,16 +4376,7 @@ function registerGetExport(server) {
3927
4376
  function registerCreateExport(server) {
3928
4377
  server.registerTool("create_export", {
3929
4378
  description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
3930
- inputSchema: {
3931
- roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
3932
- localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
3933
- localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
3934
- externalSystem: z15.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
3935
- externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
3936
- externalId: z15.string().min(1).describe("ID of the object in the external system"),
3937
- externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
3938
- metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
3939
- }
4379
+ inputSchema: createExportInput
3940
4380
  }, async ({
3941
4381
  roadmapId,
3942
4382
  localEntityType,
@@ -3971,11 +4411,7 @@ function registerCreateExport(server) {
3971
4411
  function registerUpdateExport(server) {
3972
4412
  server.registerTool("update_export", {
3973
4413
  description: "Update an export record. Can update the external URL or metadata.",
3974
- inputSchema: {
3975
- id: z15.string().uuid().describe("The UUID of the export record to update"),
3976
- externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
3977
- metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
3978
- }
4414
+ inputSchema: updateExportInput
3979
4415
  }, async ({
3980
4416
  id,
3981
4417
  externalUrl,
@@ -3996,9 +4432,7 @@ function registerUpdateExport(server) {
3996
4432
  function registerDeleteExport(server) {
3997
4433
  server.registerTool("delete_export", {
3998
4434
  description: "Delete an export record. This is a soft delete.",
3999
- inputSchema: {
4000
- id: z15.string().uuid().describe("The UUID of the export record to delete")
4001
- }
4435
+ inputSchema: deleteExportInput
4002
4436
  }, async ({ id }) => {
4003
4437
  const client2 = getApiClient();
4004
4438
  await client2.deleteExport(id);
@@ -4032,9 +4466,7 @@ function registerListPresentations(server) {
4032
4466
  function registerGetPresentation(server) {
4033
4467
  server.registerTool("get_presentation", {
4034
4468
  description: "Get presentation with variants and slides.",
4035
- inputSchema: {
4036
- id: z15.string().describe("The UUID of the presentation")
4037
- }
4469
+ inputSchema: getPresentationInput
4038
4470
  }, async ({ id }) => {
4039
4471
  const client2 = getApiClient();
4040
4472
  const presentation2 = await client2.getPresentation(id);
@@ -4062,10 +4494,7 @@ function registerGetPresentation(server) {
4062
4494
  function registerCreatePresentation(server) {
4063
4495
  server.registerTool("create_presentation", {
4064
4496
  description: "Create a new presentation.",
4065
- inputSchema: {
4066
- title: z15.string().describe("Title of the presentation"),
4067
- description: z15.string().nullable().optional().describe("Description of the presentation")
4068
- }
4497
+ inputSchema: createPresentationInput
4069
4498
  }, async ({ title, description }) => {
4070
4499
  const client2 = getApiClient();
4071
4500
  const presentation2 = await client2.createPresentation({
@@ -4085,11 +4514,7 @@ function registerCreatePresentation(server) {
4085
4514
  function registerUpdatePresentation(server) {
4086
4515
  server.registerTool("update_presentation", {
4087
4516
  description: "Update an existing presentation.",
4088
- inputSchema: {
4089
- id: z15.string().describe("The UUID of the presentation to update"),
4090
- title: z15.string().optional().describe("New title"),
4091
- description: z15.string().nullable().optional().describe("New description")
4092
- }
4517
+ inputSchema: updatePresentationInput
4093
4518
  }, async ({
4094
4519
  id,
4095
4520
  title,
@@ -4115,9 +4540,7 @@ function registerUpdatePresentation(server) {
4115
4540
  function registerDeletePresentation(server) {
4116
4541
  server.registerTool("delete_presentation", {
4117
4542
  description: "Delete a presentation.",
4118
- inputSchema: {
4119
- id: z15.string().describe("The UUID of the presentation to delete")
4120
- }
4543
+ inputSchema: deletePresentationInput
4121
4544
  }, async ({ id }) => {
4122
4545
  const client2 = getApiClient();
4123
4546
  await client2.deletePresentation(id);
@@ -4134,12 +4557,7 @@ function registerDeletePresentation(server) {
4134
4557
  function registerReorderPresentations(server) {
4135
4558
  server.registerTool("reorder_presentations", {
4136
4559
  description: "Reorder presentations by setting their order values. Lower order values appear first.",
4137
- inputSchema: {
4138
- items: z15.array(z15.object({
4139
- id: z15.string().describe("The UUID of the presentation"),
4140
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4141
- })).describe("Array of presentations with their new order values")
4142
- }
4560
+ inputSchema: reorderPresentationsInput
4143
4561
  }, async ({ items }) => {
4144
4562
  const client2 = getApiClient();
4145
4563
  await client2.reorderPresentations(items);
@@ -4156,9 +4574,7 @@ function registerReorderPresentations(server) {
4156
4574
  function registerListVariants(server) {
4157
4575
  server.registerTool("list_variants", {
4158
4576
  description: "List all variants for a presentation.",
4159
- inputSchema: {
4160
- presentationId: z15.string().describe("The UUID of the presentation")
4161
- }
4577
+ inputSchema: listVariantsInput
4162
4578
  }, async ({ presentationId }) => {
4163
4579
  const client2 = getApiClient();
4164
4580
  const result = await client2.listVariants(presentationId);
@@ -4175,10 +4591,7 @@ function registerListVariants(server) {
4175
4591
  function registerGetVariant(server) {
4176
4592
  server.registerTool("get_variant", {
4177
4593
  description: "Get variant with its slides.",
4178
- inputSchema: {
4179
- presentationId: z15.string().describe("The UUID of the presentation"),
4180
- variantId: z15.string().describe("The UUID of the variant")
4181
- }
4594
+ inputSchema: getVariantInput
4182
4595
  }, async ({ presentationId, variantId }) => {
4183
4596
  const client2 = getApiClient();
4184
4597
  const variant2 = await client2.getVariant(presentationId, variantId);
@@ -4199,11 +4612,7 @@ function registerGetVariant(server) {
4199
4612
  function registerCreateVariant(server) {
4200
4613
  server.registerTool("create_variant", {
4201
4614
  description: "Create a new variant for a presentation.",
4202
- inputSchema: {
4203
- presentationId: z15.string().describe("The UUID of the presentation"),
4204
- name: z15.string().describe("Name of the variant"),
4205
- audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
4206
- }
4615
+ inputSchema: createVariantInput
4207
4616
  }, async ({
4208
4617
  presentationId,
4209
4618
  name,
@@ -4227,12 +4636,7 @@ function registerCreateVariant(server) {
4227
4636
  function registerUpdateVariant(server) {
4228
4637
  server.registerTool("update_variant", {
4229
4638
  description: "Update an existing variant.",
4230
- inputSchema: {
4231
- presentationId: z15.string().describe("The UUID of the presentation"),
4232
- variantId: z15.string().describe("The UUID of the variant to update"),
4233
- name: z15.string().optional().describe("New name"),
4234
- audienceId: z15.string().nullable().optional().describe("New target audience UUID")
4235
- }
4639
+ inputSchema: updateVariantInput
4236
4640
  }, async ({
4237
4641
  presentationId,
4238
4642
  variantId,
@@ -4259,10 +4663,7 @@ function registerUpdateVariant(server) {
4259
4663
  function registerDeleteVariant(server) {
4260
4664
  server.registerTool("delete_variant", {
4261
4665
  description: "Delete a variant.",
4262
- inputSchema: {
4263
- presentationId: z15.string().describe("The UUID of the presentation"),
4264
- variantId: z15.string().describe("The UUID of the variant to delete")
4265
- }
4666
+ inputSchema: deleteVariantInput
4266
4667
  }, async ({ presentationId, variantId }) => {
4267
4668
  const client2 = getApiClient();
4268
4669
  await client2.deleteVariant(presentationId, variantId);
@@ -4279,13 +4680,7 @@ function registerDeleteVariant(server) {
4279
4680
  function registerReorderVariants(server) {
4280
4681
  server.registerTool("reorder_variants", {
4281
4682
  description: "Reorder variants by setting their order values. Lower order values appear first.",
4282
- inputSchema: {
4283
- presentationId: z15.string().describe("The UUID of the presentation"),
4284
- items: z15.array(z15.object({
4285
- id: z15.string().describe("The UUID of the variant"),
4286
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4287
- })).describe("Array of variants with their new order values")
4288
- }
4683
+ inputSchema: reorderVariantsInput
4289
4684
  }, async ({
4290
4685
  presentationId,
4291
4686
  items
@@ -4305,10 +4700,7 @@ function registerReorderVariants(server) {
4305
4700
  function registerCloneVariant(server) {
4306
4701
  server.registerTool("clone_variant", {
4307
4702
  description: "Clone a variant with all its slides.",
4308
- inputSchema: {
4309
- presentationId: z15.string().describe("The UUID of the presentation"),
4310
- variantId: z15.string().describe("The UUID of the variant to clone")
4311
- }
4703
+ inputSchema: cloneVariantInput
4312
4704
  }, async ({ presentationId, variantId }) => {
4313
4705
  const client2 = getApiClient();
4314
4706
  const clonedVariant = await client2.cloneVariant(presentationId, variantId);
@@ -4325,10 +4717,7 @@ function registerCloneVariant(server) {
4325
4717
  function registerSetDefaultVariant(server) {
4326
4718
  server.registerTool("set_default_variant", {
4327
4719
  description: "Set a variant as the default for the presentation.",
4328
- inputSchema: {
4329
- presentationId: z15.string().describe("The UUID of the presentation"),
4330
- variantId: z15.string().describe("The UUID of the variant to set as default")
4331
- }
4720
+ inputSchema: setDefaultVariantInput
4332
4721
  }, async ({ presentationId, variantId }) => {
4333
4722
  const client2 = getApiClient();
4334
4723
  await client2.setDefaultVariant(presentationId, variantId);
@@ -4345,9 +4734,7 @@ function registerSetDefaultVariant(server) {
4345
4734
  function registerListSlides(server) {
4346
4735
  server.registerTool("list_slides", {
4347
4736
  description: "List all slides in a variant.",
4348
- inputSchema: {
4349
- variantId: z15.string().describe("The UUID of the variant")
4350
- }
4737
+ inputSchema: listSlidesInput
4351
4738
  }, async ({ variantId }) => {
4352
4739
  const client2 = getApiClient();
4353
4740
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4375,10 +4762,7 @@ function registerListSlides(server) {
4375
4762
  function registerGetSlide(server) {
4376
4763
  server.registerTool("get_slide", {
4377
4764
  description: "Get a slide by ID.",
4378
- inputSchema: {
4379
- variantId: z15.string().describe("The UUID of the variant"),
4380
- slideId: z15.string().describe("The UUID of the slide")
4381
- }
4765
+ inputSchema: getSlideInput
4382
4766
  }, async ({ variantId, slideId }) => {
4383
4767
  const client2 = getApiClient();
4384
4768
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4406,25 +4790,7 @@ function registerGetSlide(server) {
4406
4790
  function registerCreateSlide(server) {
4407
4791
  server.registerTool("create_slide", {
4408
4792
  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).",
4409
- inputSchema: {
4410
- variantId: z15.string().describe("The UUID of the variant"),
4411
- slideType: z15.enum([
4412
- "title",
4413
- "section_header",
4414
- "bullets",
4415
- "two_column",
4416
- "comparison",
4417
- "timeline",
4418
- "image",
4419
- "quote",
4420
- "code",
4421
- "thank_you",
4422
- "mermaid",
4423
- "paragraph"
4424
- ]).default("bullets").describe("The type of slide to create"),
4425
- 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.'),
4426
- speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
4427
- }
4793
+ inputSchema: createSlideInput
4428
4794
  }, async ({
4429
4795
  variantId,
4430
4796
  slideType,
@@ -4461,13 +4827,7 @@ function registerCreateSlide(server) {
4461
4827
  function registerUpdateSlide(server) {
4462
4828
  server.registerTool("update_slide", {
4463
4829
  description: "Update an existing slide.",
4464
- inputSchema: {
4465
- variantId: z15.string().describe("The UUID of the variant"),
4466
- slideId: z15.string().describe("The UUID of the slide to update"),
4467
- title: z15.string().optional().describe("New title"),
4468
- content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
4469
- speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
4470
- }
4830
+ inputSchema: updateSlideInput
4471
4831
  }, async ({
4472
4832
  variantId,
4473
4833
  slideId,
@@ -4508,10 +4868,7 @@ function registerUpdateSlide(server) {
4508
4868
  function registerDeleteSlide(server) {
4509
4869
  server.registerTool("delete_slide", {
4510
4870
  description: "Delete a slide (soft delete).",
4511
- inputSchema: {
4512
- variantId: z15.string().describe("The UUID of the variant"),
4513
- slideId: z15.string().describe("The UUID of the slide to delete")
4514
- }
4871
+ inputSchema: deleteSlideInput
4515
4872
  }, async ({ variantId, slideId }) => {
4516
4873
  const client2 = getApiClient();
4517
4874
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4539,13 +4896,7 @@ function registerDeleteSlide(server) {
4539
4896
  function registerReorderSlides(server) {
4540
4897
  server.registerTool("reorder_slides", {
4541
4898
  description: "Reorder slides by setting their order values. Lower order values appear first.",
4542
- inputSchema: {
4543
- variantId: z15.string().describe("The UUID of the variant"),
4544
- items: z15.array(z15.object({
4545
- id: z15.string().describe("The UUID of the slide"),
4546
- order: z15.number().int().min(0).describe("The new order value (0-based)")
4547
- })).describe("Array of slides with their new order values")
4548
- }
4899
+ inputSchema: reorderSlidesInput
4549
4900
  }, async ({
4550
4901
  variantId,
4551
4902
  items
@@ -4576,11 +4927,7 @@ function registerReorderSlides(server) {
4576
4927
  function registerUploadSlideImage(server) {
4577
4928
  server.registerTool("upload_slide_image", {
4578
4929
  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".',
4579
- inputSchema: {
4580
- variantId: z15.string().describe("The UUID of the variant"),
4581
- slideId: z15.string().describe("The UUID of the slide to add the image to"),
4582
- filePath: z15.string().describe("Absolute path to the image file on disk")
4583
- }
4930
+ inputSchema: uploadSlideImageInput
4584
4931
  }, async ({
4585
4932
  variantId,
4586
4933
  slideId,
@@ -4652,11 +4999,7 @@ function registerUploadSlideImage(server) {
4652
4999
  function registerCreateFeedbackSession(server) {
4653
5000
  server.registerTool("create_feedback_session", {
4654
5001
  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.",
4655
- inputSchema: {
4656
- prototypeId: z15.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
4657
- name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
4658
- expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
4659
- }
5002
+ inputSchema: createFeedbackSessionInput
4660
5003
  }, async ({
4661
5004
  prototypeId,
4662
5005
  name,
@@ -4703,9 +5046,7 @@ function registerCreateFeedbackSession(server) {
4703
5046
  function registerListFeedbackSessions(server) {
4704
5047
  server.registerTool("list_feedback_sessions", {
4705
5048
  description: "List all feedback sessions for a prototype with comment counts and status.",
4706
- inputSchema: {
4707
- prototypeId: z15.string().uuid().describe("The UUID of the prototype")
4708
- }
5049
+ inputSchema: listFeedbackSessionsInput
4709
5050
  }, async ({ prototypeId }) => {
4710
5051
  const client2 = getApiClient();
4711
5052
  const sessions = await client2.listFeedbackSessions(prototypeId);
@@ -4754,11 +5095,7 @@ function formatCommentLine(c) {
4754
5095
  function registerGetFeedbackSummary(server) {
4755
5096
  server.registerTool("get_feedback_summary", {
4756
5097
  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.",
4757
- inputSchema: {
4758
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4759
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4760
- filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
4761
- }
5098
+ inputSchema: getFeedbackSummaryInput
4762
5099
  }, async ({
4763
5100
  prototypeId,
4764
5101
  sessionId,
@@ -4797,12 +5134,7 @@ function registerGetFeedbackSummary(server) {
4797
5134
  function registerGetFeedbackDetail(server) {
4798
5135
  server.registerTool("get_feedback_detail", {
4799
5136
  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.",
4800
- inputSchema: {
4801
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4802
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4803
- commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
4804
- filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
4805
- }
5137
+ inputSchema: getFeedbackDetailInput
4806
5138
  }, async ({
4807
5139
  prototypeId,
4808
5140
  sessionId,
@@ -4846,11 +5178,7 @@ function registerGetFeedbackDetail(server) {
4846
5178
  function registerResolveFeedbackComment(server) {
4847
5179
  server.registerTool("resolve_feedback_comment", {
4848
5180
  description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
4849
- inputSchema: {
4850
- prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
4851
- sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
4852
- commentId: z15.string().uuid().describe("The UUID of the comment to resolve/unresolve")
4853
- }
5181
+ inputSchema: resolveFeedbackCommentInput
4854
5182
  }, async ({
4855
5183
  prototypeId,
4856
5184
  sessionId,