@ourroadmaps/mcp 0.28.1 → 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 +980 -710
- 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()
|
|
259
494
|
});
|
|
260
|
-
var
|
|
261
|
-
|
|
262
|
-
description: z8.string().nullable().optional()
|
|
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(),
|
|
263
506
|
type: productTypeSchema,
|
|
264
|
-
|
|
507
|
+
name: z9.string(),
|
|
508
|
+
order: z9.number().int(),
|
|
509
|
+
isExpanded: z9.boolean(),
|
|
510
|
+
deletedAt: z9.string().nullable(),
|
|
511
|
+
createdAt: z9.string()
|
|
512
|
+
});
|
|
513
|
+
var createProductSchema = z9.object({
|
|
514
|
+
name: z9.string().min(1),
|
|
515
|
+
description: z9.string().nullable().optional(),
|
|
516
|
+
type: productTypeSchema,
|
|
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({
|
|
656
889
|
id: z14.string().uuid(),
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
890
|
+
roadmapItemId: z14.string().uuid(),
|
|
891
|
+
titleAtSnapshot: z14.string(),
|
|
892
|
+
statusAtSnapshot: z14.string(),
|
|
893
|
+
designWalkthroughUrl: z14.string().nullable(),
|
|
894
|
+
releaseWalkthroughUrl: z14.string().nullable()
|
|
895
|
+
});
|
|
896
|
+
var statusUpdateSchema = z14.object({
|
|
897
|
+
id: z14.string().uuid(),
|
|
898
|
+
title: z14.string().nullable(),
|
|
899
|
+
startDate: z14.string(),
|
|
900
|
+
endDate: z14.string(),
|
|
901
|
+
content: z14.string(),
|
|
662
902
|
createdAt: z14.string(),
|
|
663
|
-
|
|
664
|
-
|
|
903
|
+
items: z14.array(statusUpdateItemSchema).optional()
|
|
904
|
+
});
|
|
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()
|
|
665
918
|
});
|
|
666
|
-
var createVariantSchema =
|
|
667
|
-
name:
|
|
668
|
-
audienceId:
|
|
919
|
+
var createVariantSchema = z15.object({
|
|
920
|
+
name: z15.string().min(1),
|
|
921
|
+
audienceId: z15.string().uuid().nullable().optional()
|
|
669
922
|
});
|
|
670
|
-
var updateVariantSchema =
|
|
671
|
-
name:
|
|
672
|
-
audienceId:
|
|
923
|
+
var updateVariantSchema = z15.object({
|
|
924
|
+
name: z15.string().min(1).optional(),
|
|
925
|
+
audienceId: z15.string().uuid().nullable().optional()
|
|
673
926
|
});
|
|
674
|
-
var variantListSchema =
|
|
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() {
|
|
@@ -1499,13 +1752,13 @@ function registerSearchRoadmaps(server) {
|
|
|
1499
1752
|
server.registerTool("search_roadmaps", {
|
|
1500
1753
|
description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
|
|
1501
1754
|
inputSchema: {
|
|
1502
|
-
query:
|
|
1755
|
+
query: z16.string().optional().describe("Search query to match against title or description"),
|
|
1503
1756
|
status: roadmapStatusSchema.optional().describe("Filter by status"),
|
|
1504
1757
|
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
1505
|
-
phase:
|
|
1506
|
-
phaseStep:
|
|
1507
|
-
limit:
|
|
1508
|
-
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)")
|
|
1509
1762
|
}
|
|
1510
1763
|
}, async ({
|
|
1511
1764
|
query,
|
|
@@ -1556,7 +1809,7 @@ function registerGetRoadmap(server) {
|
|
|
1556
1809
|
server.registerTool("get_roadmap", {
|
|
1557
1810
|
description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
|
|
1558
1811
|
inputSchema: {
|
|
1559
|
-
id:
|
|
1812
|
+
id: z16.string().describe("The UUID of the roadmap item")
|
|
1560
1813
|
}
|
|
1561
1814
|
}, async ({ id }) => {
|
|
1562
1815
|
const client2 = getApiClient();
|
|
@@ -1573,8 +1826,16 @@ function registerGetRoadmap(server) {
|
|
|
1573
1826
|
value: roadmap2.value,
|
|
1574
1827
|
effort: roadmap2.effort,
|
|
1575
1828
|
order: roadmap2.order,
|
|
1576
|
-
prd: roadmap2.prd
|
|
1577
|
-
|
|
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),
|
|
1578
1839
|
wireframes: roadmap2.wireframes?.map((w) => ({
|
|
1579
1840
|
id: w.id,
|
|
1580
1841
|
imageUrl: w.imageUrl,
|
|
@@ -1594,10 +1855,10 @@ function registerGetRoadmap(server) {
|
|
|
1594
1855
|
})),
|
|
1595
1856
|
epics: roadmap2.epics,
|
|
1596
1857
|
stories: roadmap2.stories,
|
|
1597
|
-
designDescription: roadmap2.design?.description
|
|
1598
|
-
planDescription: roadmap2.plan?.description
|
|
1599
|
-
buildDescription: roadmap2.build?.description
|
|
1600
|
-
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),
|
|
1601
1862
|
prompt: roadmap2.build?.prompt ?? roadmap2.prompt ?? null,
|
|
1602
1863
|
createdAt: roadmap2.createdAt
|
|
1603
1864
|
}, null, 2)
|
|
@@ -1610,7 +1871,7 @@ function registerSearchFeatures(server) {
|
|
|
1610
1871
|
server.registerTool("search_features", {
|
|
1611
1872
|
description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
|
|
1612
1873
|
inputSchema: {
|
|
1613
|
-
query:
|
|
1874
|
+
query: z16.string().optional().describe("Search query to match against name"),
|
|
1614
1875
|
type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
|
|
1615
1876
|
}
|
|
1616
1877
|
}, async ({ query, type }) => {
|
|
@@ -1642,7 +1903,7 @@ function registerGetFeature(server) {
|
|
|
1642
1903
|
server.registerTool("get_feature", {
|
|
1643
1904
|
description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
|
|
1644
1905
|
inputSchema: {
|
|
1645
|
-
id:
|
|
1906
|
+
id: z16.string().describe("The UUID of the feature")
|
|
1646
1907
|
}
|
|
1647
1908
|
}, async ({ id }) => {
|
|
1648
1909
|
const client2 = getApiClient();
|
|
@@ -1658,7 +1919,7 @@ function registerGetFeature(server) {
|
|
|
1658
1919
|
parentId: feature2.parentId,
|
|
1659
1920
|
outcomes: feature2.outcomes?.map((o) => ({
|
|
1660
1921
|
id: o.id,
|
|
1661
|
-
description: o.description
|
|
1922
|
+
description: contentToMarkdown(o.description)
|
|
1662
1923
|
})),
|
|
1663
1924
|
children: feature2.children?.map((c) => ({
|
|
1664
1925
|
id: c.id,
|
|
@@ -1681,7 +1942,7 @@ function registerSearchIdeas(server) {
|
|
|
1681
1942
|
server.registerTool("search_ideas", {
|
|
1682
1943
|
description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
|
|
1683
1944
|
inputSchema: {
|
|
1684
|
-
query:
|
|
1945
|
+
query: z16.string().optional().describe("Search query to match against title or description"),
|
|
1685
1946
|
status: ideaStatusSchema.optional().describe("Filter by status")
|
|
1686
1947
|
}
|
|
1687
1948
|
}, async ({ query, status }) => {
|
|
@@ -1701,7 +1962,7 @@ function registerSearchIdeas(server) {
|
|
|
1701
1962
|
text: JSON.stringify(ideas.map((i) => ({
|
|
1702
1963
|
id: i.id,
|
|
1703
1964
|
title: i.title,
|
|
1704
|
-
description: i.description,
|
|
1965
|
+
description: contentToMarkdown(i.description),
|
|
1705
1966
|
status: i.status,
|
|
1706
1967
|
source: i.source
|
|
1707
1968
|
})), null, 2)
|
|
@@ -1738,8 +1999,8 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
|
|
|
1738
1999
|
type: "text",
|
|
1739
2000
|
text: JSON.stringify({
|
|
1740
2001
|
strategy: {
|
|
1741
|
-
vision: strategy.vision,
|
|
1742
|
-
mission: strategy.mission
|
|
2002
|
+
vision: contentToMarkdown(strategy.vision),
|
|
2003
|
+
mission: contentToMarkdown(strategy.mission)
|
|
1743
2004
|
},
|
|
1744
2005
|
products: products.map((p) => ({
|
|
1745
2006
|
id: p.id,
|
|
@@ -1781,9 +2042,9 @@ function registerCaptureIdea(server) {
|
|
|
1781
2042
|
server.registerTool("capture_idea", {
|
|
1782
2043
|
description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
|
|
1783
2044
|
inputSchema: {
|
|
1784
|
-
title:
|
|
1785
|
-
description:
|
|
1786
|
-
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")')
|
|
1787
2048
|
}
|
|
1788
2049
|
}, async ({
|
|
1789
2050
|
title,
|
|
@@ -1820,16 +2081,16 @@ function registerCreateRoadmapItem(server) {
|
|
|
1820
2081
|
server.registerTool("create_roadmap_item", {
|
|
1821
2082
|
description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
|
|
1822
2083
|
inputSchema: {
|
|
1823
|
-
title:
|
|
2084
|
+
title: z16.string().describe("Title of the roadmap item"),
|
|
1824
2085
|
status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
|
|
1825
2086
|
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
1826
|
-
phase:
|
|
1827
|
-
phaseStep:
|
|
1828
|
-
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"),
|
|
1829
2090
|
dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1830
|
-
dateValue:
|
|
2091
|
+
dateValue: z16.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1831
2092
|
targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1832
|
-
targetValue:
|
|
2093
|
+
targetValue: z16.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
1833
2094
|
}
|
|
1834
2095
|
}, async ({
|
|
1835
2096
|
title,
|
|
@@ -1891,30 +2152,30 @@ function registerCreateRoadmapItem(server) {
|
|
|
1891
2152
|
};
|
|
1892
2153
|
});
|
|
1893
2154
|
}
|
|
1894
|
-
var effortSizeSchema =
|
|
2155
|
+
var effortSizeSchema = z16.enum(["xs", "s", "m", "l", "xl"]);
|
|
1895
2156
|
function registerUpdateRoadmapItem(server) {
|
|
1896
2157
|
server.registerTool("update_roadmap_item", {
|
|
1897
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.",
|
|
1898
2159
|
inputSchema: {
|
|
1899
|
-
id:
|
|
1900
|
-
title:
|
|
2160
|
+
id: z16.string().describe("The UUID of the roadmap item to update"),
|
|
2161
|
+
title: z16.string().optional().describe("New title"),
|
|
1901
2162
|
status: roadmapStatusSchema.optional().describe("New status"),
|
|
1902
2163
|
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
1903
|
-
phase:
|
|
1904
|
-
phaseStep:
|
|
1905
|
-
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)"),
|
|
1906
2167
|
effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
|
|
1907
|
-
order:
|
|
1908
|
-
initiativeId:
|
|
1909
|
-
designDescription:
|
|
1910
|
-
planDescription:
|
|
1911
|
-
buildDescription:
|
|
1912
|
-
releaseDescription:
|
|
1913
|
-
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"),
|
|
1914
2175
|
dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1915
|
-
dateValue:
|
|
2176
|
+
dateValue: z16.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1916
2177
|
targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1917
|
-
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)')
|
|
1918
2179
|
}
|
|
1919
2180
|
}, async ({
|
|
1920
2181
|
id,
|
|
@@ -2025,12 +2286,12 @@ function registerAddFeature(server) {
|
|
|
2025
2286
|
server.registerTool("add_feature", {
|
|
2026
2287
|
description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
|
|
2027
2288
|
inputSchema: {
|
|
2028
|
-
name:
|
|
2029
|
-
description:
|
|
2289
|
+
name: z16.string().describe("Name of the feature"),
|
|
2290
|
+
description: z16.string().optional().describe("Description of the feature"),
|
|
2030
2291
|
type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
|
|
2031
|
-
parentId:
|
|
2032
|
-
outcomes:
|
|
2033
|
-
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")
|
|
2034
2295
|
}
|
|
2035
2296
|
}, async ({
|
|
2036
2297
|
name,
|
|
@@ -2077,10 +2338,10 @@ function registerSavePrd(server) {
|
|
|
2077
2338
|
server.registerTool("save_prd", {
|
|
2078
2339
|
description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
|
|
2079
2340
|
inputSchema: {
|
|
2080
|
-
roadmapId:
|
|
2081
|
-
what:
|
|
2082
|
-
why:
|
|
2083
|
-
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")
|
|
2084
2345
|
}
|
|
2085
2346
|
}, async ({
|
|
2086
2347
|
roadmapId,
|
|
@@ -2118,8 +2379,8 @@ function registerUpdateBrainstormNotes(server) {
|
|
|
2118
2379
|
server.registerTool("update_brainstorm_notes", {
|
|
2119
2380
|
description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
|
|
2120
2381
|
inputSchema: {
|
|
2121
|
-
roadmapId:
|
|
2122
|
-
notes:
|
|
2382
|
+
roadmapId: z16.string().describe("The UUID of the roadmap item"),
|
|
2383
|
+
notes: z16.string().describe("The brainstorm notes content")
|
|
2123
2384
|
}
|
|
2124
2385
|
}, async ({ roadmapId, notes }) => {
|
|
2125
2386
|
const client2 = getApiClient();
|
|
@@ -2148,7 +2409,7 @@ function registerDeleteRoadmapItem(server) {
|
|
|
2148
2409
|
server.registerTool("delete_roadmap_item", {
|
|
2149
2410
|
description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
|
|
2150
2411
|
inputSchema: {
|
|
2151
|
-
id:
|
|
2412
|
+
id: z16.string().describe("The UUID of the roadmap item to delete")
|
|
2152
2413
|
}
|
|
2153
2414
|
}, async ({ id }) => {
|
|
2154
2415
|
const client2 = getApiClient();
|
|
@@ -2170,9 +2431,9 @@ function registerReorderRoadmaps(server) {
|
|
|
2170
2431
|
server.registerTool("reorder_roadmaps", {
|
|
2171
2432
|
description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
|
|
2172
2433
|
inputSchema: {
|
|
2173
|
-
items:
|
|
2174
|
-
id:
|
|
2175
|
-
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)")
|
|
2176
2437
|
})).describe("Array of roadmap items with their new order values")
|
|
2177
2438
|
}
|
|
2178
2439
|
}, async ({ items }) => {
|
|
@@ -2196,10 +2457,10 @@ function registerUpdateFeature(server) {
|
|
|
2196
2457
|
server.registerTool("update_feature", {
|
|
2197
2458
|
description: "Update an existing feature. Can update name, type, or parent.",
|
|
2198
2459
|
inputSchema: {
|
|
2199
|
-
id:
|
|
2200
|
-
name:
|
|
2460
|
+
id: z16.string().describe("The UUID of the feature to update"),
|
|
2461
|
+
name: z16.string().optional().describe("New name for the feature"),
|
|
2201
2462
|
type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
|
|
2202
|
-
parentId:
|
|
2463
|
+
parentId: z16.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
|
|
2203
2464
|
}
|
|
2204
2465
|
}, async ({
|
|
2205
2466
|
id,
|
|
@@ -2238,7 +2499,7 @@ function registerDeleteFeature(server) {
|
|
|
2238
2499
|
server.registerTool("delete_feature", {
|
|
2239
2500
|
description: "Delete a feature. This is a soft delete that also deletes all child features.",
|
|
2240
2501
|
inputSchema: {
|
|
2241
|
-
id:
|
|
2502
|
+
id: z16.string().describe("The UUID of the feature to delete")
|
|
2242
2503
|
}
|
|
2243
2504
|
}, async ({ id }) => {
|
|
2244
2505
|
const client2 = getApiClient();
|
|
@@ -2260,7 +2521,7 @@ function registerGetIdea(server) {
|
|
|
2260
2521
|
server.registerTool("get_idea", {
|
|
2261
2522
|
description: "Get full details of a single idea by ID.",
|
|
2262
2523
|
inputSchema: {
|
|
2263
|
-
id:
|
|
2524
|
+
id: z16.string().describe("The UUID of the idea")
|
|
2264
2525
|
}
|
|
2265
2526
|
}, async ({ id }) => {
|
|
2266
2527
|
const client2 = getApiClient();
|
|
@@ -2272,7 +2533,7 @@ function registerGetIdea(server) {
|
|
|
2272
2533
|
text: JSON.stringify({
|
|
2273
2534
|
id: idea2.id,
|
|
2274
2535
|
title: idea2.title,
|
|
2275
|
-
description: idea2.description,
|
|
2536
|
+
description: contentToMarkdown(idea2.description),
|
|
2276
2537
|
status: idea2.status,
|
|
2277
2538
|
source: idea2.source,
|
|
2278
2539
|
submittedBy: idea2.submittedBy,
|
|
@@ -2289,12 +2550,12 @@ function registerUpdateIdea(server) {
|
|
|
2289
2550
|
server.registerTool("update_idea", {
|
|
2290
2551
|
description: "Update an existing idea. Can update title, description, status, value, or effort.",
|
|
2291
2552
|
inputSchema: {
|
|
2292
|
-
id:
|
|
2293
|
-
title:
|
|
2294
|
-
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"),
|
|
2295
2556
|
status: ideaStatusSchema.optional().describe("New status"),
|
|
2296
|
-
value:
|
|
2297
|
-
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")
|
|
2298
2559
|
}
|
|
2299
2560
|
}, async ({
|
|
2300
2561
|
id,
|
|
@@ -2341,7 +2602,7 @@ function registerDeleteIdea(server) {
|
|
|
2341
2602
|
server.registerTool("delete_idea", {
|
|
2342
2603
|
description: "Delete an idea. This is a soft delete.",
|
|
2343
2604
|
inputSchema: {
|
|
2344
|
-
id:
|
|
2605
|
+
id: z16.string().describe("The UUID of the idea to delete")
|
|
2345
2606
|
}
|
|
2346
2607
|
}, async ({ id }) => {
|
|
2347
2608
|
const client2 = getApiClient();
|
|
@@ -2370,7 +2631,10 @@ function registerGetStrategy(server) {
|
|
|
2370
2631
|
content: [
|
|
2371
2632
|
{
|
|
2372
2633
|
type: "text",
|
|
2373
|
-
text: JSON.stringify(
|
|
2634
|
+
text: JSON.stringify({
|
|
2635
|
+
vision: contentToMarkdown(strategy.vision),
|
|
2636
|
+
mission: contentToMarkdown(strategy.mission)
|
|
2637
|
+
}, null, 2)
|
|
2374
2638
|
}
|
|
2375
2639
|
]
|
|
2376
2640
|
};
|
|
@@ -2380,8 +2644,8 @@ function registerUpdateStrategy(server) {
|
|
|
2380
2644
|
server.registerTool("update_strategy", {
|
|
2381
2645
|
description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
|
|
2382
2646
|
inputSchema: {
|
|
2383
|
-
vision:
|
|
2384
|
-
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")
|
|
2385
2649
|
}
|
|
2386
2650
|
}, async ({ vision, mission }) => {
|
|
2387
2651
|
const client2 = getApiClient();
|
|
@@ -2429,8 +2693,8 @@ function registerCreateScenario(server) {
|
|
|
2429
2693
|
server.registerTool("create_scenario", {
|
|
2430
2694
|
description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
|
|
2431
2695
|
inputSchema: {
|
|
2432
|
-
title:
|
|
2433
|
-
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")
|
|
2434
2698
|
}
|
|
2435
2699
|
}, async ({ title, description }) => {
|
|
2436
2700
|
const client2 = getApiClient();
|
|
@@ -2459,9 +2723,9 @@ function registerUpdateScenario(server) {
|
|
|
2459
2723
|
server.registerTool("update_scenario", {
|
|
2460
2724
|
description: "Update an existing scenario.",
|
|
2461
2725
|
inputSchema: {
|
|
2462
|
-
id:
|
|
2463
|
-
title:
|
|
2464
|
-
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")
|
|
2465
2729
|
}
|
|
2466
2730
|
}, async ({
|
|
2467
2731
|
id,
|
|
@@ -2496,7 +2760,7 @@ function registerDeleteScenario(server) {
|
|
|
2496
2760
|
server.registerTool("delete_scenario", {
|
|
2497
2761
|
description: "Delete a scenario. This is a soft delete.",
|
|
2498
2762
|
inputSchema: {
|
|
2499
|
-
id:
|
|
2763
|
+
id: z16.string().describe("The UUID of the scenario to delete")
|
|
2500
2764
|
}
|
|
2501
2765
|
}, async ({ id }) => {
|
|
2502
2766
|
const client2 = getApiClient();
|
|
@@ -2511,7 +2775,7 @@ function registerDeleteScenario(server) {
|
|
|
2511
2775
|
};
|
|
2512
2776
|
});
|
|
2513
2777
|
}
|
|
2514
|
-
var productTypeSchema2 =
|
|
2778
|
+
var productTypeSchema2 = z16.enum([
|
|
2515
2779
|
"brand",
|
|
2516
2780
|
"product",
|
|
2517
2781
|
"app",
|
|
@@ -2524,8 +2788,8 @@ function registerCreateProduct(server) {
|
|
|
2524
2788
|
description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
|
|
2525
2789
|
inputSchema: {
|
|
2526
2790
|
type: productTypeSchema2.describe("Type of product"),
|
|
2527
|
-
name:
|
|
2528
|
-
parentId:
|
|
2791
|
+
name: z16.string().describe("Name of the product"),
|
|
2792
|
+
parentId: z16.string().nullable().optional().describe("UUID of parent product to nest under")
|
|
2529
2793
|
}
|
|
2530
2794
|
}, async ({
|
|
2531
2795
|
type,
|
|
@@ -2560,9 +2824,9 @@ function registerUpdateProduct(server) {
|
|
|
2560
2824
|
server.registerTool("update_product", {
|
|
2561
2825
|
description: "Update an existing product.",
|
|
2562
2826
|
inputSchema: {
|
|
2563
|
-
id:
|
|
2564
|
-
name:
|
|
2565
|
-
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")
|
|
2566
2830
|
}
|
|
2567
2831
|
}, async ({ id, name, parentId }) => {
|
|
2568
2832
|
const client2 = getApiClient();
|
|
@@ -2594,7 +2858,7 @@ function registerDeleteProduct(server) {
|
|
|
2594
2858
|
server.registerTool("delete_product", {
|
|
2595
2859
|
description: "Delete a product. This is a soft delete that also deletes all child products.",
|
|
2596
2860
|
inputSchema: {
|
|
2597
|
-
id:
|
|
2861
|
+
id: z16.string().describe("The UUID of the product to delete")
|
|
2598
2862
|
}
|
|
2599
2863
|
}, async ({ id }) => {
|
|
2600
2864
|
const client2 = getApiClient();
|
|
@@ -2617,7 +2881,7 @@ function registerGetProduct(server) {
|
|
|
2617
2881
|
server.registerTool("get_product", {
|
|
2618
2882
|
description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
|
|
2619
2883
|
inputSchema: {
|
|
2620
|
-
id:
|
|
2884
|
+
id: z16.string().describe("The UUID of the product")
|
|
2621
2885
|
}
|
|
2622
2886
|
}, async ({ id }) => {
|
|
2623
2887
|
const client2 = getApiClient();
|
|
@@ -2640,8 +2904,8 @@ function registerGetProduct(server) {
|
|
|
2640
2904
|
createdAt: product2.createdAt
|
|
2641
2905
|
},
|
|
2642
2906
|
documentation: documentation ? {
|
|
2643
|
-
designSystem: documentation.designSystem,
|
|
2644
|
-
adrs: documentation.adrs,
|
|
2907
|
+
designSystem: contentToMarkdown(documentation.designSystem),
|
|
2908
|
+
adrs: contentToMarkdown(documentation.adrs),
|
|
2645
2909
|
updatedAt: documentation.updatedAt
|
|
2646
2910
|
} : null
|
|
2647
2911
|
}, null, 2)
|
|
@@ -2654,7 +2918,7 @@ function registerSearchProducts(server) {
|
|
|
2654
2918
|
server.registerTool("search_products", {
|
|
2655
2919
|
description: "Search for products by name. Returns a list of matching products with basic info.",
|
|
2656
2920
|
inputSchema: {
|
|
2657
|
-
query:
|
|
2921
|
+
query: z16.string().optional().describe("Search query to match against product name"),
|
|
2658
2922
|
type: productTypeSchema2.optional().describe("Filter by product type")
|
|
2659
2923
|
}
|
|
2660
2924
|
}, async ({ query, type }) => {
|
|
@@ -2689,7 +2953,7 @@ function registerGetProductDocumentation(server) {
|
|
|
2689
2953
|
server.registerTool("get_product_documentation", {
|
|
2690
2954
|
description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
|
|
2691
2955
|
inputSchema: {
|
|
2692
|
-
productId:
|
|
2956
|
+
productId: z16.string().describe("The UUID of the product")
|
|
2693
2957
|
}
|
|
2694
2958
|
}, async ({ productId }) => {
|
|
2695
2959
|
const client2 = getApiClient();
|
|
@@ -2702,8 +2966,8 @@ function registerGetProductDocumentation(server) {
|
|
|
2702
2966
|
productId,
|
|
2703
2967
|
documentation: documentation ? {
|
|
2704
2968
|
id: documentation.id,
|
|
2705
|
-
designSystem: documentation.designSystem,
|
|
2706
|
-
adrs: documentation.adrs,
|
|
2969
|
+
designSystem: contentToMarkdown(documentation.designSystem),
|
|
2970
|
+
adrs: contentToMarkdown(documentation.adrs),
|
|
2707
2971
|
createdAt: documentation.createdAt,
|
|
2708
2972
|
updatedAt: documentation.updatedAt
|
|
2709
2973
|
} : null
|
|
@@ -2717,9 +2981,9 @@ function registerUpdateProductDocumentation(server) {
|
|
|
2717
2981
|
server.registerTool("update_product_documentation", {
|
|
2718
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.",
|
|
2719
2983
|
inputSchema: {
|
|
2720
|
-
productId:
|
|
2721
|
-
designSystem:
|
|
2722
|
-
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.")
|
|
2723
2987
|
}
|
|
2724
2988
|
}, async ({
|
|
2725
2989
|
productId,
|
|
@@ -2756,8 +3020,8 @@ function registerCreateAudience(server) {
|
|
|
2756
3020
|
server.registerTool("create_audience", {
|
|
2757
3021
|
description: "Create a new audience member. Audiences represent who the product serves.",
|
|
2758
3022
|
inputSchema: {
|
|
2759
|
-
name:
|
|
2760
|
-
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")
|
|
2761
3025
|
}
|
|
2762
3026
|
}, async ({ name, description }) => {
|
|
2763
3027
|
const client2 = getApiClient();
|
|
@@ -2786,9 +3050,9 @@ function registerUpdateAudience(server) {
|
|
|
2786
3050
|
server.registerTool("update_audience", {
|
|
2787
3051
|
description: "Update an existing audience member.",
|
|
2788
3052
|
inputSchema: {
|
|
2789
|
-
id:
|
|
2790
|
-
name:
|
|
2791
|
-
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")
|
|
2792
3056
|
}
|
|
2793
3057
|
}, async ({
|
|
2794
3058
|
id,
|
|
@@ -2823,7 +3087,7 @@ function registerDeleteAudience(server) {
|
|
|
2823
3087
|
server.registerTool("delete_audience", {
|
|
2824
3088
|
description: "Delete an audience member. This is a soft delete.",
|
|
2825
3089
|
inputSchema: {
|
|
2826
|
-
id:
|
|
3090
|
+
id: z16.string().describe("The UUID of the audience to delete")
|
|
2827
3091
|
}
|
|
2828
3092
|
}, async ({ id }) => {
|
|
2829
3093
|
const client2 = getApiClient();
|
|
@@ -2865,9 +3129,9 @@ function registerGetHistory(server) {
|
|
|
2865
3129
|
server.registerTool("get_history", {
|
|
2866
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.",
|
|
2867
3131
|
inputSchema: {
|
|
2868
|
-
startDate:
|
|
2869
|
-
endDate:
|
|
2870
|
-
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([
|
|
2871
3135
|
"roadmap",
|
|
2872
3136
|
"feature",
|
|
2873
3137
|
"idea",
|
|
@@ -2899,8 +3163,8 @@ function registerGetHistorySummary(server) {
|
|
|
2899
3163
|
server.registerTool("get_history_summary", {
|
|
2900
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.",
|
|
2901
3165
|
inputSchema: {
|
|
2902
|
-
startDate:
|
|
2903
|
-
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")
|
|
2904
3168
|
}
|
|
2905
3169
|
}, async ({ startDate, endDate }) => {
|
|
2906
3170
|
const client2 = getApiClient();
|
|
@@ -2919,13 +3183,13 @@ function registerCreateStatusUpdate(server) {
|
|
|
2919
3183
|
server.registerTool("create_status_update", {
|
|
2920
3184
|
description: "Create a new status report. Use this after generating the report content from history events.",
|
|
2921
3185
|
inputSchema: {
|
|
2922
|
-
startDate:
|
|
2923
|
-
endDate:
|
|
2924
|
-
content:
|
|
2925
|
-
title:
|
|
2926
|
-
items:
|
|
2927
|
-
roadmapItemId:
|
|
2928
|
-
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")
|
|
2929
3193
|
})).optional().describe("Roadmap items to include in the report snapshot")
|
|
2930
3194
|
}
|
|
2931
3195
|
}, async ({
|
|
@@ -2966,18 +3230,18 @@ function registerSaveStories(server) {
|
|
|
2966
3230
|
server.registerTool("save_stories", {
|
|
2967
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.",
|
|
2968
3232
|
inputSchema: {
|
|
2969
|
-
roadmapId:
|
|
2970
|
-
epics:
|
|
2971
|
-
title:
|
|
2972
|
-
description:
|
|
2973
|
-
stories:
|
|
2974
|
-
title:
|
|
2975
|
-
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")
|
|
2976
3240
|
})).optional().describe("Stories within this epic")
|
|
2977
3241
|
})).optional().describe("List of epics with their nested stories"),
|
|
2978
|
-
stories:
|
|
2979
|
-
title:
|
|
2980
|
-
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")
|
|
2981
3245
|
})).optional().describe("List of standalone stories (not part of any epic)")
|
|
2982
3246
|
}
|
|
2983
3247
|
}, async ({
|
|
@@ -3009,10 +3273,10 @@ function registerUploadWireframe(server) {
|
|
|
3009
3273
|
server.registerTool("upload_wireframe", {
|
|
3010
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.",
|
|
3011
3275
|
inputSchema: {
|
|
3012
|
-
roadmapId:
|
|
3013
|
-
filePath:
|
|
3014
|
-
description:
|
|
3015
|
-
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")
|
|
3016
3280
|
}
|
|
3017
3281
|
}, async ({
|
|
3018
3282
|
roadmapId,
|
|
@@ -3066,9 +3330,9 @@ function registerUpdateWireframe(server) {
|
|
|
3066
3330
|
server.registerTool("update_wireframe", {
|
|
3067
3331
|
description: "Update a wireframe's description or outcome tags.",
|
|
3068
3332
|
inputSchema: {
|
|
3069
|
-
id:
|
|
3070
|
-
description:
|
|
3071
|
-
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)")
|
|
3072
3336
|
}
|
|
3073
3337
|
}, async ({
|
|
3074
3338
|
id,
|
|
@@ -3104,7 +3368,7 @@ function registerDeleteWireframe(server) {
|
|
|
3104
3368
|
server.registerTool("delete_wireframe", {
|
|
3105
3369
|
description: "Delete a wireframe (soft delete).",
|
|
3106
3370
|
inputSchema: {
|
|
3107
|
-
id:
|
|
3371
|
+
id: z16.string().describe("The UUID of the wireframe to delete")
|
|
3108
3372
|
}
|
|
3109
3373
|
}, async ({ id }) => {
|
|
3110
3374
|
const client2 = getApiClient();
|
|
@@ -3123,9 +3387,9 @@ function registerUploadBrainstormMedia(server) {
|
|
|
3123
3387
|
server.registerTool("upload_brainstorm_media", {
|
|
3124
3388
|
description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
|
|
3125
3389
|
inputSchema: {
|
|
3126
|
-
roadmapId:
|
|
3127
|
-
filePath:
|
|
3128
|
-
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")
|
|
3129
3393
|
}
|
|
3130
3394
|
}, async ({
|
|
3131
3395
|
roadmapId,
|
|
@@ -3177,8 +3441,8 @@ function registerUpdateBrainstormMedia(server) {
|
|
|
3177
3441
|
server.registerTool("update_brainstorm_media", {
|
|
3178
3442
|
description: "Update a brainstorm media item's description.",
|
|
3179
3443
|
inputSchema: {
|
|
3180
|
-
id:
|
|
3181
|
-
description:
|
|
3444
|
+
id: z16.string().describe("The UUID of the brainstorm media"),
|
|
3445
|
+
description: z16.string().nullable().describe("New description for the media")
|
|
3182
3446
|
}
|
|
3183
3447
|
}, async ({ id, description }) => {
|
|
3184
3448
|
const client2 = getApiClient();
|
|
@@ -3202,7 +3466,7 @@ function registerDeleteBrainstormMedia(server) {
|
|
|
3202
3466
|
server.registerTool("delete_brainstorm_media", {
|
|
3203
3467
|
description: "Delete a brainstorm media item (soft delete).",
|
|
3204
3468
|
inputSchema: {
|
|
3205
|
-
id:
|
|
3469
|
+
id: z16.string().describe("The UUID of the brainstorm media to delete")
|
|
3206
3470
|
}
|
|
3207
3471
|
}, async ({ id }) => {
|
|
3208
3472
|
const client2 = getApiClient();
|
|
@@ -3221,9 +3485,9 @@ function registerUploadProductDesignMedia(server) {
|
|
|
3221
3485
|
server.registerTool("upload_product_design_media", {
|
|
3222
3486
|
description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
|
|
3223
3487
|
inputSchema: {
|
|
3224
|
-
productId:
|
|
3225
|
-
filePath:
|
|
3226
|
-
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")
|
|
3227
3491
|
}
|
|
3228
3492
|
}, async ({
|
|
3229
3493
|
productId,
|
|
@@ -3276,9 +3540,9 @@ function registerUpdateProductDesignMedia(server) {
|
|
|
3276
3540
|
server.registerTool("update_product_design_media", {
|
|
3277
3541
|
description: "Update a product design media item's description.",
|
|
3278
3542
|
inputSchema: {
|
|
3279
|
-
productId:
|
|
3280
|
-
mediaId:
|
|
3281
|
-
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")
|
|
3282
3546
|
}
|
|
3283
3547
|
}, async ({
|
|
3284
3548
|
productId,
|
|
@@ -3306,8 +3570,8 @@ function registerDeleteProductDesignMedia(server) {
|
|
|
3306
3570
|
server.registerTool("delete_product_design_media", {
|
|
3307
3571
|
description: "Delete a product design media item (soft delete).",
|
|
3308
3572
|
inputSchema: {
|
|
3309
|
-
productId:
|
|
3310
|
-
mediaId:
|
|
3573
|
+
productId: z16.string().describe("The UUID of the product"),
|
|
3574
|
+
mediaId: z16.string().describe("The UUID of the design media to delete")
|
|
3311
3575
|
}
|
|
3312
3576
|
}, async ({ productId, mediaId }) => {
|
|
3313
3577
|
const client2 = getApiClient();
|
|
@@ -3329,8 +3593,8 @@ function registerUploadDesignWalkthrough(server) {
|
|
|
3329
3593
|
server.registerTool("upload_design_walkthrough", {
|
|
3330
3594
|
description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
|
|
3331
3595
|
inputSchema: {
|
|
3332
|
-
roadmapId:
|
|
3333
|
-
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")
|
|
3334
3598
|
}
|
|
3335
3599
|
}, async ({ roadmapId, filePath }) => {
|
|
3336
3600
|
const client2 = getApiClient();
|
|
@@ -3372,8 +3636,8 @@ function registerUploadReleaseWalkthrough(server) {
|
|
|
3372
3636
|
server.registerTool("upload_release_walkthrough", {
|
|
3373
3637
|
description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
|
|
3374
3638
|
inputSchema: {
|
|
3375
|
-
roadmapId:
|
|
3376
|
-
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")
|
|
3377
3641
|
}
|
|
3378
3642
|
}, async ({ roadmapId, filePath }) => {
|
|
3379
3643
|
const client2 = getApiClient();
|
|
@@ -3431,9 +3695,9 @@ function registerPublishPrototype(server) {
|
|
|
3431
3695
|
server.registerTool("publish_prototype", {
|
|
3432
3696
|
description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
|
|
3433
3697
|
inputSchema: {
|
|
3434
|
-
roadmapId:
|
|
3435
|
-
folderPath:
|
|
3436
|
-
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)")
|
|
3437
3701
|
}
|
|
3438
3702
|
}, async ({
|
|
3439
3703
|
roadmapId,
|
|
@@ -3594,7 +3858,7 @@ function registerListPrototypes(server) {
|
|
|
3594
3858
|
server.registerTool("list_prototypes", {
|
|
3595
3859
|
description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
|
|
3596
3860
|
inputSchema: {
|
|
3597
|
-
roadmapId:
|
|
3861
|
+
roadmapId: z16.string().uuid().describe("The UUID of the roadmap item")
|
|
3598
3862
|
}
|
|
3599
3863
|
}, async ({ roadmapId }) => {
|
|
3600
3864
|
const client2 = getApiClient();
|
|
@@ -3638,15 +3902,15 @@ ${lines.join(`
|
|
|
3638
3902
|
};
|
|
3639
3903
|
});
|
|
3640
3904
|
}
|
|
3641
|
-
var dateGranularitySchema2 =
|
|
3905
|
+
var dateGranularitySchema2 = z16.enum(["day", "month", "quarter", "half-year", "year"]);
|
|
3642
3906
|
function registerSearchInitiatives(server) {
|
|
3643
3907
|
server.registerTool("search_initiatives", {
|
|
3644
3908
|
description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
|
|
3645
3909
|
inputSchema: {
|
|
3646
|
-
query:
|
|
3910
|
+
query: z16.string().optional().describe("Search query to match against title or description"),
|
|
3647
3911
|
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
3648
|
-
limit:
|
|
3649
|
-
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)")
|
|
3650
3914
|
}
|
|
3651
3915
|
}, async ({
|
|
3652
3916
|
query,
|
|
@@ -3673,7 +3937,7 @@ function registerSearchInitiatives(server) {
|
|
|
3673
3937
|
items: paginatedInitiatives.map((i) => ({
|
|
3674
3938
|
id: i.id,
|
|
3675
3939
|
title: i.title,
|
|
3676
|
-
description: i.description,
|
|
3940
|
+
description: contentToMarkdown(i.description),
|
|
3677
3941
|
horizon: i.horizon,
|
|
3678
3942
|
targetDate: i.targetDate,
|
|
3679
3943
|
itemCount: i.itemCount,
|
|
@@ -3696,7 +3960,7 @@ function registerGetInitiative(server) {
|
|
|
3696
3960
|
server.registerTool("get_initiative", {
|
|
3697
3961
|
description: "Get full details of an initiative including all linked roadmap items.",
|
|
3698
3962
|
inputSchema: {
|
|
3699
|
-
id:
|
|
3963
|
+
id: z16.string().describe("The UUID of the initiative")
|
|
3700
3964
|
}
|
|
3701
3965
|
}, async ({ id }) => {
|
|
3702
3966
|
const client2 = getApiClient();
|
|
@@ -3705,7 +3969,13 @@ function registerGetInitiative(server) {
|
|
|
3705
3969
|
content: [
|
|
3706
3970
|
{
|
|
3707
3971
|
type: "text",
|
|
3708
|
-
text: JSON.stringify(
|
|
3972
|
+
text: JSON.stringify({
|
|
3973
|
+
...result,
|
|
3974
|
+
initiative: {
|
|
3975
|
+
...result.initiative,
|
|
3976
|
+
description: contentToMarkdown(result.initiative.description)
|
|
3977
|
+
}
|
|
3978
|
+
}, null, 2)
|
|
3709
3979
|
}
|
|
3710
3980
|
]
|
|
3711
3981
|
};
|
|
@@ -3715,12 +3985,12 @@ function registerCreateInitiative(server) {
|
|
|
3715
3985
|
server.registerTool("create_initiative", {
|
|
3716
3986
|
description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
|
|
3717
3987
|
inputSchema: {
|
|
3718
|
-
title:
|
|
3719
|
-
description:
|
|
3988
|
+
title: z16.string().describe("Title of the initiative"),
|
|
3989
|
+
description: z16.string().optional().describe("Description of the initiative (markdown)"),
|
|
3720
3990
|
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
3721
3991
|
dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
|
|
3722
|
-
dateValue:
|
|
3723
|
-
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")
|
|
3724
3994
|
}
|
|
3725
3995
|
}, async ({
|
|
3726
3996
|
title,
|
|
@@ -3764,14 +4034,14 @@ function registerUpdateInitiative(server) {
|
|
|
3764
4034
|
server.registerTool("update_initiative", {
|
|
3765
4035
|
description: "Update an existing initiative.",
|
|
3766
4036
|
inputSchema: {
|
|
3767
|
-
id:
|
|
3768
|
-
title:
|
|
3769
|
-
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)"),
|
|
3770
4040
|
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
3771
4041
|
dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
|
|
3772
|
-
dateValue:
|
|
3773
|
-
targetDate:
|
|
3774
|
-
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)")
|
|
3775
4045
|
}
|
|
3776
4046
|
}, async ({
|
|
3777
4047
|
id,
|
|
@@ -3826,7 +4096,7 @@ function registerDeleteInitiative(server) {
|
|
|
3826
4096
|
server.registerTool("delete_initiative", {
|
|
3827
4097
|
description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
|
|
3828
4098
|
inputSchema: {
|
|
3829
|
-
id:
|
|
4099
|
+
id: z16.string().describe("The UUID of the initiative to delete")
|
|
3830
4100
|
}
|
|
3831
4101
|
}, async ({ id }) => {
|
|
3832
4102
|
const client2 = getApiClient();
|
|
@@ -3845,9 +4115,9 @@ function registerReorderInitiatives(server) {
|
|
|
3845
4115
|
server.registerTool("reorder_initiatives", {
|
|
3846
4116
|
description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
|
|
3847
4117
|
inputSchema: {
|
|
3848
|
-
items:
|
|
3849
|
-
id:
|
|
3850
|
-
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)")
|
|
3851
4121
|
})).describe("Array of initiatives with their new order values")
|
|
3852
4122
|
}
|
|
3853
4123
|
}, async ({ items }) => {
|
|
@@ -3867,12 +4137,12 @@ function registerSearchExports(server) {
|
|
|
3867
4137
|
server.registerTool("search_exports", {
|
|
3868
4138
|
description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
|
|
3869
4139
|
inputSchema: {
|
|
3870
|
-
roadmapId:
|
|
3871
|
-
externalSystem:
|
|
3872
|
-
localEntityType:
|
|
3873
|
-
localEntityId:
|
|
3874
|
-
limit:
|
|
3875
|
-
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)")
|
|
3876
4146
|
}
|
|
3877
4147
|
}, async ({
|
|
3878
4148
|
roadmapId,
|
|
@@ -3909,7 +4179,7 @@ function registerGetExport(server) {
|
|
|
3909
4179
|
server.registerTool("get_export", {
|
|
3910
4180
|
description: "Get full details of a single export record by ID.",
|
|
3911
4181
|
inputSchema: {
|
|
3912
|
-
id:
|
|
4182
|
+
id: z16.string().uuid().describe("The UUID of the export record")
|
|
3913
4183
|
}
|
|
3914
4184
|
}, async ({ id }) => {
|
|
3915
4185
|
const client2 = getApiClient();
|
|
@@ -3928,14 +4198,14 @@ function registerCreateExport(server) {
|
|
|
3928
4198
|
server.registerTool("create_export", {
|
|
3929
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.",
|
|
3930
4200
|
inputSchema: {
|
|
3931
|
-
roadmapId:
|
|
3932
|
-
localEntityType:
|
|
3933
|
-
localEntityId:
|
|
3934
|
-
externalSystem:
|
|
3935
|
-
externalObjectType:
|
|
3936
|
-
externalId:
|
|
3937
|
-
externalUrl:
|
|
3938
|
-
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")
|
|
3939
4209
|
}
|
|
3940
4210
|
}, async ({
|
|
3941
4211
|
roadmapId,
|
|
@@ -3972,9 +4242,9 @@ function registerUpdateExport(server) {
|
|
|
3972
4242
|
server.registerTool("update_export", {
|
|
3973
4243
|
description: "Update an export record. Can update the external URL or metadata.",
|
|
3974
4244
|
inputSchema: {
|
|
3975
|
-
id:
|
|
3976
|
-
externalUrl:
|
|
3977
|
-
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")
|
|
3978
4248
|
}
|
|
3979
4249
|
}, async ({
|
|
3980
4250
|
id,
|
|
@@ -3997,7 +4267,7 @@ function registerDeleteExport(server) {
|
|
|
3997
4267
|
server.registerTool("delete_export", {
|
|
3998
4268
|
description: "Delete an export record. This is a soft delete.",
|
|
3999
4269
|
inputSchema: {
|
|
4000
|
-
id:
|
|
4270
|
+
id: z16.string().uuid().describe("The UUID of the export record to delete")
|
|
4001
4271
|
}
|
|
4002
4272
|
}, async ({ id }) => {
|
|
4003
4273
|
const client2 = getApiClient();
|
|
@@ -4033,7 +4303,7 @@ function registerGetPresentation(server) {
|
|
|
4033
4303
|
server.registerTool("get_presentation", {
|
|
4034
4304
|
description: "Get presentation with variants and slides.",
|
|
4035
4305
|
inputSchema: {
|
|
4036
|
-
id:
|
|
4306
|
+
id: z16.string().describe("The UUID of the presentation")
|
|
4037
4307
|
}
|
|
4038
4308
|
}, async ({ id }) => {
|
|
4039
4309
|
const client2 = getApiClient();
|
|
@@ -4063,8 +4333,8 @@ function registerCreatePresentation(server) {
|
|
|
4063
4333
|
server.registerTool("create_presentation", {
|
|
4064
4334
|
description: "Create a new presentation.",
|
|
4065
4335
|
inputSchema: {
|
|
4066
|
-
title:
|
|
4067
|
-
description:
|
|
4336
|
+
title: z16.string().describe("Title of the presentation"),
|
|
4337
|
+
description: z16.string().nullable().optional().describe("Description of the presentation")
|
|
4068
4338
|
}
|
|
4069
4339
|
}, async ({ title, description }) => {
|
|
4070
4340
|
const client2 = getApiClient();
|
|
@@ -4086,9 +4356,9 @@ function registerUpdatePresentation(server) {
|
|
|
4086
4356
|
server.registerTool("update_presentation", {
|
|
4087
4357
|
description: "Update an existing presentation.",
|
|
4088
4358
|
inputSchema: {
|
|
4089
|
-
id:
|
|
4090
|
-
title:
|
|
4091
|
-
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")
|
|
4092
4362
|
}
|
|
4093
4363
|
}, async ({
|
|
4094
4364
|
id,
|
|
@@ -4116,7 +4386,7 @@ function registerDeletePresentation(server) {
|
|
|
4116
4386
|
server.registerTool("delete_presentation", {
|
|
4117
4387
|
description: "Delete a presentation.",
|
|
4118
4388
|
inputSchema: {
|
|
4119
|
-
id:
|
|
4389
|
+
id: z16.string().describe("The UUID of the presentation to delete")
|
|
4120
4390
|
}
|
|
4121
4391
|
}, async ({ id }) => {
|
|
4122
4392
|
const client2 = getApiClient();
|
|
@@ -4135,9 +4405,9 @@ function registerReorderPresentations(server) {
|
|
|
4135
4405
|
server.registerTool("reorder_presentations", {
|
|
4136
4406
|
description: "Reorder presentations by setting their order values. Lower order values appear first.",
|
|
4137
4407
|
inputSchema: {
|
|
4138
|
-
items:
|
|
4139
|
-
id:
|
|
4140
|
-
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)")
|
|
4141
4411
|
})).describe("Array of presentations with their new order values")
|
|
4142
4412
|
}
|
|
4143
4413
|
}, async ({ items }) => {
|
|
@@ -4157,7 +4427,7 @@ function registerListVariants(server) {
|
|
|
4157
4427
|
server.registerTool("list_variants", {
|
|
4158
4428
|
description: "List all variants for a presentation.",
|
|
4159
4429
|
inputSchema: {
|
|
4160
|
-
presentationId:
|
|
4430
|
+
presentationId: z16.string().describe("The UUID of the presentation")
|
|
4161
4431
|
}
|
|
4162
4432
|
}, async ({ presentationId }) => {
|
|
4163
4433
|
const client2 = getApiClient();
|
|
@@ -4176,8 +4446,8 @@ function registerGetVariant(server) {
|
|
|
4176
4446
|
server.registerTool("get_variant", {
|
|
4177
4447
|
description: "Get variant with its slides.",
|
|
4178
4448
|
inputSchema: {
|
|
4179
|
-
presentationId:
|
|
4180
|
-
variantId:
|
|
4449
|
+
presentationId: z16.string().describe("The UUID of the presentation"),
|
|
4450
|
+
variantId: z16.string().describe("The UUID of the variant")
|
|
4181
4451
|
}
|
|
4182
4452
|
}, async ({ presentationId, variantId }) => {
|
|
4183
4453
|
const client2 = getApiClient();
|
|
@@ -4200,9 +4470,9 @@ function registerCreateVariant(server) {
|
|
|
4200
4470
|
server.registerTool("create_variant", {
|
|
4201
4471
|
description: "Create a new variant for a presentation.",
|
|
4202
4472
|
inputSchema: {
|
|
4203
|
-
presentationId:
|
|
4204
|
-
name:
|
|
4205
|
-
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")
|
|
4206
4476
|
}
|
|
4207
4477
|
}, async ({
|
|
4208
4478
|
presentationId,
|
|
@@ -4228,10 +4498,10 @@ function registerUpdateVariant(server) {
|
|
|
4228
4498
|
server.registerTool("update_variant", {
|
|
4229
4499
|
description: "Update an existing variant.",
|
|
4230
4500
|
inputSchema: {
|
|
4231
|
-
presentationId:
|
|
4232
|
-
variantId:
|
|
4233
|
-
name:
|
|
4234
|
-
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")
|
|
4235
4505
|
}
|
|
4236
4506
|
}, async ({
|
|
4237
4507
|
presentationId,
|
|
@@ -4260,8 +4530,8 @@ function registerDeleteVariant(server) {
|
|
|
4260
4530
|
server.registerTool("delete_variant", {
|
|
4261
4531
|
description: "Delete a variant.",
|
|
4262
4532
|
inputSchema: {
|
|
4263
|
-
presentationId:
|
|
4264
|
-
variantId:
|
|
4533
|
+
presentationId: z16.string().describe("The UUID of the presentation"),
|
|
4534
|
+
variantId: z16.string().describe("The UUID of the variant to delete")
|
|
4265
4535
|
}
|
|
4266
4536
|
}, async ({ presentationId, variantId }) => {
|
|
4267
4537
|
const client2 = getApiClient();
|
|
@@ -4280,10 +4550,10 @@ function registerReorderVariants(server) {
|
|
|
4280
4550
|
server.registerTool("reorder_variants", {
|
|
4281
4551
|
description: "Reorder variants by setting their order values. Lower order values appear first.",
|
|
4282
4552
|
inputSchema: {
|
|
4283
|
-
presentationId:
|
|
4284
|
-
items:
|
|
4285
|
-
id:
|
|
4286
|
-
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)")
|
|
4287
4557
|
})).describe("Array of variants with their new order values")
|
|
4288
4558
|
}
|
|
4289
4559
|
}, async ({
|
|
@@ -4306,8 +4576,8 @@ function registerCloneVariant(server) {
|
|
|
4306
4576
|
server.registerTool("clone_variant", {
|
|
4307
4577
|
description: "Clone a variant with all its slides.",
|
|
4308
4578
|
inputSchema: {
|
|
4309
|
-
presentationId:
|
|
4310
|
-
variantId:
|
|
4579
|
+
presentationId: z16.string().describe("The UUID of the presentation"),
|
|
4580
|
+
variantId: z16.string().describe("The UUID of the variant to clone")
|
|
4311
4581
|
}
|
|
4312
4582
|
}, async ({ presentationId, variantId }) => {
|
|
4313
4583
|
const client2 = getApiClient();
|
|
@@ -4326,8 +4596,8 @@ function registerSetDefaultVariant(server) {
|
|
|
4326
4596
|
server.registerTool("set_default_variant", {
|
|
4327
4597
|
description: "Set a variant as the default for the presentation.",
|
|
4328
4598
|
inputSchema: {
|
|
4329
|
-
presentationId:
|
|
4330
|
-
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")
|
|
4331
4601
|
}
|
|
4332
4602
|
}, async ({ presentationId, variantId }) => {
|
|
4333
4603
|
const client2 = getApiClient();
|
|
@@ -4346,7 +4616,7 @@ function registerListSlides(server) {
|
|
|
4346
4616
|
server.registerTool("list_slides", {
|
|
4347
4617
|
description: "List all slides in a variant.",
|
|
4348
4618
|
inputSchema: {
|
|
4349
|
-
variantId:
|
|
4619
|
+
variantId: z16.string().describe("The UUID of the variant")
|
|
4350
4620
|
}
|
|
4351
4621
|
}, async ({ variantId }) => {
|
|
4352
4622
|
const client2 = getApiClient();
|
|
@@ -4376,8 +4646,8 @@ function registerGetSlide(server) {
|
|
|
4376
4646
|
server.registerTool("get_slide", {
|
|
4377
4647
|
description: "Get a slide by ID.",
|
|
4378
4648
|
inputSchema: {
|
|
4379
|
-
variantId:
|
|
4380
|
-
slideId:
|
|
4649
|
+
variantId: z16.string().describe("The UUID of the variant"),
|
|
4650
|
+
slideId: z16.string().describe("The UUID of the slide")
|
|
4381
4651
|
}
|
|
4382
4652
|
}, async ({ variantId, slideId }) => {
|
|
4383
4653
|
const client2 = getApiClient();
|
|
@@ -4407,8 +4677,8 @@ function registerCreateSlide(server) {
|
|
|
4407
4677
|
server.registerTool("create_slide", {
|
|
4408
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).",
|
|
4409
4679
|
inputSchema: {
|
|
4410
|
-
variantId:
|
|
4411
|
-
slideType:
|
|
4680
|
+
variantId: z16.string().describe("The UUID of the variant"),
|
|
4681
|
+
slideType: z16.enum([
|
|
4412
4682
|
"title",
|
|
4413
4683
|
"section_header",
|
|
4414
4684
|
"bullets",
|
|
@@ -4422,8 +4692,8 @@ function registerCreateSlide(server) {
|
|
|
4422
4692
|
"mermaid",
|
|
4423
4693
|
"paragraph"
|
|
4424
4694
|
]).default("bullets").describe("The type of slide to create"),
|
|
4425
|
-
content:
|
|
4426
|
-
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")
|
|
4427
4697
|
}
|
|
4428
4698
|
}, async ({
|
|
4429
4699
|
variantId,
|
|
@@ -4462,11 +4732,11 @@ function registerUpdateSlide(server) {
|
|
|
4462
4732
|
server.registerTool("update_slide", {
|
|
4463
4733
|
description: "Update an existing slide.",
|
|
4464
4734
|
inputSchema: {
|
|
4465
|
-
variantId:
|
|
4466
|
-
slideId:
|
|
4467
|
-
title:
|
|
4468
|
-
content:
|
|
4469
|
-
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")
|
|
4470
4740
|
}
|
|
4471
4741
|
}, async ({
|
|
4472
4742
|
variantId,
|
|
@@ -4509,8 +4779,8 @@ function registerDeleteSlide(server) {
|
|
|
4509
4779
|
server.registerTool("delete_slide", {
|
|
4510
4780
|
description: "Delete a slide (soft delete).",
|
|
4511
4781
|
inputSchema: {
|
|
4512
|
-
variantId:
|
|
4513
|
-
slideId:
|
|
4782
|
+
variantId: z16.string().describe("The UUID of the variant"),
|
|
4783
|
+
slideId: z16.string().describe("The UUID of the slide to delete")
|
|
4514
4784
|
}
|
|
4515
4785
|
}, async ({ variantId, slideId }) => {
|
|
4516
4786
|
const client2 = getApiClient();
|
|
@@ -4540,10 +4810,10 @@ function registerReorderSlides(server) {
|
|
|
4540
4810
|
server.registerTool("reorder_slides", {
|
|
4541
4811
|
description: "Reorder slides by setting their order values. Lower order values appear first.",
|
|
4542
4812
|
inputSchema: {
|
|
4543
|
-
variantId:
|
|
4544
|
-
items:
|
|
4545
|
-
id:
|
|
4546
|
-
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)")
|
|
4547
4817
|
})).describe("Array of slides with their new order values")
|
|
4548
4818
|
}
|
|
4549
4819
|
}, async ({
|
|
@@ -4577,9 +4847,9 @@ function registerUploadSlideImage(server) {
|
|
|
4577
4847
|
server.registerTool("upload_slide_image", {
|
|
4578
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".',
|
|
4579
4849
|
inputSchema: {
|
|
4580
|
-
variantId:
|
|
4581
|
-
slideId:
|
|
4582
|
-
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")
|
|
4583
4853
|
}
|
|
4584
4854
|
}, async ({
|
|
4585
4855
|
variantId,
|
|
@@ -4653,9 +4923,9 @@ function registerCreateFeedbackSession(server) {
|
|
|
4653
4923
|
server.registerTool("create_feedback_session", {
|
|
4654
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.",
|
|
4655
4925
|
inputSchema: {
|
|
4656
|
-
prototypeId:
|
|
4657
|
-
name:
|
|
4658
|
-
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)")
|
|
4659
4929
|
}
|
|
4660
4930
|
}, async ({
|
|
4661
4931
|
prototypeId,
|
|
@@ -4704,7 +4974,7 @@ function registerListFeedbackSessions(server) {
|
|
|
4704
4974
|
server.registerTool("list_feedback_sessions", {
|
|
4705
4975
|
description: "List all feedback sessions for a prototype with comment counts and status.",
|
|
4706
4976
|
inputSchema: {
|
|
4707
|
-
prototypeId:
|
|
4977
|
+
prototypeId: z16.string().uuid().describe("The UUID of the prototype")
|
|
4708
4978
|
}
|
|
4709
4979
|
}, async ({ prototypeId }) => {
|
|
4710
4980
|
const client2 = getApiClient();
|
|
@@ -4755,9 +5025,9 @@ function registerGetFeedbackSummary(server) {
|
|
|
4755
5025
|
server.registerTool("get_feedback_summary", {
|
|
4756
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.",
|
|
4757
5027
|
inputSchema: {
|
|
4758
|
-
prototypeId:
|
|
4759
|
-
sessionId:
|
|
4760
|
-
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)")
|
|
4761
5031
|
}
|
|
4762
5032
|
}, async ({
|
|
4763
5033
|
prototypeId,
|
|
@@ -4798,10 +5068,10 @@ function registerGetFeedbackDetail(server) {
|
|
|
4798
5068
|
server.registerTool("get_feedback_detail", {
|
|
4799
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.",
|
|
4800
5070
|
inputSchema: {
|
|
4801
|
-
prototypeId:
|
|
4802
|
-
sessionId:
|
|
4803
|
-
commentId:
|
|
4804
|
-
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.")
|
|
4805
5075
|
}
|
|
4806
5076
|
}, async ({
|
|
4807
5077
|
prototypeId,
|
|
@@ -4847,9 +5117,9 @@ function registerResolveFeedbackComment(server) {
|
|
|
4847
5117
|
server.registerTool("resolve_feedback_comment", {
|
|
4848
5118
|
description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
|
|
4849
5119
|
inputSchema: {
|
|
4850
|
-
prototypeId:
|
|
4851
|
-
sessionId:
|
|
4852
|
-
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")
|
|
4853
5123
|
}
|
|
4854
5124
|
}, async ({
|
|
4855
5125
|
prototypeId,
|