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