@ourroadmaps/mcp 0.28.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1271 -943
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -21,29 +21,282 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
21
21
|
// src/index.ts
|
|
22
22
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
23
23
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
24
|
-
|
|
24
|
+
|
|
25
|
+
// ../../packages/shared/src/blocknote-markdown.ts
|
|
26
|
+
var LIST_BLOCK_TYPES = new Set(["bulletListItem", "numberedListItem", "checkListItem"]);
|
|
27
|
+
function contentToMarkdown(content) {
|
|
28
|
+
if (content == null)
|
|
29
|
+
return "";
|
|
30
|
+
if (typeof content === "string")
|
|
31
|
+
return content;
|
|
32
|
+
if (!Array.isArray(content))
|
|
33
|
+
return "";
|
|
34
|
+
if (content.length === 0)
|
|
35
|
+
return "";
|
|
36
|
+
try {
|
|
37
|
+
return convertBlocks(content, 0);
|
|
38
|
+
} catch {
|
|
39
|
+
try {
|
|
40
|
+
return extractPlainText(content);
|
|
41
|
+
} catch {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function getPreviousBlockType(blocks, currentIndex) {
|
|
47
|
+
for (let i = currentIndex - 1;i >= 0; i--) {
|
|
48
|
+
const block = blocks[i];
|
|
49
|
+
if (!block || typeof block !== "object")
|
|
50
|
+
continue;
|
|
51
|
+
const b = block;
|
|
52
|
+
const line = renderBlock(b, 0, 0);
|
|
53
|
+
if (line !== null)
|
|
54
|
+
return b.type || "";
|
|
55
|
+
}
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
function appendSeparator(parts, prevType, currentType) {
|
|
59
|
+
if (parts.length === 0)
|
|
60
|
+
return;
|
|
61
|
+
const bothList = LIST_BLOCK_TYPES.has(prevType) && LIST_BLOCK_TYPES.has(currentType);
|
|
62
|
+
parts.push(bothList ? `
|
|
63
|
+
` : `
|
|
64
|
+
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
function appendChildren(parts, block, depth) {
|
|
68
|
+
const children = block.children;
|
|
69
|
+
if (!Array.isArray(children) || children.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
const childOutput = convertBlocks(children, depth + 1);
|
|
72
|
+
if (childOutput) {
|
|
73
|
+
parts.push(`
|
|
74
|
+
`);
|
|
75
|
+
parts.push(childOutput);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function convertBlocks(blocks, depth) {
|
|
79
|
+
const parts = [];
|
|
80
|
+
let numberedCounter = 0;
|
|
81
|
+
for (let i = 0;i < blocks.length; i++) {
|
|
82
|
+
const block = blocks[i];
|
|
83
|
+
if (!block || typeof block !== "object")
|
|
84
|
+
continue;
|
|
85
|
+
const b = block;
|
|
86
|
+
const type = b.type || "";
|
|
87
|
+
numberedCounter = type === "numberedListItem" ? numberedCounter + 1 : 0;
|
|
88
|
+
const line = renderBlock(b, depth, numberedCounter);
|
|
89
|
+
if (line === null)
|
|
90
|
+
continue;
|
|
91
|
+
const prevType = getPreviousBlockType(blocks, i);
|
|
92
|
+
appendSeparator(parts, prevType, type);
|
|
93
|
+
parts.push(line);
|
|
94
|
+
appendChildren(parts, b, depth);
|
|
95
|
+
}
|
|
96
|
+
return parts.join("");
|
|
97
|
+
}
|
|
98
|
+
function renderBlock(block, depth, numberedCounter) {
|
|
99
|
+
const type = block.type || "";
|
|
100
|
+
const props = block.props || {};
|
|
101
|
+
const content = block.content;
|
|
102
|
+
const indent = " ".repeat(depth);
|
|
103
|
+
switch (type) {
|
|
104
|
+
case "paragraph": {
|
|
105
|
+
const text = renderInlineContent(content);
|
|
106
|
+
if (!text)
|
|
107
|
+
return null;
|
|
108
|
+
return `${indent}${text}`;
|
|
109
|
+
}
|
|
110
|
+
case "heading": {
|
|
111
|
+
const level = props.level || 1;
|
|
112
|
+
const prefix = "#".repeat(Math.min(level, 6));
|
|
113
|
+
const text = renderInlineContent(content);
|
|
114
|
+
return `${indent}${prefix} ${text}`;
|
|
115
|
+
}
|
|
116
|
+
case "bulletListItem": {
|
|
117
|
+
const text = renderInlineContent(content);
|
|
118
|
+
return `${indent}- ${text}`;
|
|
119
|
+
}
|
|
120
|
+
case "numberedListItem": {
|
|
121
|
+
const text = renderInlineContent(content);
|
|
122
|
+
return `${indent}${numberedCounter}. ${text}`;
|
|
123
|
+
}
|
|
124
|
+
case "checkListItem": {
|
|
125
|
+
const checked = props.checked === true;
|
|
126
|
+
const marker = checked ? "[x]" : "[ ]";
|
|
127
|
+
const text = renderInlineContent(content);
|
|
128
|
+
return `${indent}- ${marker} ${text}`;
|
|
129
|
+
}
|
|
130
|
+
case "codeBlock": {
|
|
131
|
+
const language = props.language || "";
|
|
132
|
+
const text = renderInlineContent(content);
|
|
133
|
+
return `${indent}\`\`\`${language}
|
|
134
|
+
${indent}${text}
|
|
135
|
+
${indent}\`\`\``;
|
|
136
|
+
}
|
|
137
|
+
case "image": {
|
|
138
|
+
const url = props.url || "";
|
|
139
|
+
const caption = props.caption || "";
|
|
140
|
+
return `${indent}`;
|
|
141
|
+
}
|
|
142
|
+
case "table":
|
|
143
|
+
return renderTable(content, indent);
|
|
144
|
+
case "divider":
|
|
145
|
+
return `${indent}---`;
|
|
146
|
+
default: {
|
|
147
|
+
const text = renderInlineContent(content);
|
|
148
|
+
if (!text)
|
|
149
|
+
return null;
|
|
150
|
+
return `${indent}${text}`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function renderInlineContent(content) {
|
|
155
|
+
if (!content)
|
|
156
|
+
return "";
|
|
157
|
+
if (Array.isArray(content)) {
|
|
158
|
+
return content.map(renderInlineItem).join("");
|
|
159
|
+
}
|
|
160
|
+
return "";
|
|
161
|
+
}
|
|
162
|
+
function renderInlineItem(item) {
|
|
163
|
+
if (!item || typeof item !== "object")
|
|
164
|
+
return "";
|
|
165
|
+
const i = item;
|
|
166
|
+
const type = i.type;
|
|
167
|
+
if (type === "text") {
|
|
168
|
+
const text = i.text || "";
|
|
169
|
+
return applyStyles(text, i.styles);
|
|
170
|
+
}
|
|
171
|
+
if (type === "link") {
|
|
172
|
+
const href = i.href || "";
|
|
173
|
+
const linkContent = i.content;
|
|
174
|
+
const text = Array.isArray(linkContent) ? linkContent.map(renderInlineItem).join("") : "";
|
|
175
|
+
return `[${text}](${href})`;
|
|
176
|
+
}
|
|
177
|
+
return "";
|
|
178
|
+
}
|
|
179
|
+
function applyStyles(text, styles) {
|
|
180
|
+
if (!text)
|
|
181
|
+
return text;
|
|
182
|
+
if (!styles || typeof styles !== "object")
|
|
183
|
+
return text;
|
|
184
|
+
const s = styles;
|
|
185
|
+
let result = text;
|
|
186
|
+
if (s.code === true) {
|
|
187
|
+
result = `\`${result}\``;
|
|
188
|
+
}
|
|
189
|
+
if (s.bold === true && s.italic === true) {
|
|
190
|
+
result = `***${result}***`;
|
|
191
|
+
} else if (s.bold === true) {
|
|
192
|
+
result = `**${result}**`;
|
|
193
|
+
} else if (s.italic === true) {
|
|
194
|
+
result = `*${result}*`;
|
|
195
|
+
}
|
|
196
|
+
if (s.strike === true) {
|
|
197
|
+
result = `~~${result}~~`;
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
function renderTable(content, indent) {
|
|
202
|
+
if (!content || typeof content !== "object")
|
|
203
|
+
return null;
|
|
204
|
+
const tableContent = content;
|
|
205
|
+
const rows = tableContent.rows;
|
|
206
|
+
if (!Array.isArray(rows) || rows.length === 0)
|
|
207
|
+
return null;
|
|
208
|
+
const lines = [];
|
|
209
|
+
for (let rowIndex = 0;rowIndex < rows.length; rowIndex++) {
|
|
210
|
+
const row = rows[rowIndex];
|
|
211
|
+
const cells = row?.cells;
|
|
212
|
+
if (!Array.isArray(cells))
|
|
213
|
+
continue;
|
|
214
|
+
const cellTexts = cells.map((cell) => {
|
|
215
|
+
if (Array.isArray(cell)) {
|
|
216
|
+
return cell.map(renderInlineItem).join("");
|
|
217
|
+
}
|
|
218
|
+
return "";
|
|
219
|
+
});
|
|
220
|
+
lines.push(`${indent}| ${cellTexts.join(" | ")} |`);
|
|
221
|
+
if (rowIndex === 0) {
|
|
222
|
+
const separator = cellTexts.map(() => "---").join(" | ");
|
|
223
|
+
lines.push(`${indent}| ${separator} |`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return lines.join(`
|
|
227
|
+
`);
|
|
228
|
+
}
|
|
229
|
+
function extractPlainText(obj) {
|
|
230
|
+
if (typeof obj === "string")
|
|
231
|
+
return obj;
|
|
232
|
+
if (Array.isArray(obj)) {
|
|
233
|
+
return obj.map(extractPlainText).filter(Boolean).join(" ");
|
|
234
|
+
}
|
|
235
|
+
if (obj && typeof obj === "object") {
|
|
236
|
+
const record = obj;
|
|
237
|
+
if (typeof record.text === "string")
|
|
238
|
+
return record.text;
|
|
239
|
+
const parts = [];
|
|
240
|
+
for (const value of Object.values(record)) {
|
|
241
|
+
const text = extractPlainText(value);
|
|
242
|
+
if (text)
|
|
243
|
+
parts.push(text);
|
|
244
|
+
}
|
|
245
|
+
return parts.join(" ");
|
|
246
|
+
}
|
|
247
|
+
return "";
|
|
248
|
+
}
|
|
249
|
+
// ../../packages/shared/src/schemas/ai.ts
|
|
25
250
|
import { z } from "zod";
|
|
26
|
-
var
|
|
27
|
-
|
|
251
|
+
var TASK_TYPES = ["complex", "generation", "fast"];
|
|
252
|
+
var taskTypeSchema = z.enum(TASK_TYPES);
|
|
253
|
+
var AI_MODEL_NAMES = ["sonnet", "haiku", "opus"];
|
|
254
|
+
var aiModelNameSchema = z.enum(AI_MODEL_NAMES);
|
|
255
|
+
var aiCallLogSchema = z.object({
|
|
256
|
+
id: z.string(),
|
|
28
257
|
organizationId: z.string(),
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
258
|
+
userId: z.string(),
|
|
259
|
+
requestId: z.string().nullish(),
|
|
260
|
+
feature: z.string(),
|
|
261
|
+
model: z.string(),
|
|
262
|
+
provider: z.string(),
|
|
263
|
+
taskType: z.string().nullish(),
|
|
264
|
+
inputTokens: z.number().nullable(),
|
|
265
|
+
outputTokens: z.number().nullable(),
|
|
266
|
+
costCents: z.number().nullable(),
|
|
267
|
+
durationMs: z.number().nullable(),
|
|
268
|
+
stopReason: z.string().nullable(),
|
|
269
|
+
error: z.string().nullable(),
|
|
270
|
+
errorType: z.string().nullable(),
|
|
271
|
+
reason: z.string().nullable(),
|
|
272
|
+
correlationId: z.string().nullable(),
|
|
273
|
+
iteration: z.number().nullable(),
|
|
274
|
+
metadata: z.record(z.unknown()).nullable(),
|
|
275
|
+
createdAt: z.string()
|
|
276
|
+
});
|
|
277
|
+
// ../../packages/shared/src/schemas/audience.ts
|
|
278
|
+
import { z as z2 } from "zod";
|
|
279
|
+
var audienceSchema = z2.object({
|
|
280
|
+
id: z2.string().uuid(),
|
|
281
|
+
organizationId: z2.string(),
|
|
282
|
+
name: z2.string(),
|
|
283
|
+
description: z2.string().nullable(),
|
|
284
|
+
order: z2.number().int(),
|
|
285
|
+
createdAt: z2.string(),
|
|
286
|
+
updatedAt: z2.string().nullable()
|
|
34
287
|
});
|
|
35
|
-
var createAudienceSchema =
|
|
36
|
-
name:
|
|
37
|
-
description:
|
|
288
|
+
var createAudienceSchema = z2.object({
|
|
289
|
+
name: z2.string().min(1),
|
|
290
|
+
description: z2.string().nullable().optional()
|
|
38
291
|
});
|
|
39
|
-
var updateAudienceSchema =
|
|
40
|
-
name:
|
|
41
|
-
description:
|
|
42
|
-
order:
|
|
292
|
+
var updateAudienceSchema = z2.object({
|
|
293
|
+
name: z2.string().min(1).optional(),
|
|
294
|
+
description: z2.string().nullable().optional(),
|
|
295
|
+
order: z2.number().int().optional()
|
|
43
296
|
});
|
|
44
|
-
var audienceListSchema =
|
|
297
|
+
var audienceListSchema = z2.array(audienceSchema);
|
|
45
298
|
// ../../packages/shared/src/schemas/constants.ts
|
|
46
|
-
import { z as
|
|
299
|
+
import { z as z3 } from "zod";
|
|
47
300
|
var HORIZONS = [
|
|
48
301
|
"inbox",
|
|
49
302
|
"now",
|
|
@@ -54,7 +307,7 @@ var HORIZONS = [
|
|
|
54
307
|
"done",
|
|
55
308
|
"cancelled"
|
|
56
309
|
];
|
|
57
|
-
var horizonSchema =
|
|
310
|
+
var horizonSchema = z3.enum(HORIZONS);
|
|
58
311
|
var ROADMAP_STATUSES = [
|
|
59
312
|
"not_started",
|
|
60
313
|
"planning",
|
|
@@ -64,17 +317,17 @@ var ROADMAP_STATUSES = [
|
|
|
64
317
|
"done",
|
|
65
318
|
"cancelled"
|
|
66
319
|
];
|
|
67
|
-
var roadmapStatusSchema =
|
|
320
|
+
var roadmapStatusSchema = z3.enum(ROADMAP_STATUSES);
|
|
68
321
|
var EFFORT_SIZES = ["xs", "s", "m", "l", "xl"];
|
|
69
|
-
var effortSchema =
|
|
322
|
+
var effortSchema = z3.enum(EFFORT_SIZES);
|
|
70
323
|
var DATE_GRANULARITIES = ["day", "month", "quarter", "half-year", "year"];
|
|
71
|
-
var dateGranularitySchema =
|
|
324
|
+
var dateGranularitySchema = z3.enum(DATE_GRANULARITIES);
|
|
72
325
|
var PRD_STATUSES = ["draft", "completed"];
|
|
73
|
-
var prdStatusSchema =
|
|
326
|
+
var prdStatusSchema = z3.enum(PRD_STATUSES);
|
|
74
327
|
var IDEA_STATUSES = ["new", "under-review", "planned", "declined", "done"];
|
|
75
|
-
var ideaStatusSchema =
|
|
328
|
+
var ideaStatusSchema = z3.enum(IDEA_STATUSES);
|
|
76
329
|
var FEATURE_TYPES = ["area", "feature"];
|
|
77
|
-
var featureTypeSchema =
|
|
330
|
+
var featureTypeSchema = z3.enum(FEATURE_TYPES);
|
|
78
331
|
var PRODUCT_TYPES = [
|
|
79
332
|
"brand",
|
|
80
333
|
"product",
|
|
@@ -83,439 +336,439 @@ var PRODUCT_TYPES = [
|
|
|
83
336
|
"landing_page",
|
|
84
337
|
"service"
|
|
85
338
|
];
|
|
86
|
-
var productTypeSchema =
|
|
339
|
+
var productTypeSchema = z3.enum(PRODUCT_TYPES);
|
|
87
340
|
var AUDIENCE_TYPES = ["stakeholder", "user_persona"];
|
|
88
|
-
var audienceTypeSchema =
|
|
341
|
+
var audienceTypeSchema = z3.enum(AUDIENCE_TYPES);
|
|
89
342
|
var BRAINSTORM_MEDIA_TYPES = ["image", "video"];
|
|
90
|
-
var brainstormMediaTypeSchema =
|
|
343
|
+
var brainstormMediaTypeSchema = z3.enum(BRAINSTORM_MEDIA_TYPES);
|
|
91
344
|
// ../../packages/shared/src/schemas/context.ts
|
|
92
|
-
import { z as
|
|
93
|
-
var domainContextSchema =
|
|
94
|
-
definitions:
|
|
95
|
-
schemas:
|
|
345
|
+
import { z as z4 } from "zod";
|
|
346
|
+
var domainContextSchema = z4.object({
|
|
347
|
+
definitions: z4.record(z4.string(), z4.string()),
|
|
348
|
+
schemas: z4.record(z4.string(), z4.array(z4.string()))
|
|
96
349
|
});
|
|
97
350
|
// ../../packages/shared/src/schemas/export.ts
|
|
98
|
-
import { z as
|
|
99
|
-
var localEntityTypeSchema =
|
|
100
|
-
var externalSystemSchema =
|
|
101
|
-
var exportSchema =
|
|
102
|
-
id:
|
|
103
|
-
roadmapItemId:
|
|
351
|
+
import { z as z5 } from "zod";
|
|
352
|
+
var localEntityTypeSchema = z5.enum(["roadmap", "prd", "epic", "story", "design"]);
|
|
353
|
+
var externalSystemSchema = z5.enum(["linear", "notion", "jira", "github"]);
|
|
354
|
+
var exportSchema = z5.object({
|
|
355
|
+
id: z5.string().uuid(),
|
|
356
|
+
roadmapItemId: z5.string().uuid(),
|
|
104
357
|
localEntityType: localEntityTypeSchema,
|
|
105
|
-
localEntityId:
|
|
358
|
+
localEntityId: z5.string().uuid(),
|
|
106
359
|
externalSystem: externalSystemSchema,
|
|
107
|
-
externalObjectType:
|
|
108
|
-
externalId:
|
|
109
|
-
externalUrl:
|
|
110
|
-
metadata:
|
|
111
|
-
createdAt:
|
|
112
|
-
updatedAt:
|
|
360
|
+
externalObjectType: z5.string(),
|
|
361
|
+
externalId: z5.string(),
|
|
362
|
+
externalUrl: z5.string().nullable(),
|
|
363
|
+
metadata: z5.record(z5.unknown()).nullable(),
|
|
364
|
+
createdAt: z5.string(),
|
|
365
|
+
updatedAt: z5.string()
|
|
113
366
|
});
|
|
114
|
-
var createExportInputSchema =
|
|
115
|
-
roadmapId:
|
|
367
|
+
var createExportInputSchema = z5.object({
|
|
368
|
+
roadmapId: z5.string().uuid(),
|
|
116
369
|
localEntityType: localEntityTypeSchema,
|
|
117
|
-
localEntityId:
|
|
370
|
+
localEntityId: z5.string().uuid(),
|
|
118
371
|
externalSystem: externalSystemSchema,
|
|
119
|
-
externalObjectType:
|
|
120
|
-
externalId:
|
|
121
|
-
externalUrl:
|
|
122
|
-
metadata:
|
|
372
|
+
externalObjectType: z5.string().min(1),
|
|
373
|
+
externalId: z5.string().min(1),
|
|
374
|
+
externalUrl: z5.string().url().optional(),
|
|
375
|
+
metadata: z5.record(z5.unknown()).optional()
|
|
123
376
|
});
|
|
124
|
-
var updateExportInputSchema =
|
|
125
|
-
externalUrl:
|
|
126
|
-
metadata:
|
|
377
|
+
var updateExportInputSchema = z5.object({
|
|
378
|
+
externalUrl: z5.string().url().nullable().optional(),
|
|
379
|
+
metadata: z5.record(z5.unknown()).optional()
|
|
127
380
|
});
|
|
128
|
-
var searchExportsInputSchema =
|
|
129
|
-
roadmapId:
|
|
381
|
+
var searchExportsInputSchema = z5.object({
|
|
382
|
+
roadmapId: z5.string().uuid().optional(),
|
|
130
383
|
externalSystem: externalSystemSchema.optional(),
|
|
131
384
|
localEntityType: localEntityTypeSchema.optional(),
|
|
132
|
-
localEntityId:
|
|
133
|
-
limit:
|
|
134
|
-
offset:
|
|
385
|
+
localEntityId: z5.string().uuid().optional(),
|
|
386
|
+
limit: z5.number().int().min(1).max(100).optional(),
|
|
387
|
+
offset: z5.number().int().min(0).optional()
|
|
135
388
|
});
|
|
136
389
|
// ../../packages/shared/src/schemas/feature.ts
|
|
137
|
-
import { z as
|
|
138
|
-
var featureOutcomeSchema =
|
|
139
|
-
id:
|
|
140
|
-
description:
|
|
141
|
-
order:
|
|
142
|
-
createdAt:
|
|
143
|
-
updatedAt:
|
|
390
|
+
import { z as z6 } from "zod";
|
|
391
|
+
var featureOutcomeSchema = z6.object({
|
|
392
|
+
id: z6.string().uuid(),
|
|
393
|
+
description: z6.string(),
|
|
394
|
+
order: z6.number().int(),
|
|
395
|
+
createdAt: z6.string(),
|
|
396
|
+
updatedAt: z6.string()
|
|
144
397
|
});
|
|
145
|
-
var featureSchema =
|
|
146
|
-
id:
|
|
147
|
-
organizationId:
|
|
398
|
+
var featureSchema = z6.object({
|
|
399
|
+
id: z6.string().uuid(),
|
|
400
|
+
organizationId: z6.string(),
|
|
148
401
|
type: featureTypeSchema,
|
|
149
|
-
name:
|
|
150
|
-
description:
|
|
151
|
-
parentId:
|
|
152
|
-
order:
|
|
153
|
-
isExpanded:
|
|
154
|
-
deletedAt:
|
|
155
|
-
createdAt:
|
|
156
|
-
createdBy:
|
|
402
|
+
name: z6.string(),
|
|
403
|
+
description: z6.string().nullable(),
|
|
404
|
+
parentId: z6.string().uuid().nullable(),
|
|
405
|
+
order: z6.number().int(),
|
|
406
|
+
isExpanded: z6.boolean(),
|
|
407
|
+
deletedAt: z6.string().nullable(),
|
|
408
|
+
createdAt: z6.string(),
|
|
409
|
+
createdBy: z6.string()
|
|
157
410
|
});
|
|
158
|
-
var roadmapLinkSchema =
|
|
159
|
-
id:
|
|
160
|
-
roadmapId:
|
|
161
|
-
roadmap:
|
|
162
|
-
id:
|
|
163
|
-
title:
|
|
164
|
-
status:
|
|
165
|
-
horizon:
|
|
411
|
+
var roadmapLinkSchema = z6.object({
|
|
412
|
+
id: z6.string().uuid(),
|
|
413
|
+
roadmapId: z6.string().uuid(),
|
|
414
|
+
roadmap: z6.object({
|
|
415
|
+
id: z6.string().uuid(),
|
|
416
|
+
title: z6.string(),
|
|
417
|
+
status: z6.string(),
|
|
418
|
+
horizon: z6.string()
|
|
166
419
|
}),
|
|
167
|
-
createdAt:
|
|
420
|
+
createdAt: z6.string()
|
|
168
421
|
});
|
|
169
422
|
var featureWithRelationsSchema = featureSchema.extend({
|
|
170
|
-
outcomes:
|
|
171
|
-
roadmapLinks:
|
|
172
|
-
children:
|
|
423
|
+
outcomes: z6.array(featureOutcomeSchema),
|
|
424
|
+
roadmapLinks: z6.array(roadmapLinkSchema),
|
|
425
|
+
children: z6.array(featureSchema).optional()
|
|
173
426
|
});
|
|
174
|
-
var createFeatureSchema =
|
|
175
|
-
name:
|
|
176
|
-
description:
|
|
427
|
+
var createFeatureSchema = z6.object({
|
|
428
|
+
name: z6.string().min(1),
|
|
429
|
+
description: z6.string().nullable().optional(),
|
|
177
430
|
type: featureTypeSchema.optional(),
|
|
178
|
-
parentId:
|
|
431
|
+
parentId: z6.string().uuid().nullable().optional()
|
|
179
432
|
});
|
|
180
|
-
var updateFeatureSchema =
|
|
181
|
-
name:
|
|
182
|
-
description:
|
|
433
|
+
var updateFeatureSchema = z6.object({
|
|
434
|
+
name: z6.string().min(1).optional(),
|
|
435
|
+
description: z6.string().nullable().optional(),
|
|
183
436
|
type: featureTypeSchema.optional(),
|
|
184
|
-
parentId:
|
|
185
|
-
order:
|
|
437
|
+
parentId: z6.string().uuid().nullable().optional(),
|
|
438
|
+
order: z6.number().int().optional()
|
|
186
439
|
});
|
|
187
|
-
var saveFeatureOutcomesSchema =
|
|
188
|
-
outcomes:
|
|
189
|
-
id:
|
|
190
|
-
description:
|
|
440
|
+
var saveFeatureOutcomesSchema = z6.object({
|
|
441
|
+
outcomes: z6.array(z6.object({
|
|
442
|
+
id: z6.string().uuid().optional(),
|
|
443
|
+
description: z6.string()
|
|
191
444
|
}))
|
|
192
445
|
});
|
|
193
|
-
var featureListSchema =
|
|
446
|
+
var featureListSchema = z6.array(featureSchema);
|
|
194
447
|
// ../../packages/shared/src/schemas/idea.ts
|
|
195
|
-
import { z as z6 } from "zod";
|
|
196
|
-
var ideaSchema = z6.object({
|
|
197
|
-
id: z6.string().uuid(),
|
|
198
|
-
organizationId: z6.string(),
|
|
199
|
-
title: z6.string(),
|
|
200
|
-
description: z6.string().nullable(),
|
|
201
|
-
status: ideaStatusSchema,
|
|
202
|
-
source: z6.string().nullable(),
|
|
203
|
-
submittedBy: z6.string().nullable(),
|
|
204
|
-
value: effortSchema.nullable(),
|
|
205
|
-
effort: effortSchema.nullable(),
|
|
206
|
-
order: z6.number().int(),
|
|
207
|
-
createdAt: z6.string(),
|
|
208
|
-
createdBy: z6.string()
|
|
209
|
-
});
|
|
210
|
-
var createIdeaSchema = z6.object({
|
|
211
|
-
title: z6.string().min(1),
|
|
212
|
-
description: z6.string().nullable().optional(),
|
|
213
|
-
status: ideaStatusSchema.optional(),
|
|
214
|
-
effort: effortSchema.nullable().optional(),
|
|
215
|
-
source: z6.string().nullable().optional()
|
|
216
|
-
});
|
|
217
|
-
var updateIdeaSchema = z6.object({
|
|
218
|
-
title: z6.string().min(1).optional(),
|
|
219
|
-
description: z6.string().nullable().optional(),
|
|
220
|
-
status: ideaStatusSchema.optional(),
|
|
221
|
-
effort: effortSchema.nullable().optional(),
|
|
222
|
-
source: z6.string().nullable().optional(),
|
|
223
|
-
order: z6.number().int().optional()
|
|
224
|
-
});
|
|
225
|
-
var ideaListSchema = z6.array(ideaSchema);
|
|
226
|
-
// ../../packages/shared/src/schemas/presentation.ts
|
|
227
448
|
import { z as z7 } from "zod";
|
|
228
|
-
var
|
|
449
|
+
var ideaSchema = z7.object({
|
|
229
450
|
id: z7.string().uuid(),
|
|
230
451
|
organizationId: z7.string(),
|
|
231
452
|
title: z7.string(),
|
|
232
453
|
description: z7.string().nullable(),
|
|
454
|
+
status: ideaStatusSchema,
|
|
455
|
+
source: z7.string().nullable(),
|
|
456
|
+
submittedBy: z7.string().nullable(),
|
|
457
|
+
value: effortSchema.nullable(),
|
|
458
|
+
effort: effortSchema.nullable(),
|
|
233
459
|
order: z7.number().int(),
|
|
234
460
|
createdAt: z7.string(),
|
|
235
|
-
createdBy: z7.string()
|
|
236
|
-
updatedAt: z7.string().nullable()
|
|
461
|
+
createdBy: z7.string()
|
|
237
462
|
});
|
|
238
|
-
var
|
|
463
|
+
var createIdeaSchema = z7.object({
|
|
239
464
|
title: z7.string().min(1),
|
|
240
|
-
description: z7.string().nullable().optional()
|
|
465
|
+
description: z7.string().nullable().optional(),
|
|
466
|
+
status: ideaStatusSchema.optional(),
|
|
467
|
+
effort: effortSchema.nullable().optional(),
|
|
468
|
+
source: z7.string().nullable().optional()
|
|
241
469
|
});
|
|
242
|
-
var
|
|
470
|
+
var updateIdeaSchema = z7.object({
|
|
243
471
|
title: z7.string().min(1).optional(),
|
|
244
|
-
description: z7.string().nullable().optional()
|
|
472
|
+
description: z7.string().nullable().optional(),
|
|
473
|
+
status: ideaStatusSchema.optional(),
|
|
474
|
+
effort: effortSchema.nullable().optional(),
|
|
475
|
+
source: z7.string().nullable().optional(),
|
|
476
|
+
order: z7.number().int().optional()
|
|
245
477
|
});
|
|
246
|
-
var
|
|
247
|
-
// ../../packages/shared/src/schemas/
|
|
478
|
+
var ideaListSchema = z7.array(ideaSchema);
|
|
479
|
+
// ../../packages/shared/src/schemas/presentation.ts
|
|
248
480
|
import { z as z8 } from "zod";
|
|
249
|
-
var
|
|
481
|
+
var presentationSchema = z8.object({
|
|
250
482
|
id: z8.string().uuid(),
|
|
251
483
|
organizationId: z8.string(),
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
name: z8.string(),
|
|
484
|
+
title: z8.string(),
|
|
485
|
+
description: z8.string().nullable(),
|
|
255
486
|
order: z8.number().int(),
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
487
|
+
createdAt: z8.string(),
|
|
488
|
+
createdBy: z8.string(),
|
|
489
|
+
updatedAt: z8.string().nullable()
|
|
490
|
+
});
|
|
491
|
+
var createPresentationSchema = z8.object({
|
|
492
|
+
title: z8.string().min(1),
|
|
493
|
+
description: z8.string().nullable().optional()
|
|
494
|
+
});
|
|
495
|
+
var updatePresentationSchema = z8.object({
|
|
496
|
+
title: z8.string().min(1).optional(),
|
|
497
|
+
description: z8.string().nullable().optional()
|
|
498
|
+
});
|
|
499
|
+
var presentationListSchema = z8.array(presentationSchema);
|
|
500
|
+
// ../../packages/shared/src/schemas/product.ts
|
|
501
|
+
import { z as z9 } from "zod";
|
|
502
|
+
var productSchema = z9.object({
|
|
503
|
+
id: z9.string().uuid(),
|
|
504
|
+
organizationId: z9.string(),
|
|
505
|
+
parentId: z9.string().uuid().nullable(),
|
|
506
|
+
type: productTypeSchema,
|
|
507
|
+
name: z9.string(),
|
|
508
|
+
order: z9.number().int(),
|
|
509
|
+
isExpanded: z9.boolean(),
|
|
510
|
+
deletedAt: z9.string().nullable(),
|
|
511
|
+
createdAt: z9.string()
|
|
259
512
|
});
|
|
260
|
-
var createProductSchema =
|
|
261
|
-
name:
|
|
262
|
-
description:
|
|
513
|
+
var createProductSchema = z9.object({
|
|
514
|
+
name: z9.string().min(1),
|
|
515
|
+
description: z9.string().nullable().optional(),
|
|
263
516
|
type: productTypeSchema,
|
|
264
|
-
parentId:
|
|
517
|
+
parentId: z9.string().uuid().nullable().optional()
|
|
265
518
|
});
|
|
266
|
-
var updateProductSchema =
|
|
267
|
-
name:
|
|
268
|
-
description:
|
|
519
|
+
var updateProductSchema = z9.object({
|
|
520
|
+
name: z9.string().min(1).optional(),
|
|
521
|
+
description: z9.string().nullable().optional(),
|
|
269
522
|
type: productTypeSchema.optional(),
|
|
270
|
-
parentId:
|
|
271
|
-
order:
|
|
523
|
+
parentId: z9.string().uuid().nullable().optional(),
|
|
524
|
+
order: z9.number().int().optional()
|
|
272
525
|
});
|
|
273
|
-
var productListSchema =
|
|
526
|
+
var productListSchema = z9.array(productSchema);
|
|
274
527
|
// ../../packages/shared/src/schemas/roadmap.ts
|
|
275
|
-
import { z as
|
|
528
|
+
import { z as z11 } from "zod";
|
|
276
529
|
|
|
277
530
|
// ../../packages/shared/src/schemas/story.ts
|
|
278
|
-
import { z as
|
|
279
|
-
var epicSchema =
|
|
280
|
-
id:
|
|
281
|
-
roadmapItemId:
|
|
282
|
-
organizationId:
|
|
283
|
-
title:
|
|
284
|
-
description:
|
|
285
|
-
order:
|
|
286
|
-
createdAt:
|
|
287
|
-
updatedAt:
|
|
288
|
-
deletedAt:
|
|
531
|
+
import { z as z10 } from "zod";
|
|
532
|
+
var epicSchema = z10.object({
|
|
533
|
+
id: z10.string().uuid(),
|
|
534
|
+
roadmapItemId: z10.string().uuid(),
|
|
535
|
+
organizationId: z10.string(),
|
|
536
|
+
title: z10.string(),
|
|
537
|
+
description: z10.string().nullable(),
|
|
538
|
+
order: z10.number().int(),
|
|
539
|
+
createdAt: z10.string(),
|
|
540
|
+
updatedAt: z10.string(),
|
|
541
|
+
deletedAt: z10.string().nullable()
|
|
289
542
|
});
|
|
290
|
-
var storySchema =
|
|
291
|
-
id:
|
|
292
|
-
roadmapItemId:
|
|
293
|
-
epicId:
|
|
294
|
-
organizationId:
|
|
295
|
-
title:
|
|
296
|
-
description:
|
|
297
|
-
order:
|
|
298
|
-
createdAt:
|
|
299
|
-
updatedAt:
|
|
300
|
-
deletedAt:
|
|
543
|
+
var storySchema = z10.object({
|
|
544
|
+
id: z10.string().uuid(),
|
|
545
|
+
roadmapItemId: z10.string().uuid(),
|
|
546
|
+
epicId: z10.string().uuid().nullable(),
|
|
547
|
+
organizationId: z10.string(),
|
|
548
|
+
title: z10.string(),
|
|
549
|
+
description: z10.string().nullable(),
|
|
550
|
+
order: z10.number().int(),
|
|
551
|
+
createdAt: z10.string(),
|
|
552
|
+
updatedAt: z10.string(),
|
|
553
|
+
deletedAt: z10.string().nullable()
|
|
301
554
|
});
|
|
302
555
|
var epicWithStoriesSchema = epicSchema.extend({
|
|
303
|
-
stories:
|
|
556
|
+
stories: z10.array(storySchema)
|
|
304
557
|
});
|
|
305
|
-
var createEpicSchema =
|
|
306
|
-
title:
|
|
307
|
-
description:
|
|
558
|
+
var createEpicSchema = z10.object({
|
|
559
|
+
title: z10.string().min(1),
|
|
560
|
+
description: z10.string().nullable().optional()
|
|
308
561
|
});
|
|
309
|
-
var createStorySchema =
|
|
310
|
-
title:
|
|
311
|
-
description:
|
|
562
|
+
var createStorySchema = z10.object({
|
|
563
|
+
title: z10.string().min(1),
|
|
564
|
+
description: z10.string().nullable().optional()
|
|
312
565
|
});
|
|
313
|
-
var saveStoriesInputSchema =
|
|
314
|
-
epics:
|
|
315
|
-
title:
|
|
316
|
-
description:
|
|
317
|
-
stories:
|
|
318
|
-
title:
|
|
319
|
-
description:
|
|
566
|
+
var saveStoriesInputSchema = z10.object({
|
|
567
|
+
epics: z10.array(z10.object({
|
|
568
|
+
title: z10.string().min(1),
|
|
569
|
+
description: z10.string().nullable().optional(),
|
|
570
|
+
stories: z10.array(z10.object({
|
|
571
|
+
title: z10.string().min(1),
|
|
572
|
+
description: z10.string().nullable().optional()
|
|
320
573
|
})).optional().default([])
|
|
321
574
|
})).optional().default([]),
|
|
322
|
-
stories:
|
|
323
|
-
title:
|
|
324
|
-
description:
|
|
575
|
+
stories: z10.array(z10.object({
|
|
576
|
+
title: z10.string().min(1),
|
|
577
|
+
description: z10.string().nullable().optional()
|
|
325
578
|
})).optional().default([])
|
|
326
579
|
});
|
|
327
|
-
var updateEpicSchema =
|
|
328
|
-
title:
|
|
329
|
-
description:
|
|
580
|
+
var updateEpicSchema = z10.object({
|
|
581
|
+
title: z10.string().min(1).optional(),
|
|
582
|
+
description: z10.string().nullable().optional()
|
|
330
583
|
});
|
|
331
|
-
var updateStorySchema =
|
|
332
|
-
title:
|
|
333
|
-
description:
|
|
334
|
-
epicId:
|
|
584
|
+
var updateStorySchema = z10.object({
|
|
585
|
+
title: z10.string().min(1).optional(),
|
|
586
|
+
description: z10.string().nullable().optional(),
|
|
587
|
+
epicId: z10.string().uuid().nullable().optional()
|
|
335
588
|
});
|
|
336
|
-
var reorderStoriesSchema =
|
|
337
|
-
epicOrder:
|
|
338
|
-
storyOrder:
|
|
339
|
-
standaloneOrder:
|
|
589
|
+
var reorderStoriesSchema = z10.object({
|
|
590
|
+
epicOrder: z10.array(z10.string().uuid()).optional(),
|
|
591
|
+
storyOrder: z10.record(z10.string(), z10.array(z10.string().uuid())).optional(),
|
|
592
|
+
standaloneOrder: z10.array(z10.string().uuid()).optional()
|
|
340
593
|
});
|
|
341
594
|
|
|
342
595
|
// ../../packages/shared/src/schemas/roadmap.ts
|
|
343
|
-
var flexibleDateSchema =
|
|
344
|
-
value:
|
|
596
|
+
var flexibleDateSchema = z11.object({
|
|
597
|
+
value: z11.string(),
|
|
345
598
|
granularity: dateGranularitySchema
|
|
346
599
|
});
|
|
347
|
-
var labelSchema =
|
|
348
|
-
id:
|
|
349
|
-
type:
|
|
350
|
-
name:
|
|
351
|
-
color:
|
|
352
|
-
address:
|
|
600
|
+
var labelSchema = z11.object({
|
|
601
|
+
id: z11.string().uuid(),
|
|
602
|
+
type: z11.enum(["category", "location", "label"]),
|
|
603
|
+
name: z11.string(),
|
|
604
|
+
color: z11.string().nullable(),
|
|
605
|
+
address: z11.string().nullable()
|
|
353
606
|
});
|
|
354
|
-
var appSchema =
|
|
355
|
-
id:
|
|
356
|
-
name:
|
|
607
|
+
var appSchema = z11.object({
|
|
608
|
+
id: z11.string().uuid(),
|
|
609
|
+
name: z11.string()
|
|
357
610
|
});
|
|
358
|
-
var roadmapSchema =
|
|
359
|
-
id:
|
|
360
|
-
organizationId:
|
|
361
|
-
title:
|
|
611
|
+
var roadmapSchema = z11.object({
|
|
612
|
+
id: z11.string().uuid(),
|
|
613
|
+
organizationId: z11.string(),
|
|
614
|
+
title: z11.string(),
|
|
362
615
|
horizon: horizonSchema.nullable(),
|
|
363
616
|
status: roadmapStatusSchema.nullable(),
|
|
364
617
|
value: effortSchema.nullable(),
|
|
365
618
|
effort: effortSchema.nullable(),
|
|
366
|
-
order:
|
|
367
|
-
estimatedSeconds:
|
|
619
|
+
order: z11.number().int(),
|
|
620
|
+
estimatedSeconds: z11.number().int().nullable(),
|
|
368
621
|
date: flexibleDateSchema.nullable(),
|
|
369
622
|
target: flexibleDateSchema.nullable(),
|
|
370
|
-
completedAt:
|
|
371
|
-
createdAt:
|
|
372
|
-
createdBy:
|
|
373
|
-
prompt:
|
|
374
|
-
labels:
|
|
375
|
-
apps:
|
|
623
|
+
completedAt: z11.string().nullable(),
|
|
624
|
+
createdAt: z11.string(),
|
|
625
|
+
createdBy: z11.string(),
|
|
626
|
+
prompt: z11.string().nullable(),
|
|
627
|
+
labels: z11.array(labelSchema),
|
|
628
|
+
apps: z11.array(appSchema)
|
|
376
629
|
});
|
|
377
|
-
var createRoadmapSchema =
|
|
378
|
-
title:
|
|
630
|
+
var createRoadmapSchema = z11.object({
|
|
631
|
+
title: z11.string().min(1),
|
|
379
632
|
status: roadmapStatusSchema.optional(),
|
|
380
633
|
horizon: horizonSchema.optional(),
|
|
381
634
|
value: effortSchema.nullable().optional(),
|
|
382
635
|
effort: effortSchema.nullable().optional(),
|
|
383
|
-
estimatedSeconds:
|
|
636
|
+
estimatedSeconds: z11.number().int().nullable().optional(),
|
|
384
637
|
date: flexibleDateSchema.nullable().optional(),
|
|
385
638
|
target: flexibleDateSchema.nullable().optional(),
|
|
386
|
-
prompt:
|
|
387
|
-
brainstormNotes:
|
|
639
|
+
prompt: z11.string().nullable().optional(),
|
|
640
|
+
brainstormNotes: z11.string().nullable().optional()
|
|
388
641
|
});
|
|
389
|
-
var updateRoadmapSchema =
|
|
390
|
-
title:
|
|
642
|
+
var updateRoadmapSchema = z11.object({
|
|
643
|
+
title: z11.string().min(1).optional(),
|
|
391
644
|
status: roadmapStatusSchema.optional(),
|
|
392
645
|
horizon: horizonSchema.optional(),
|
|
393
646
|
value: effortSchema.nullable().optional(),
|
|
394
647
|
effort: effortSchema.nullable().optional(),
|
|
395
|
-
order:
|
|
396
|
-
estimatedSeconds:
|
|
648
|
+
order: z11.number().int().optional(),
|
|
649
|
+
estimatedSeconds: z11.number().int().nullable().optional(),
|
|
397
650
|
date: flexibleDateSchema.nullable().optional(),
|
|
398
651
|
target: flexibleDateSchema.nullable().optional(),
|
|
399
|
-
prompt:
|
|
400
|
-
brainstormNotes:
|
|
652
|
+
prompt: z11.string().nullable().optional(),
|
|
653
|
+
brainstormNotes: z11.string().nullable().optional()
|
|
401
654
|
});
|
|
402
|
-
var prdOutcomeSchema =
|
|
403
|
-
id:
|
|
404
|
-
description:
|
|
655
|
+
var prdOutcomeSchema = z11.object({
|
|
656
|
+
id: z11.string().uuid(),
|
|
657
|
+
description: z11.string(),
|
|
405
658
|
status: prdStatusSchema,
|
|
406
|
-
order:
|
|
407
|
-
completedAt:
|
|
659
|
+
order: z11.number().int(),
|
|
660
|
+
completedAt: z11.string().nullable()
|
|
408
661
|
});
|
|
409
|
-
var prdSchema =
|
|
410
|
-
id:
|
|
411
|
-
what:
|
|
412
|
-
why:
|
|
413
|
-
outcomes:
|
|
662
|
+
var prdSchema = z11.object({
|
|
663
|
+
id: z11.string().uuid(),
|
|
664
|
+
what: z11.string().nullable(),
|
|
665
|
+
why: z11.string().nullable(),
|
|
666
|
+
outcomes: z11.array(prdOutcomeSchema)
|
|
414
667
|
});
|
|
415
|
-
var savePrdInputSchema =
|
|
416
|
-
what:
|
|
417
|
-
why:
|
|
668
|
+
var savePrdInputSchema = z11.object({
|
|
669
|
+
what: z11.string().nullable(),
|
|
670
|
+
why: z11.string().nullable(),
|
|
418
671
|
status: prdStatusSchema,
|
|
419
|
-
outcomes:
|
|
420
|
-
id:
|
|
421
|
-
description:
|
|
422
|
-
order:
|
|
672
|
+
outcomes: z11.array(z11.object({
|
|
673
|
+
id: z11.string().uuid().optional(),
|
|
674
|
+
description: z11.string(),
|
|
675
|
+
order: z11.number().int().min(0)
|
|
423
676
|
}))
|
|
424
677
|
});
|
|
425
|
-
var brainstormMediaSchema =
|
|
426
|
-
id:
|
|
427
|
-
mediaUrl:
|
|
678
|
+
var brainstormMediaSchema = z11.object({
|
|
679
|
+
id: z11.string().uuid(),
|
|
680
|
+
mediaUrl: z11.string(),
|
|
428
681
|
mediaType: brainstormMediaTypeSchema,
|
|
429
|
-
description:
|
|
430
|
-
order:
|
|
431
|
-
createdAt:
|
|
682
|
+
description: z11.string().nullable(),
|
|
683
|
+
order: z11.number().int(),
|
|
684
|
+
createdAt: z11.string()
|
|
432
685
|
});
|
|
433
|
-
var wireframeSchema =
|
|
434
|
-
id:
|
|
435
|
-
description:
|
|
436
|
-
imageUrl:
|
|
437
|
-
order:
|
|
686
|
+
var wireframeSchema = z11.object({
|
|
687
|
+
id: z11.string().uuid(),
|
|
688
|
+
description: z11.string().nullable(),
|
|
689
|
+
imageUrl: z11.string().nullable(),
|
|
690
|
+
order: z11.number().int()
|
|
438
691
|
});
|
|
439
|
-
var prototypeSchema =
|
|
440
|
-
id:
|
|
441
|
-
publicUrl:
|
|
442
|
-
expiresAt:
|
|
443
|
-
fileCount:
|
|
444
|
-
entryPoint:
|
|
445
|
-
createdAt:
|
|
692
|
+
var prototypeSchema = z11.object({
|
|
693
|
+
id: z11.string().uuid(),
|
|
694
|
+
publicUrl: z11.string().url(),
|
|
695
|
+
expiresAt: z11.string().datetime(),
|
|
696
|
+
fileCount: z11.number().int().positive(),
|
|
697
|
+
entryPoint: z11.string(),
|
|
698
|
+
createdAt: z11.string().datetime()
|
|
446
699
|
});
|
|
447
|
-
var featureLinkSchema =
|
|
448
|
-
id:
|
|
449
|
-
featureId:
|
|
450
|
-
feature:
|
|
451
|
-
id:
|
|
452
|
-
name:
|
|
453
|
-
type:
|
|
700
|
+
var featureLinkSchema = z11.object({
|
|
701
|
+
id: z11.string().uuid(),
|
|
702
|
+
featureId: z11.string().uuid(),
|
|
703
|
+
feature: z11.object({
|
|
704
|
+
id: z11.string().uuid(),
|
|
705
|
+
name: z11.string(),
|
|
706
|
+
type: z11.enum(["area", "feature"])
|
|
454
707
|
}),
|
|
455
|
-
createdAt:
|
|
708
|
+
createdAt: z11.string()
|
|
456
709
|
});
|
|
457
|
-
var phaseDesignSchema =
|
|
458
|
-
id:
|
|
459
|
-
description:
|
|
710
|
+
var phaseDesignSchema = z11.object({
|
|
711
|
+
id: z11.string().uuid(),
|
|
712
|
+
description: z11.string().nullable()
|
|
460
713
|
});
|
|
461
|
-
var phasePlanSchema =
|
|
462
|
-
id:
|
|
463
|
-
description:
|
|
714
|
+
var phasePlanSchema = z11.object({
|
|
715
|
+
id: z11.string().uuid(),
|
|
716
|
+
description: z11.string().nullable()
|
|
464
717
|
});
|
|
465
|
-
var phaseBuildSchema =
|
|
466
|
-
id:
|
|
467
|
-
description:
|
|
468
|
-
prompt:
|
|
718
|
+
var phaseBuildSchema = z11.object({
|
|
719
|
+
id: z11.string().uuid(),
|
|
720
|
+
description: z11.string().nullable(),
|
|
721
|
+
prompt: z11.string().nullable()
|
|
469
722
|
});
|
|
470
|
-
var phaseReleaseSchema =
|
|
471
|
-
id:
|
|
472
|
-
description:
|
|
723
|
+
var phaseReleaseSchema = z11.object({
|
|
724
|
+
id: z11.string().uuid(),
|
|
725
|
+
description: z11.string().nullable()
|
|
473
726
|
});
|
|
474
727
|
var roadmapDetailSchema = roadmapSchema.extend({
|
|
475
728
|
prd: prdSchema.nullable(),
|
|
476
|
-
wireframes:
|
|
477
|
-
prototypes:
|
|
478
|
-
brainstormMedia:
|
|
479
|
-
brainstormNotes:
|
|
480
|
-
featureLinks:
|
|
481
|
-
epics:
|
|
482
|
-
stories:
|
|
729
|
+
wireframes: z11.array(wireframeSchema),
|
|
730
|
+
prototypes: z11.array(prototypeSchema),
|
|
731
|
+
brainstormMedia: z11.array(brainstormMediaSchema),
|
|
732
|
+
brainstormNotes: z11.string().nullable(),
|
|
733
|
+
featureLinks: z11.array(featureLinkSchema),
|
|
734
|
+
epics: z11.array(epicWithStoriesSchema),
|
|
735
|
+
stories: z11.array(storySchema),
|
|
483
736
|
design: phaseDesignSchema.nullable(),
|
|
484
737
|
plan: phasePlanSchema.nullable(),
|
|
485
738
|
build: phaseBuildSchema.nullable(),
|
|
486
739
|
release: phaseReleaseSchema.nullable(),
|
|
487
|
-
exports:
|
|
740
|
+
exports: z11.array(exportSchema)
|
|
488
741
|
});
|
|
489
|
-
var roadmapListSchema =
|
|
742
|
+
var roadmapListSchema = z11.array(roadmapSchema);
|
|
490
743
|
// ../../packages/shared/src/schemas/scenario.ts
|
|
491
|
-
import { z as
|
|
492
|
-
var scenarioSchema =
|
|
493
|
-
id:
|
|
494
|
-
title:
|
|
495
|
-
given:
|
|
496
|
-
when:
|
|
497
|
-
then:
|
|
498
|
-
order:
|
|
499
|
-
createdAt:
|
|
500
|
-
updatedAt:
|
|
744
|
+
import { z as z12 } from "zod";
|
|
745
|
+
var scenarioSchema = z12.object({
|
|
746
|
+
id: z12.string().uuid(),
|
|
747
|
+
title: z12.string().min(1),
|
|
748
|
+
given: z12.string().nullable(),
|
|
749
|
+
when: z12.string().nullable(),
|
|
750
|
+
then: z12.string().nullable(),
|
|
751
|
+
order: z12.number().int(),
|
|
752
|
+
createdAt: z12.string().datetime(),
|
|
753
|
+
updatedAt: z12.string().datetime()
|
|
501
754
|
});
|
|
502
|
-
var createScenarioSchema =
|
|
503
|
-
title:
|
|
504
|
-
given:
|
|
505
|
-
when:
|
|
506
|
-
then:
|
|
507
|
-
roadmapId:
|
|
755
|
+
var createScenarioSchema = z12.object({
|
|
756
|
+
title: z12.string().min(1),
|
|
757
|
+
given: z12.string().nullable().optional(),
|
|
758
|
+
when: z12.string().nullable().optional(),
|
|
759
|
+
then: z12.string().nullable().optional(),
|
|
760
|
+
roadmapId: z12.string().uuid()
|
|
508
761
|
});
|
|
509
|
-
var updateScenarioSchema =
|
|
510
|
-
title:
|
|
511
|
-
given:
|
|
512
|
-
when:
|
|
513
|
-
then:
|
|
514
|
-
order:
|
|
762
|
+
var updateScenarioSchema = z12.object({
|
|
763
|
+
title: z12.string().min(1).optional(),
|
|
764
|
+
given: z12.string().nullable().optional(),
|
|
765
|
+
when: z12.string().nullable().optional(),
|
|
766
|
+
then: z12.string().nullable().optional(),
|
|
767
|
+
order: z12.number().int().optional()
|
|
515
768
|
});
|
|
516
|
-
var scenarioListSchema =
|
|
769
|
+
var scenarioListSchema = z12.array(scenarioSchema);
|
|
517
770
|
// ../../packages/shared/src/schemas/slide.ts
|
|
518
|
-
import { z as
|
|
771
|
+
import { z as z13 } from "zod";
|
|
519
772
|
var SLIDE_TYPES = [
|
|
520
773
|
"title",
|
|
521
774
|
"section_header",
|
|
@@ -530,151 +783,596 @@ 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/tool-inputs.ts
|
|
907
|
+
import { z as z15 } from "zod";
|
|
908
|
+
var paginationFields = {
|
|
909
|
+
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
910
|
+
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
911
|
+
};
|
|
912
|
+
var idField = (entity) => z15.string().describe(`The UUID of the ${entity}`);
|
|
913
|
+
var uuidField = (entity) => z15.string().uuid().describe(`The UUID of the ${entity}`);
|
|
914
|
+
var orderItemsField = (entity) => z15.array(z15.object({
|
|
915
|
+
id: z15.string().describe(`The UUID of the ${entity}`),
|
|
916
|
+
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
917
|
+
})).describe(`Array of ${entity}s with their new order values`);
|
|
918
|
+
var yyyyMmDdField = (description) => z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe(description);
|
|
919
|
+
var sizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
|
|
920
|
+
var searchRoadmapsInput = {
|
|
921
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
922
|
+
status: roadmapStatusSchema.optional().describe("Filter by status"),
|
|
923
|
+
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
924
|
+
phase: z15.string().optional().describe("Filter by phase"),
|
|
925
|
+
phaseStep: z15.string().optional().describe("Filter by phase step"),
|
|
926
|
+
...paginationFields
|
|
927
|
+
};
|
|
928
|
+
var getRoadmapInput = {
|
|
929
|
+
id: idField("roadmap item")
|
|
930
|
+
};
|
|
931
|
+
var createRoadmapItemInput = {
|
|
932
|
+
title: z15.string().describe("Title of the roadmap item"),
|
|
933
|
+
status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
|
|
934
|
+
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
935
|
+
phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
|
|
936
|
+
phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
|
|
937
|
+
initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
|
|
938
|
+
dateGranularity: dateGranularitySchema.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
939
|
+
dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
940
|
+
targetGranularity: dateGranularitySchema.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
941
|
+
targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
942
|
+
};
|
|
943
|
+
var updateRoadmapItemInput = {
|
|
944
|
+
id: idField("roadmap item to update"),
|
|
945
|
+
title: z15.string().optional().describe("New title"),
|
|
946
|
+
status: roadmapStatusSchema.optional().describe("New status"),
|
|
947
|
+
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
948
|
+
phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
|
|
949
|
+
phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
|
|
950
|
+
value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
|
|
951
|
+
effort: effortSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
|
|
952
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
|
|
953
|
+
initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
|
|
954
|
+
designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
|
|
955
|
+
planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
|
|
956
|
+
buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
|
|
957
|
+
releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
|
|
958
|
+
prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
|
|
959
|
+
dateGranularity: dateGranularitySchema.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
960
|
+
dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
961
|
+
targetGranularity: dateGranularitySchema.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
962
|
+
targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
963
|
+
};
|
|
964
|
+
var deleteRoadmapItemInput = {
|
|
965
|
+
id: idField("roadmap item to delete")
|
|
966
|
+
};
|
|
967
|
+
var reorderRoadmapsInput = {
|
|
968
|
+
items: z15.array(z15.object({
|
|
969
|
+
id: z15.string().describe("The UUID of the roadmap item"),
|
|
970
|
+
order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
|
|
971
|
+
})).describe("Array of roadmap items with their new order values")
|
|
972
|
+
};
|
|
973
|
+
var savePrdInput = {
|
|
974
|
+
roadmapId: idField("roadmap item"),
|
|
975
|
+
what: z15.string().nullable().describe("What is being built - the feature description"),
|
|
976
|
+
why: z15.string().nullable().describe("Why this is being built - the business justification"),
|
|
977
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
|
|
978
|
+
};
|
|
979
|
+
var updateBrainstormNotesInput = {
|
|
980
|
+
roadmapId: idField("roadmap item"),
|
|
981
|
+
notes: z15.string().describe("The brainstorm notes content")
|
|
982
|
+
};
|
|
983
|
+
var searchFeaturesInput = {
|
|
984
|
+
query: z15.string().optional().describe("Search query to match against name"),
|
|
985
|
+
type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
|
|
986
|
+
};
|
|
987
|
+
var getFeatureInput = {
|
|
988
|
+
id: idField("feature")
|
|
989
|
+
};
|
|
990
|
+
var addFeatureInput = {
|
|
991
|
+
name: z15.string().describe("Name of the feature"),
|
|
992
|
+
description: z15.string().optional().describe("Description of the feature"),
|
|
993
|
+
type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
|
|
994
|
+
parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
|
|
995
|
+
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
|
|
996
|
+
linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
|
|
997
|
+
};
|
|
998
|
+
var updateFeatureInput = {
|
|
999
|
+
id: idField("feature to update"),
|
|
1000
|
+
name: z15.string().optional().describe("New name for the feature"),
|
|
1001
|
+
type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
|
|
1002
|
+
parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
|
|
1003
|
+
};
|
|
1004
|
+
var deleteFeatureInput = {
|
|
1005
|
+
id: idField("feature to delete")
|
|
1006
|
+
};
|
|
1007
|
+
var searchIdeasInput = {
|
|
1008
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1009
|
+
status: ideaStatusSchema.optional().describe("Filter by status")
|
|
1010
|
+
};
|
|
1011
|
+
var getIdeaInput = {
|
|
1012
|
+
id: idField("idea")
|
|
1013
|
+
};
|
|
1014
|
+
var captureIdeaInput = {
|
|
1015
|
+
title: z15.string().describe("Title of the idea"),
|
|
1016
|
+
description: z15.string().optional().describe("Detailed description of the idea"),
|
|
1017
|
+
source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
|
|
1018
|
+
};
|
|
1019
|
+
var updateIdeaInput = {
|
|
1020
|
+
id: idField("idea to update"),
|
|
1021
|
+
title: z15.string().optional().describe("New title"),
|
|
1022
|
+
description: z15.string().nullable().optional().describe("New description"),
|
|
1023
|
+
status: ideaStatusSchema.optional().describe("New status"),
|
|
1024
|
+
value: sizeSchema.nullable().optional().describe("Estimated value"),
|
|
1025
|
+
effort: sizeSchema.nullable().optional().describe("Estimated effort")
|
|
1026
|
+
};
|
|
1027
|
+
var deleteIdeaInput = {
|
|
1028
|
+
id: idField("idea to delete")
|
|
1029
|
+
};
|
|
1030
|
+
var updateStrategyInput = {
|
|
1031
|
+
vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
|
|
1032
|
+
mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
|
|
1033
|
+
};
|
|
1034
|
+
var createScenarioInput = {
|
|
1035
|
+
title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
|
|
1036
|
+
description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
|
|
1037
|
+
};
|
|
1038
|
+
var updateScenarioInput = {
|
|
1039
|
+
id: idField("scenario to update"),
|
|
1040
|
+
title: z15.string().optional().describe("New title"),
|
|
1041
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
1042
|
+
};
|
|
1043
|
+
var deleteScenarioInput = {
|
|
1044
|
+
id: idField("scenario to delete")
|
|
1045
|
+
};
|
|
1046
|
+
var searchProductsInput = {
|
|
1047
|
+
query: z15.string().optional().describe("Search query to match against product name"),
|
|
1048
|
+
type: productTypeSchema.optional().describe("Filter by product type")
|
|
1049
|
+
};
|
|
1050
|
+
var getProductInput = {
|
|
1051
|
+
id: idField("product")
|
|
1052
|
+
};
|
|
1053
|
+
var createProductInput = {
|
|
1054
|
+
type: productTypeSchema.describe("Type of product"),
|
|
1055
|
+
name: z15.string().describe("Name of the product"),
|
|
1056
|
+
parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
|
|
1057
|
+
};
|
|
1058
|
+
var updateProductInput = {
|
|
1059
|
+
id: idField("product to update"),
|
|
1060
|
+
name: z15.string().optional().describe("New name"),
|
|
1061
|
+
parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
|
|
1062
|
+
};
|
|
1063
|
+
var deleteProductInput = {
|
|
1064
|
+
id: idField("product to delete")
|
|
1065
|
+
};
|
|
1066
|
+
var getProductDocumentationInput = {
|
|
1067
|
+
productId: idField("product")
|
|
1068
|
+
};
|
|
1069
|
+
var updateProductDocumentationInput = {
|
|
1070
|
+
productId: idField("product"),
|
|
1071
|
+
designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
|
|
1072
|
+
adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
|
|
1073
|
+
};
|
|
1074
|
+
var createAudienceInput = {
|
|
1075
|
+
name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
|
|
1076
|
+
description: z15.string().nullable().optional().describe("Description of the audience")
|
|
1077
|
+
};
|
|
1078
|
+
var updateAudienceInput = {
|
|
1079
|
+
id: idField("audience to update"),
|
|
1080
|
+
name: z15.string().optional().describe("New name"),
|
|
1081
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
1082
|
+
};
|
|
1083
|
+
var deleteAudienceInput = {
|
|
1084
|
+
id: idField("audience to delete")
|
|
1085
|
+
};
|
|
1086
|
+
var getHistoryInput = {
|
|
1087
|
+
startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
|
|
1088
|
+
endDate: yyyyMmDdField("End date in YYYY-MM-DD format"),
|
|
1089
|
+
entityType: z15.enum([
|
|
1090
|
+
"roadmap",
|
|
1091
|
+
"feature",
|
|
1092
|
+
"idea",
|
|
1093
|
+
"prd",
|
|
1094
|
+
"wireframe",
|
|
1095
|
+
"product",
|
|
1096
|
+
"audience",
|
|
1097
|
+
"scenario"
|
|
1098
|
+
]).optional().describe("Filter to specific entity type")
|
|
1099
|
+
};
|
|
1100
|
+
var getHistorySummaryInput = {
|
|
1101
|
+
startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
|
|
1102
|
+
endDate: yyyyMmDdField("End date in YYYY-MM-DD format")
|
|
1103
|
+
};
|
|
1104
|
+
var createStatusUpdateInput = {
|
|
1105
|
+
startDate: yyyyMmDdField("Report period start date in YYYY-MM-DD format"),
|
|
1106
|
+
endDate: yyyyMmDdField("Report period end date in YYYY-MM-DD format"),
|
|
1107
|
+
content: z15.string().describe("The markdown content of the status report"),
|
|
1108
|
+
title: z15.string().optional().describe("Optional title for the report"),
|
|
1109
|
+
items: z15.array(z15.object({
|
|
1110
|
+
roadmapItemId: z15.string().describe("UUID of the roadmap item"),
|
|
1111
|
+
status: z15.string().describe("Status of the item at report creation time")
|
|
1112
|
+
})).optional().describe("Roadmap items to include in the report snapshot")
|
|
1113
|
+
};
|
|
1114
|
+
var saveStoriesInput = {
|
|
1115
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
1116
|
+
epics: z15.array(z15.object({
|
|
1117
|
+
title: z15.string().min(1).describe("Title of the epic"),
|
|
1118
|
+
description: z15.string().nullable().optional().describe("Description of the epic"),
|
|
1119
|
+
stories: z15.array(z15.object({
|
|
1120
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
1121
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
1122
|
+
})).optional().describe("Stories within this epic")
|
|
1123
|
+
})).optional().describe("List of epics with their nested stories"),
|
|
1124
|
+
stories: z15.array(z15.object({
|
|
1125
|
+
title: z15.string().min(1).describe("Title of the story"),
|
|
1126
|
+
description: z15.string().nullable().optional().describe("Description of the story")
|
|
1127
|
+
})).optional().describe("List of standalone stories (not part of any epic)")
|
|
1128
|
+
};
|
|
1129
|
+
var searchInitiativesInput = {
|
|
1130
|
+
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1131
|
+
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
1132
|
+
...paginationFields
|
|
1133
|
+
};
|
|
1134
|
+
var getInitiativeInput = {
|
|
1135
|
+
id: idField("initiative")
|
|
1136
|
+
};
|
|
1137
|
+
var createInitiativeInput = {
|
|
1138
|
+
title: z15.string().describe("Title of the initiative"),
|
|
1139
|
+
description: z15.string().optional().describe("Description of the initiative (markdown)"),
|
|
1140
|
+
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
1141
|
+
dateGranularity: dateGranularitySchema.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
|
|
1142
|
+
dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
|
|
1143
|
+
targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
|
|
1144
|
+
};
|
|
1145
|
+
var updateInitiativeInput = {
|
|
1146
|
+
id: idField("initiative to update"),
|
|
1147
|
+
title: z15.string().optional().describe("New title"),
|
|
1148
|
+
description: z15.string().nullable().optional().describe("New description (null to clear)"),
|
|
1149
|
+
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
1150
|
+
dateGranularity: dateGranularitySchema.nullable().optional().describe("New target date granularity (null to clear)"),
|
|
1151
|
+
dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
|
|
1152
|
+
targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
|
|
1153
|
+
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
|
|
1154
|
+
};
|
|
1155
|
+
var deleteInitiativeInput = {
|
|
1156
|
+
id: idField("initiative to delete")
|
|
1157
|
+
};
|
|
1158
|
+
var reorderInitiativesInput = {
|
|
1159
|
+
items: orderItemsField("initiative")
|
|
1160
|
+
};
|
|
1161
|
+
var uploadWireframeInput = {
|
|
1162
|
+
roadmapId: idField("roadmap item"),
|
|
1163
|
+
filePath: z15.string().describe("Absolute path to the image file on disk"),
|
|
1164
|
+
description: z15.string().optional().describe("Optional description of the wireframe"),
|
|
1165
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
|
|
1166
|
+
};
|
|
1167
|
+
var updateWireframeInput = {
|
|
1168
|
+
id: idField("wireframe"),
|
|
1169
|
+
description: z15.string().nullable().optional().describe("New description for the wireframe"),
|
|
1170
|
+
outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
|
|
1171
|
+
};
|
|
1172
|
+
var deleteWireframeInput = {
|
|
1173
|
+
id: idField("wireframe to delete")
|
|
1174
|
+
};
|
|
1175
|
+
var uploadBrainstormMediaInput = {
|
|
1176
|
+
roadmapId: idField("roadmap item"),
|
|
1177
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
1178
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
1179
|
+
};
|
|
1180
|
+
var updateBrainstormMediaInput = {
|
|
1181
|
+
id: idField("brainstorm media"),
|
|
1182
|
+
description: z15.string().nullable().describe("New description for the media")
|
|
1183
|
+
};
|
|
1184
|
+
var deleteBrainstormMediaInput = {
|
|
1185
|
+
id: idField("brainstorm media to delete")
|
|
1186
|
+
};
|
|
1187
|
+
var uploadProductDesignMediaInput = {
|
|
1188
|
+
productId: idField("product"),
|
|
1189
|
+
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
1190
|
+
description: z15.string().optional().describe("Optional description of the media")
|
|
1191
|
+
};
|
|
1192
|
+
var updateProductDesignMediaInput2 = {
|
|
1193
|
+
productId: idField("product"),
|
|
1194
|
+
mediaId: idField("design media"),
|
|
1195
|
+
description: z15.string().nullable().describe("New description for the media")
|
|
1196
|
+
};
|
|
1197
|
+
var deleteProductDesignMediaInput = {
|
|
1198
|
+
productId: idField("product"),
|
|
1199
|
+
mediaId: idField("design media to delete")
|
|
1200
|
+
};
|
|
1201
|
+
var uploadDesignWalkthroughInput = {
|
|
1202
|
+
roadmapId: idField("roadmap item"),
|
|
1203
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
1204
|
+
};
|
|
1205
|
+
var uploadReleaseWalkthroughInput = {
|
|
1206
|
+
roadmapId: idField("roadmap item"),
|
|
1207
|
+
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
1208
|
+
};
|
|
1209
|
+
var publishPrototypeInput = {
|
|
1210
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
|
|
1211
|
+
folderPath: z15.string().describe("Absolute path to the local mockup folder"),
|
|
1212
|
+
entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
|
|
1213
|
+
};
|
|
1214
|
+
var listPrototypesInput = {
|
|
1215
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
|
|
1216
|
+
};
|
|
1217
|
+
var createFeedbackSessionInput = {
|
|
1218
|
+
prototypeId: uuidField("prototype to create a feedback session for"),
|
|
1219
|
+
name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
|
|
1220
|
+
expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
|
|
1221
|
+
};
|
|
1222
|
+
var listFeedbackSessionsInput = {
|
|
1223
|
+
prototypeId: uuidField("prototype")
|
|
1224
|
+
};
|
|
1225
|
+
var getFeedbackSummaryInput = {
|
|
1226
|
+
prototypeId: uuidField("prototype"),
|
|
1227
|
+
sessionId: uuidField("feedback session"),
|
|
1228
|
+
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
|
|
1229
|
+
};
|
|
1230
|
+
var getFeedbackDetailInput = {
|
|
1231
|
+
prototypeId: uuidField("prototype"),
|
|
1232
|
+
sessionId: uuidField("feedback session"),
|
|
1233
|
+
commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
|
|
1234
|
+
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
|
|
1235
|
+
};
|
|
1236
|
+
var resolveFeedbackCommentInput = {
|
|
1237
|
+
prototypeId: uuidField("prototype"),
|
|
1238
|
+
sessionId: uuidField("feedback session"),
|
|
1239
|
+
commentId: uuidField("comment to resolve/unresolve")
|
|
1240
|
+
};
|
|
1241
|
+
var searchExportsInput = {
|
|
1242
|
+
roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
|
|
1243
|
+
externalSystem: externalSystemSchema.optional().describe("Filter by external system"),
|
|
1244
|
+
localEntityType: localEntityTypeSchema.optional().describe("Filter by local entity type"),
|
|
1245
|
+
localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
|
|
1246
|
+
...paginationFields
|
|
1247
|
+
};
|
|
1248
|
+
var getExportInput = {
|
|
1249
|
+
id: z15.string().uuid().describe("The UUID of the export record")
|
|
1250
|
+
};
|
|
1251
|
+
var createExportInput = {
|
|
1252
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
1253
|
+
localEntityType: localEntityTypeSchema.describe("Type of local entity being exported"),
|
|
1254
|
+
localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
|
|
1255
|
+
externalSystem: externalSystemSchema.describe("External system where the entity was exported"),
|
|
1256
|
+
externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
|
|
1257
|
+
externalId: z15.string().min(1).describe("ID of the object in the external system"),
|
|
1258
|
+
externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
|
|
1259
|
+
metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
|
|
1260
|
+
};
|
|
1261
|
+
var updateExportInput = {
|
|
1262
|
+
id: z15.string().uuid().describe("The UUID of the export record to update"),
|
|
1263
|
+
externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
|
|
1264
|
+
metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
|
|
1265
|
+
};
|
|
1266
|
+
var deleteExportInput = {
|
|
1267
|
+
id: z15.string().uuid().describe("The UUID of the export record to delete")
|
|
1268
|
+
};
|
|
1269
|
+
var getPresentationInput = {
|
|
1270
|
+
id: idField("presentation")
|
|
1271
|
+
};
|
|
1272
|
+
var createPresentationInput = {
|
|
1273
|
+
title: z15.string().describe("Title of the presentation"),
|
|
1274
|
+
description: z15.string().nullable().optional().describe("Description of the presentation")
|
|
1275
|
+
};
|
|
1276
|
+
var updatePresentationInput = {
|
|
1277
|
+
id: idField("presentation to update"),
|
|
1278
|
+
title: z15.string().optional().describe("New title"),
|
|
1279
|
+
description: z15.string().nullable().optional().describe("New description")
|
|
1280
|
+
};
|
|
1281
|
+
var deletePresentationInput = {
|
|
1282
|
+
id: idField("presentation to delete")
|
|
1283
|
+
};
|
|
1284
|
+
var reorderPresentationsInput = {
|
|
1285
|
+
items: orderItemsField("presentation")
|
|
1286
|
+
};
|
|
1287
|
+
var listVariantsInput = {
|
|
1288
|
+
presentationId: idField("presentation")
|
|
1289
|
+
};
|
|
1290
|
+
var getVariantInput = {
|
|
1291
|
+
presentationId: idField("presentation"),
|
|
1292
|
+
variantId: idField("variant")
|
|
1293
|
+
};
|
|
1294
|
+
var createVariantInput = {
|
|
1295
|
+
presentationId: idField("presentation"),
|
|
1296
|
+
name: z15.string().describe("Name of the variant"),
|
|
1297
|
+
audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
|
|
1298
|
+
};
|
|
1299
|
+
var updateVariantInput = {
|
|
1300
|
+
presentationId: idField("presentation"),
|
|
1301
|
+
variantId: idField("variant to update"),
|
|
1302
|
+
name: z15.string().optional().describe("New name"),
|
|
1303
|
+
audienceId: z15.string().nullable().optional().describe("New target audience UUID")
|
|
1304
|
+
};
|
|
1305
|
+
var deleteVariantInput = {
|
|
1306
|
+
presentationId: idField("presentation"),
|
|
1307
|
+
variantId: idField("variant to delete")
|
|
1308
|
+
};
|
|
1309
|
+
var reorderVariantsInput = {
|
|
1310
|
+
presentationId: idField("presentation"),
|
|
1311
|
+
items: orderItemsField("variant")
|
|
1312
|
+
};
|
|
1313
|
+
var cloneVariantInput = {
|
|
1314
|
+
presentationId: idField("presentation"),
|
|
1315
|
+
variantId: idField("variant to clone")
|
|
1316
|
+
};
|
|
1317
|
+
var setDefaultVariantInput = {
|
|
1318
|
+
presentationId: idField("presentation"),
|
|
1319
|
+
variantId: idField("variant to set as default")
|
|
1320
|
+
};
|
|
1321
|
+
var listSlidesInput = {
|
|
1322
|
+
variantId: idField("variant")
|
|
1323
|
+
};
|
|
1324
|
+
var getSlideInput = {
|
|
1325
|
+
variantId: idField("variant"),
|
|
1326
|
+
slideId: idField("slide")
|
|
1327
|
+
};
|
|
1328
|
+
var createSlideInput = {
|
|
1329
|
+
variantId: idField("variant"),
|
|
1330
|
+
slideType: slideTypeSchema.default("bullets").describe("The type of slide to create"),
|
|
1331
|
+
content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
|
|
1332
|
+
speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
|
|
1333
|
+
};
|
|
1334
|
+
var updateSlideInput = {
|
|
1335
|
+
variantId: idField("variant"),
|
|
1336
|
+
slideId: idField("slide to update"),
|
|
1337
|
+
title: z15.string().optional().describe("New title"),
|
|
1338
|
+
content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
|
|
1339
|
+
speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
|
|
1340
|
+
};
|
|
1341
|
+
var deleteSlideInput = {
|
|
1342
|
+
variantId: idField("variant"),
|
|
1343
|
+
slideId: idField("slide to delete")
|
|
1344
|
+
};
|
|
1345
|
+
var reorderSlidesInput = {
|
|
1346
|
+
variantId: idField("variant"),
|
|
1347
|
+
items: orderItemsField("slide")
|
|
1348
|
+
};
|
|
1349
|
+
var uploadSlideImageInput = {
|
|
1350
|
+
variantId: idField("variant"),
|
|
1351
|
+
slideId: idField("slide to add the image to"),
|
|
1352
|
+
filePath: z15.string().describe("Absolute path to the image file on disk")
|
|
1353
|
+
};
|
|
1354
|
+
// ../../packages/shared/src/schemas/variant.ts
|
|
1355
|
+
import { z as z16 } from "zod";
|
|
1356
|
+
var variantSchema = z16.object({
|
|
1357
|
+
id: z16.string().uuid(),
|
|
1358
|
+
presentationId: z16.string().uuid(),
|
|
1359
|
+
name: z16.string(),
|
|
1360
|
+
audienceId: z16.string().uuid().nullable(),
|
|
1361
|
+
isDefault: z16.boolean(),
|
|
1362
|
+
order: z16.number().int(),
|
|
1363
|
+
createdAt: z16.string(),
|
|
1364
|
+
createdBy: z16.string(),
|
|
1365
|
+
updatedAt: z16.string().nullable()
|
|
665
1366
|
});
|
|
666
|
-
var createVariantSchema =
|
|
667
|
-
name:
|
|
668
|
-
audienceId:
|
|
1367
|
+
var createVariantSchema = z16.object({
|
|
1368
|
+
name: z16.string().min(1),
|
|
1369
|
+
audienceId: z16.string().uuid().nullable().optional()
|
|
669
1370
|
});
|
|
670
|
-
var updateVariantSchema =
|
|
671
|
-
name:
|
|
672
|
-
audienceId:
|
|
1371
|
+
var updateVariantSchema = z16.object({
|
|
1372
|
+
name: z16.string().min(1).optional(),
|
|
1373
|
+
audienceId: z16.string().uuid().nullable().optional()
|
|
673
1374
|
});
|
|
674
|
-
var variantListSchema =
|
|
675
|
-
// src/tools/index.ts
|
|
676
|
-
import { z as z15 } from "zod";
|
|
677
|
-
|
|
1375
|
+
var variantListSchema = z16.array(variantSchema);
|
|
678
1376
|
// src/auth.ts
|
|
679
1377
|
function getCredentials() {
|
|
680
1378
|
const apiKey = process.env.ROADMAPS_API_KEY;
|
|
@@ -1498,15 +2196,7 @@ function registerGetWorkflows(server) {
|
|
|
1498
2196
|
function registerSearchRoadmaps(server) {
|
|
1499
2197
|
server.registerTool("search_roadmaps", {
|
|
1500
2198
|
description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
|
|
1501
|
-
inputSchema:
|
|
1502
|
-
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1503
|
-
status: roadmapStatusSchema.optional().describe("Filter by status"),
|
|
1504
|
-
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
1505
|
-
phase: z15.string().optional().describe("Filter by phase"),
|
|
1506
|
-
phaseStep: z15.string().optional().describe("Filter by phase step"),
|
|
1507
|
-
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
1508
|
-
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
1509
|
-
}
|
|
2199
|
+
inputSchema: searchRoadmapsInput
|
|
1510
2200
|
}, async ({
|
|
1511
2201
|
query,
|
|
1512
2202
|
status,
|
|
@@ -1555,9 +2245,7 @@ function registerSearchRoadmaps(server) {
|
|
|
1555
2245
|
function registerGetRoadmap(server) {
|
|
1556
2246
|
server.registerTool("get_roadmap", {
|
|
1557
2247
|
description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
|
|
1558
|
-
inputSchema:
|
|
1559
|
-
id: z15.string().describe("The UUID of the roadmap item")
|
|
1560
|
-
}
|
|
2248
|
+
inputSchema: getRoadmapInput
|
|
1561
2249
|
}, async ({ id }) => {
|
|
1562
2250
|
const client2 = getApiClient();
|
|
1563
2251
|
const roadmap2 = await client2.getRoadmap(id);
|
|
@@ -1573,8 +2261,16 @@ function registerGetRoadmap(server) {
|
|
|
1573
2261
|
value: roadmap2.value,
|
|
1574
2262
|
effort: roadmap2.effort,
|
|
1575
2263
|
order: roadmap2.order,
|
|
1576
|
-
prd: roadmap2.prd
|
|
1577
|
-
|
|
2264
|
+
prd: roadmap2.prd ? {
|
|
2265
|
+
...roadmap2.prd,
|
|
2266
|
+
what: contentToMarkdown(roadmap2.prd.what),
|
|
2267
|
+
why: contentToMarkdown(roadmap2.prd.why),
|
|
2268
|
+
outcomes: roadmap2.prd.outcomes?.map((o) => ({
|
|
2269
|
+
...o,
|
|
2270
|
+
description: contentToMarkdown(o.description)
|
|
2271
|
+
}))
|
|
2272
|
+
} : null,
|
|
2273
|
+
brainstormNotes: contentToMarkdown(roadmap2.brainstormNotes),
|
|
1578
2274
|
wireframes: roadmap2.wireframes?.map((w) => ({
|
|
1579
2275
|
id: w.id,
|
|
1580
2276
|
imageUrl: w.imageUrl,
|
|
@@ -1594,10 +2290,10 @@ function registerGetRoadmap(server) {
|
|
|
1594
2290
|
})),
|
|
1595
2291
|
epics: roadmap2.epics,
|
|
1596
2292
|
stories: roadmap2.stories,
|
|
1597
|
-
designDescription: roadmap2.design?.description
|
|
1598
|
-
planDescription: roadmap2.plan?.description
|
|
1599
|
-
buildDescription: roadmap2.build?.description
|
|
1600
|
-
releaseDescription: roadmap2.release?.description
|
|
2293
|
+
designDescription: contentToMarkdown(roadmap2.design?.description),
|
|
2294
|
+
planDescription: contentToMarkdown(roadmap2.plan?.description),
|
|
2295
|
+
buildDescription: contentToMarkdown(roadmap2.build?.description),
|
|
2296
|
+
releaseDescription: contentToMarkdown(roadmap2.release?.description),
|
|
1601
2297
|
prompt: roadmap2.build?.prompt ?? roadmap2.prompt ?? null,
|
|
1602
2298
|
createdAt: roadmap2.createdAt
|
|
1603
2299
|
}, null, 2)
|
|
@@ -1609,10 +2305,7 @@ function registerGetRoadmap(server) {
|
|
|
1609
2305
|
function registerSearchFeatures(server) {
|
|
1610
2306
|
server.registerTool("search_features", {
|
|
1611
2307
|
description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
|
|
1612
|
-
inputSchema:
|
|
1613
|
-
query: z15.string().optional().describe("Search query to match against name"),
|
|
1614
|
-
type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
|
|
1615
|
-
}
|
|
2308
|
+
inputSchema: searchFeaturesInput
|
|
1616
2309
|
}, async ({ query, type }) => {
|
|
1617
2310
|
const client2 = getApiClient();
|
|
1618
2311
|
let features = await client2.listFeatures();
|
|
@@ -1641,9 +2334,7 @@ function registerSearchFeatures(server) {
|
|
|
1641
2334
|
function registerGetFeature(server) {
|
|
1642
2335
|
server.registerTool("get_feature", {
|
|
1643
2336
|
description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
|
|
1644
|
-
inputSchema:
|
|
1645
|
-
id: z15.string().describe("The UUID of the feature")
|
|
1646
|
-
}
|
|
2337
|
+
inputSchema: getFeatureInput
|
|
1647
2338
|
}, async ({ id }) => {
|
|
1648
2339
|
const client2 = getApiClient();
|
|
1649
2340
|
const feature2 = await client2.getFeature(id);
|
|
@@ -1658,7 +2349,7 @@ function registerGetFeature(server) {
|
|
|
1658
2349
|
parentId: feature2.parentId,
|
|
1659
2350
|
outcomes: feature2.outcomes?.map((o) => ({
|
|
1660
2351
|
id: o.id,
|
|
1661
|
-
description: o.description
|
|
2352
|
+
description: contentToMarkdown(o.description)
|
|
1662
2353
|
})),
|
|
1663
2354
|
children: feature2.children?.map((c) => ({
|
|
1664
2355
|
id: c.id,
|
|
@@ -1680,10 +2371,7 @@ function registerGetFeature(server) {
|
|
|
1680
2371
|
function registerSearchIdeas(server) {
|
|
1681
2372
|
server.registerTool("search_ideas", {
|
|
1682
2373
|
description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
|
|
1683
|
-
inputSchema:
|
|
1684
|
-
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
1685
|
-
status: ideaStatusSchema.optional().describe("Filter by status")
|
|
1686
|
-
}
|
|
2374
|
+
inputSchema: searchIdeasInput
|
|
1687
2375
|
}, async ({ query, status }) => {
|
|
1688
2376
|
const client2 = getApiClient();
|
|
1689
2377
|
let ideas = await client2.listIdeas();
|
|
@@ -1701,7 +2389,7 @@ function registerSearchIdeas(server) {
|
|
|
1701
2389
|
text: JSON.stringify(ideas.map((i) => ({
|
|
1702
2390
|
id: i.id,
|
|
1703
2391
|
title: i.title,
|
|
1704
|
-
description: i.description,
|
|
2392
|
+
description: contentToMarkdown(i.description),
|
|
1705
2393
|
status: i.status,
|
|
1706
2394
|
source: i.source
|
|
1707
2395
|
})), null, 2)
|
|
@@ -1738,8 +2426,8 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
|
|
|
1738
2426
|
type: "text",
|
|
1739
2427
|
text: JSON.stringify({
|
|
1740
2428
|
strategy: {
|
|
1741
|
-
vision: strategy.vision,
|
|
1742
|
-
mission: strategy.mission
|
|
2429
|
+
vision: contentToMarkdown(strategy.vision),
|
|
2430
|
+
mission: contentToMarkdown(strategy.mission)
|
|
1743
2431
|
},
|
|
1744
2432
|
products: products.map((p) => ({
|
|
1745
2433
|
id: p.id,
|
|
@@ -1780,11 +2468,7 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
|
|
|
1780
2468
|
function registerCaptureIdea(server) {
|
|
1781
2469
|
server.registerTool("capture_idea", {
|
|
1782
2470
|
description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
|
|
1783
|
-
inputSchema:
|
|
1784
|
-
title: z15.string().describe("Title of the idea"),
|
|
1785
|
-
description: z15.string().optional().describe("Detailed description of the idea"),
|
|
1786
|
-
source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
|
|
1787
|
-
}
|
|
2471
|
+
inputSchema: captureIdeaInput
|
|
1788
2472
|
}, async ({
|
|
1789
2473
|
title,
|
|
1790
2474
|
description,
|
|
@@ -1819,18 +2503,7 @@ function registerCaptureIdea(server) {
|
|
|
1819
2503
|
function registerCreateRoadmapItem(server) {
|
|
1820
2504
|
server.registerTool("create_roadmap_item", {
|
|
1821
2505
|
description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
|
|
1822
|
-
inputSchema:
|
|
1823
|
-
title: z15.string().describe("Title of the roadmap item"),
|
|
1824
|
-
status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
|
|
1825
|
-
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
1826
|
-
phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
|
|
1827
|
-
phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
|
|
1828
|
-
initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
|
|
1829
|
-
dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1830
|
-
dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1831
|
-
targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1832
|
-
targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
1833
|
-
}
|
|
2506
|
+
inputSchema: createRoadmapItemInput
|
|
1834
2507
|
}, async ({
|
|
1835
2508
|
title,
|
|
1836
2509
|
status,
|
|
@@ -1891,31 +2564,10 @@ function registerCreateRoadmapItem(server) {
|
|
|
1891
2564
|
};
|
|
1892
2565
|
});
|
|
1893
2566
|
}
|
|
1894
|
-
var effortSizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
|
|
1895
2567
|
function registerUpdateRoadmapItem(server) {
|
|
1896
2568
|
server.registerTool("update_roadmap_item", {
|
|
1897
2569
|
description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
|
|
1898
|
-
inputSchema:
|
|
1899
|
-
id: z15.string().describe("The UUID of the roadmap item to update"),
|
|
1900
|
-
title: z15.string().optional().describe("New title"),
|
|
1901
|
-
status: roadmapStatusSchema.optional().describe("New status"),
|
|
1902
|
-
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
1903
|
-
phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
|
|
1904
|
-
phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
|
|
1905
|
-
value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
|
|
1906
|
-
effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
|
|
1907
|
-
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
|
|
1908
|
-
initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
|
|
1909
|
-
designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
|
|
1910
|
-
planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
|
|
1911
|
-
buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
|
|
1912
|
-
releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
|
|
1913
|
-
prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
|
|
1914
|
-
dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
|
|
1915
|
-
dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
|
|
1916
|
-
targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
|
|
1917
|
-
targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
|
|
1918
|
-
}
|
|
2570
|
+
inputSchema: updateRoadmapItemInput
|
|
1919
2571
|
}, async ({
|
|
1920
2572
|
id,
|
|
1921
2573
|
title,
|
|
@@ -2024,14 +2676,7 @@ function registerUpdateRoadmapItem(server) {
|
|
|
2024
2676
|
function registerAddFeature(server) {
|
|
2025
2677
|
server.registerTool("add_feature", {
|
|
2026
2678
|
description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
|
|
2027
|
-
inputSchema:
|
|
2028
|
-
name: z15.string().describe("Name of the feature"),
|
|
2029
|
-
description: z15.string().optional().describe("Description of the feature"),
|
|
2030
|
-
type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
|
|
2031
|
-
parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
|
|
2032
|
-
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
|
|
2033
|
-
linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
|
|
2034
|
-
}
|
|
2679
|
+
inputSchema: addFeatureInput
|
|
2035
2680
|
}, async ({
|
|
2036
2681
|
name,
|
|
2037
2682
|
description,
|
|
@@ -2076,12 +2721,7 @@ function registerAddFeature(server) {
|
|
|
2076
2721
|
function registerSavePrd(server) {
|
|
2077
2722
|
server.registerTool("save_prd", {
|
|
2078
2723
|
description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
|
|
2079
|
-
inputSchema:
|
|
2080
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2081
|
-
what: z15.string().nullable().describe("What is being built - the feature description"),
|
|
2082
|
-
why: z15.string().nullable().describe("Why this is being built - the business justification"),
|
|
2083
|
-
outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
|
|
2084
|
-
}
|
|
2724
|
+
inputSchema: savePrdInput
|
|
2085
2725
|
}, async ({
|
|
2086
2726
|
roadmapId,
|
|
2087
2727
|
what,
|
|
@@ -2117,10 +2757,7 @@ function registerSavePrd(server) {
|
|
|
2117
2757
|
function registerUpdateBrainstormNotes(server) {
|
|
2118
2758
|
server.registerTool("update_brainstorm_notes", {
|
|
2119
2759
|
description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
|
|
2120
|
-
inputSchema:
|
|
2121
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
2122
|
-
notes: z15.string().describe("The brainstorm notes content")
|
|
2123
|
-
}
|
|
2760
|
+
inputSchema: updateBrainstormNotesInput
|
|
2124
2761
|
}, async ({ roadmapId, notes }) => {
|
|
2125
2762
|
const client2 = getApiClient();
|
|
2126
2763
|
const roadmap2 = await client2.updateRoadmap(roadmapId, {
|
|
@@ -2147,9 +2784,7 @@ function registerUpdateBrainstormNotes(server) {
|
|
|
2147
2784
|
function registerDeleteRoadmapItem(server) {
|
|
2148
2785
|
server.registerTool("delete_roadmap_item", {
|
|
2149
2786
|
description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
|
|
2150
|
-
inputSchema:
|
|
2151
|
-
id: z15.string().describe("The UUID of the roadmap item to delete")
|
|
2152
|
-
}
|
|
2787
|
+
inputSchema: deleteRoadmapItemInput
|
|
2153
2788
|
}, async ({ id }) => {
|
|
2154
2789
|
const client2 = getApiClient();
|
|
2155
2790
|
await client2.deleteRoadmap(id);
|
|
@@ -2169,12 +2804,7 @@ function registerDeleteRoadmapItem(server) {
|
|
|
2169
2804
|
function registerReorderRoadmaps(server) {
|
|
2170
2805
|
server.registerTool("reorder_roadmaps", {
|
|
2171
2806
|
description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
|
|
2172
|
-
inputSchema:
|
|
2173
|
-
items: z15.array(z15.object({
|
|
2174
|
-
id: z15.string().describe("The UUID of the roadmap item"),
|
|
2175
|
-
order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
|
|
2176
|
-
})).describe("Array of roadmap items with their new order values")
|
|
2177
|
-
}
|
|
2807
|
+
inputSchema: reorderRoadmapsInput
|
|
2178
2808
|
}, async ({ items }) => {
|
|
2179
2809
|
const client2 = getApiClient();
|
|
2180
2810
|
const result = await client2.reorderRoadmaps(items);
|
|
@@ -2195,12 +2825,7 @@ function registerReorderRoadmaps(server) {
|
|
|
2195
2825
|
function registerUpdateFeature(server) {
|
|
2196
2826
|
server.registerTool("update_feature", {
|
|
2197
2827
|
description: "Update an existing feature. Can update name, type, or parent.",
|
|
2198
|
-
inputSchema:
|
|
2199
|
-
id: z15.string().describe("The UUID of the feature to update"),
|
|
2200
|
-
name: z15.string().optional().describe("New name for the feature"),
|
|
2201
|
-
type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
|
|
2202
|
-
parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
|
|
2203
|
-
}
|
|
2828
|
+
inputSchema: updateFeatureInput
|
|
2204
2829
|
}, async ({
|
|
2205
2830
|
id,
|
|
2206
2831
|
name,
|
|
@@ -2237,9 +2862,7 @@ function registerUpdateFeature(server) {
|
|
|
2237
2862
|
function registerDeleteFeature(server) {
|
|
2238
2863
|
server.registerTool("delete_feature", {
|
|
2239
2864
|
description: "Delete a feature. This is a soft delete that also deletes all child features.",
|
|
2240
|
-
inputSchema:
|
|
2241
|
-
id: z15.string().describe("The UUID of the feature to delete")
|
|
2242
|
-
}
|
|
2865
|
+
inputSchema: deleteFeatureInput
|
|
2243
2866
|
}, async ({ id }) => {
|
|
2244
2867
|
const client2 = getApiClient();
|
|
2245
2868
|
await client2.deleteFeature(id);
|
|
@@ -2259,9 +2882,7 @@ function registerDeleteFeature(server) {
|
|
|
2259
2882
|
function registerGetIdea(server) {
|
|
2260
2883
|
server.registerTool("get_idea", {
|
|
2261
2884
|
description: "Get full details of a single idea by ID.",
|
|
2262
|
-
inputSchema:
|
|
2263
|
-
id: z15.string().describe("The UUID of the idea")
|
|
2264
|
-
}
|
|
2885
|
+
inputSchema: getIdeaInput
|
|
2265
2886
|
}, async ({ id }) => {
|
|
2266
2887
|
const client2 = getApiClient();
|
|
2267
2888
|
const idea2 = await client2.getIdea(id);
|
|
@@ -2272,7 +2893,7 @@ function registerGetIdea(server) {
|
|
|
2272
2893
|
text: JSON.stringify({
|
|
2273
2894
|
id: idea2.id,
|
|
2274
2895
|
title: idea2.title,
|
|
2275
|
-
description: idea2.description,
|
|
2896
|
+
description: contentToMarkdown(idea2.description),
|
|
2276
2897
|
status: idea2.status,
|
|
2277
2898
|
source: idea2.source,
|
|
2278
2899
|
submittedBy: idea2.submittedBy,
|
|
@@ -2288,14 +2909,7 @@ function registerGetIdea(server) {
|
|
|
2288
2909
|
function registerUpdateIdea(server) {
|
|
2289
2910
|
server.registerTool("update_idea", {
|
|
2290
2911
|
description: "Update an existing idea. Can update title, description, status, value, or effort.",
|
|
2291
|
-
inputSchema:
|
|
2292
|
-
id: z15.string().describe("The UUID of the idea to update"),
|
|
2293
|
-
title: z15.string().optional().describe("New title"),
|
|
2294
|
-
description: z15.string().nullable().optional().describe("New description"),
|
|
2295
|
-
status: ideaStatusSchema.optional().describe("New status"),
|
|
2296
|
-
value: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
|
|
2297
|
-
effort: z15.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
|
|
2298
|
-
}
|
|
2912
|
+
inputSchema: updateIdeaInput
|
|
2299
2913
|
}, async ({
|
|
2300
2914
|
id,
|
|
2301
2915
|
title,
|
|
@@ -2340,9 +2954,7 @@ function registerUpdateIdea(server) {
|
|
|
2340
2954
|
function registerDeleteIdea(server) {
|
|
2341
2955
|
server.registerTool("delete_idea", {
|
|
2342
2956
|
description: "Delete an idea. This is a soft delete.",
|
|
2343
|
-
inputSchema:
|
|
2344
|
-
id: z15.string().describe("The UUID of the idea to delete")
|
|
2345
|
-
}
|
|
2957
|
+
inputSchema: deleteIdeaInput
|
|
2346
2958
|
}, async ({ id }) => {
|
|
2347
2959
|
const client2 = getApiClient();
|
|
2348
2960
|
await client2.deleteIdea(id);
|
|
@@ -2370,7 +2982,10 @@ function registerGetStrategy(server) {
|
|
|
2370
2982
|
content: [
|
|
2371
2983
|
{
|
|
2372
2984
|
type: "text",
|
|
2373
|
-
text: JSON.stringify(
|
|
2985
|
+
text: JSON.stringify({
|
|
2986
|
+
vision: contentToMarkdown(strategy.vision),
|
|
2987
|
+
mission: contentToMarkdown(strategy.mission)
|
|
2988
|
+
}, null, 2)
|
|
2374
2989
|
}
|
|
2375
2990
|
]
|
|
2376
2991
|
};
|
|
@@ -2379,10 +2994,7 @@ function registerGetStrategy(server) {
|
|
|
2379
2994
|
function registerUpdateStrategy(server) {
|
|
2380
2995
|
server.registerTool("update_strategy", {
|
|
2381
2996
|
description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
|
|
2382
|
-
inputSchema:
|
|
2383
|
-
vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
|
|
2384
|
-
mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
|
|
2385
|
-
}
|
|
2997
|
+
inputSchema: updateStrategyInput
|
|
2386
2998
|
}, async ({ vision, mission }) => {
|
|
2387
2999
|
const client2 = getApiClient();
|
|
2388
3000
|
const updates = {};
|
|
@@ -2428,10 +3040,7 @@ function registerListScenarios(server) {
|
|
|
2428
3040
|
function registerCreateScenario(server) {
|
|
2429
3041
|
server.registerTool("create_scenario", {
|
|
2430
3042
|
description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
|
|
2431
|
-
inputSchema:
|
|
2432
|
-
title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
|
|
2433
|
-
description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
|
|
2434
|
-
}
|
|
3043
|
+
inputSchema: createScenarioInput
|
|
2435
3044
|
}, async ({ title, description }) => {
|
|
2436
3045
|
const client2 = getApiClient();
|
|
2437
3046
|
const scenario2 = await client2.createScenario({
|
|
@@ -2458,11 +3067,7 @@ function registerCreateScenario(server) {
|
|
|
2458
3067
|
function registerUpdateScenario(server) {
|
|
2459
3068
|
server.registerTool("update_scenario", {
|
|
2460
3069
|
description: "Update an existing scenario.",
|
|
2461
|
-
inputSchema:
|
|
2462
|
-
id: z15.string().describe("The UUID of the scenario to update"),
|
|
2463
|
-
title: z15.string().optional().describe("New title"),
|
|
2464
|
-
description: z15.string().nullable().optional().describe("New description")
|
|
2465
|
-
}
|
|
3070
|
+
inputSchema: updateScenarioInput
|
|
2466
3071
|
}, async ({
|
|
2467
3072
|
id,
|
|
2468
3073
|
title,
|
|
@@ -2495,9 +3100,7 @@ function registerUpdateScenario(server) {
|
|
|
2495
3100
|
function registerDeleteScenario(server) {
|
|
2496
3101
|
server.registerTool("delete_scenario", {
|
|
2497
3102
|
description: "Delete a scenario. This is a soft delete.",
|
|
2498
|
-
inputSchema:
|
|
2499
|
-
id: z15.string().describe("The UUID of the scenario to delete")
|
|
2500
|
-
}
|
|
3103
|
+
inputSchema: deleteScenarioInput
|
|
2501
3104
|
}, async ({ id }) => {
|
|
2502
3105
|
const client2 = getApiClient();
|
|
2503
3106
|
await client2.deleteScenario(id);
|
|
@@ -2511,22 +3114,10 @@ function registerDeleteScenario(server) {
|
|
|
2511
3114
|
};
|
|
2512
3115
|
});
|
|
2513
3116
|
}
|
|
2514
|
-
var productTypeSchema2 = z15.enum([
|
|
2515
|
-
"brand",
|
|
2516
|
-
"product",
|
|
2517
|
-
"app",
|
|
2518
|
-
"marketing_site",
|
|
2519
|
-
"landing_page",
|
|
2520
|
-
"service"
|
|
2521
|
-
]);
|
|
2522
3117
|
function registerCreateProduct(server) {
|
|
2523
3118
|
server.registerTool("create_product", {
|
|
2524
3119
|
description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
|
|
2525
|
-
inputSchema:
|
|
2526
|
-
type: productTypeSchema2.describe("Type of product"),
|
|
2527
|
-
name: z15.string().describe("Name of the product"),
|
|
2528
|
-
parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
|
|
2529
|
-
}
|
|
3120
|
+
inputSchema: createProductInput
|
|
2530
3121
|
}, async ({
|
|
2531
3122
|
type,
|
|
2532
3123
|
name,
|
|
@@ -2559,11 +3150,7 @@ function registerCreateProduct(server) {
|
|
|
2559
3150
|
function registerUpdateProduct(server) {
|
|
2560
3151
|
server.registerTool("update_product", {
|
|
2561
3152
|
description: "Update an existing product.",
|
|
2562
|
-
inputSchema:
|
|
2563
|
-
id: z15.string().describe("The UUID of the product to update"),
|
|
2564
|
-
name: z15.string().optional().describe("New name"),
|
|
2565
|
-
parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
|
|
2566
|
-
}
|
|
3153
|
+
inputSchema: updateProductInput
|
|
2567
3154
|
}, async ({ id, name, parentId }) => {
|
|
2568
3155
|
const client2 = getApiClient();
|
|
2569
3156
|
const updates = {};
|
|
@@ -2593,9 +3180,7 @@ function registerUpdateProduct(server) {
|
|
|
2593
3180
|
function registerDeleteProduct(server) {
|
|
2594
3181
|
server.registerTool("delete_product", {
|
|
2595
3182
|
description: "Delete a product. This is a soft delete that also deletes all child products.",
|
|
2596
|
-
inputSchema:
|
|
2597
|
-
id: z15.string().describe("The UUID of the product to delete")
|
|
2598
|
-
}
|
|
3183
|
+
inputSchema: deleteProductInput
|
|
2599
3184
|
}, async ({ id }) => {
|
|
2600
3185
|
const client2 = getApiClient();
|
|
2601
3186
|
const result = await client2.deleteProduct(id);
|
|
@@ -2616,9 +3201,7 @@ function registerDeleteProduct(server) {
|
|
|
2616
3201
|
function registerGetProduct(server) {
|
|
2617
3202
|
server.registerTool("get_product", {
|
|
2618
3203
|
description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
|
|
2619
|
-
inputSchema:
|
|
2620
|
-
id: z15.string().describe("The UUID of the product")
|
|
2621
|
-
}
|
|
3204
|
+
inputSchema: getProductInput
|
|
2622
3205
|
}, async ({ id }) => {
|
|
2623
3206
|
const client2 = getApiClient();
|
|
2624
3207
|
const [product2, documentation] = await Promise.all([
|
|
@@ -2640,8 +3223,8 @@ function registerGetProduct(server) {
|
|
|
2640
3223
|
createdAt: product2.createdAt
|
|
2641
3224
|
},
|
|
2642
3225
|
documentation: documentation ? {
|
|
2643
|
-
designSystem: documentation.designSystem,
|
|
2644
|
-
adrs: documentation.adrs,
|
|
3226
|
+
designSystem: contentToMarkdown(documentation.designSystem),
|
|
3227
|
+
adrs: contentToMarkdown(documentation.adrs),
|
|
2645
3228
|
updatedAt: documentation.updatedAt
|
|
2646
3229
|
} : null
|
|
2647
3230
|
}, null, 2)
|
|
@@ -2653,10 +3236,7 @@ function registerGetProduct(server) {
|
|
|
2653
3236
|
function registerSearchProducts(server) {
|
|
2654
3237
|
server.registerTool("search_products", {
|
|
2655
3238
|
description: "Search for products by name. Returns a list of matching products with basic info.",
|
|
2656
|
-
inputSchema:
|
|
2657
|
-
query: z15.string().optional().describe("Search query to match against product name"),
|
|
2658
|
-
type: productTypeSchema2.optional().describe("Filter by product type")
|
|
2659
|
-
}
|
|
3239
|
+
inputSchema: searchProductsInput
|
|
2660
3240
|
}, async ({ query, type }) => {
|
|
2661
3241
|
const client2 = getApiClient();
|
|
2662
3242
|
let products = await client2.listProducts();
|
|
@@ -2688,9 +3268,7 @@ function registerSearchProducts(server) {
|
|
|
2688
3268
|
function registerGetProductDocumentation(server) {
|
|
2689
3269
|
server.registerTool("get_product_documentation", {
|
|
2690
3270
|
description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
|
|
2691
|
-
inputSchema:
|
|
2692
|
-
productId: z15.string().describe("The UUID of the product")
|
|
2693
|
-
}
|
|
3271
|
+
inputSchema: getProductDocumentationInput
|
|
2694
3272
|
}, async ({ productId }) => {
|
|
2695
3273
|
const client2 = getApiClient();
|
|
2696
3274
|
const documentation = await client2.getProductDocumentation(productId);
|
|
@@ -2702,8 +3280,8 @@ function registerGetProductDocumentation(server) {
|
|
|
2702
3280
|
productId,
|
|
2703
3281
|
documentation: documentation ? {
|
|
2704
3282
|
id: documentation.id,
|
|
2705
|
-
designSystem: documentation.designSystem,
|
|
2706
|
-
adrs: documentation.adrs,
|
|
3283
|
+
designSystem: contentToMarkdown(documentation.designSystem),
|
|
3284
|
+
adrs: contentToMarkdown(documentation.adrs),
|
|
2707
3285
|
createdAt: documentation.createdAt,
|
|
2708
3286
|
updatedAt: documentation.updatedAt
|
|
2709
3287
|
} : null
|
|
@@ -2716,11 +3294,7 @@ function registerGetProductDocumentation(server) {
|
|
|
2716
3294
|
function registerUpdateProductDocumentation(server) {
|
|
2717
3295
|
server.registerTool("update_product_documentation", {
|
|
2718
3296
|
description: "Update the documentation for a product. Use this to keep design system and ADRs up to date. Creates documentation if it does not exist.",
|
|
2719
|
-
inputSchema:
|
|
2720
|
-
productId: z15.string().describe("The UUID of the product"),
|
|
2721
|
-
designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
|
|
2722
|
-
adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
|
|
2723
|
-
}
|
|
3297
|
+
inputSchema: updateProductDocumentationInput
|
|
2724
3298
|
}, async ({
|
|
2725
3299
|
productId,
|
|
2726
3300
|
designSystem,
|
|
@@ -2755,10 +3329,7 @@ function registerUpdateProductDocumentation(server) {
|
|
|
2755
3329
|
function registerCreateAudience(server) {
|
|
2756
3330
|
server.registerTool("create_audience", {
|
|
2757
3331
|
description: "Create a new audience member. Audiences represent who the product serves.",
|
|
2758
|
-
inputSchema:
|
|
2759
|
-
name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
|
|
2760
|
-
description: z15.string().nullable().optional().describe("Description of the audience")
|
|
2761
|
-
}
|
|
3332
|
+
inputSchema: createAudienceInput
|
|
2762
3333
|
}, async ({ name, description }) => {
|
|
2763
3334
|
const client2 = getApiClient();
|
|
2764
3335
|
const audience2 = await client2.createAudience({
|
|
@@ -2785,11 +3356,7 @@ function registerCreateAudience(server) {
|
|
|
2785
3356
|
function registerUpdateAudience(server) {
|
|
2786
3357
|
server.registerTool("update_audience", {
|
|
2787
3358
|
description: "Update an existing audience member.",
|
|
2788
|
-
inputSchema:
|
|
2789
|
-
id: z15.string().describe("The UUID of the audience to update"),
|
|
2790
|
-
name: z15.string().optional().describe("New name"),
|
|
2791
|
-
description: z15.string().nullable().optional().describe("New description")
|
|
2792
|
-
}
|
|
3359
|
+
inputSchema: updateAudienceInput
|
|
2793
3360
|
}, async ({
|
|
2794
3361
|
id,
|
|
2795
3362
|
name,
|
|
@@ -2822,9 +3389,7 @@ function registerUpdateAudience(server) {
|
|
|
2822
3389
|
function registerDeleteAudience(server) {
|
|
2823
3390
|
server.registerTool("delete_audience", {
|
|
2824
3391
|
description: "Delete an audience member. This is a soft delete.",
|
|
2825
|
-
inputSchema:
|
|
2826
|
-
id: z15.string().describe("The UUID of the audience to delete")
|
|
2827
|
-
}
|
|
3392
|
+
inputSchema: deleteAudienceInput
|
|
2828
3393
|
}, async ({ id }) => {
|
|
2829
3394
|
const client2 = getApiClient();
|
|
2830
3395
|
await client2.deleteAudience(id);
|
|
@@ -2864,20 +3429,7 @@ function registerListStatusUpdates(server) {
|
|
|
2864
3429
|
function registerGetHistory(server) {
|
|
2865
3430
|
server.registerTool("get_history", {
|
|
2866
3431
|
description: "Get raw history events for a date range. Returns full event details including payloads. " + "Use entityType or entityId filters to narrow results. For status reports, prefer " + "get_history_summary to avoid context overflow.",
|
|
2867
|
-
inputSchema:
|
|
2868
|
-
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2869
|
-
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
|
|
2870
|
-
entityType: z15.enum([
|
|
2871
|
-
"roadmap",
|
|
2872
|
-
"feature",
|
|
2873
|
-
"idea",
|
|
2874
|
-
"prd",
|
|
2875
|
-
"wireframe",
|
|
2876
|
-
"product",
|
|
2877
|
-
"audience",
|
|
2878
|
-
"scenario"
|
|
2879
|
-
]).optional().describe("Filter to specific entity type")
|
|
2880
|
-
}
|
|
3432
|
+
inputSchema: getHistoryInput
|
|
2881
3433
|
}, async ({
|
|
2882
3434
|
startDate,
|
|
2883
3435
|
endDate,
|
|
@@ -2898,10 +3450,7 @@ function registerGetHistory(server) {
|
|
|
2898
3450
|
function registerGetHistorySummary(server) {
|
|
2899
3451
|
server.registerTool("get_history_summary", {
|
|
2900
3452
|
description: "Get a summary of history events for a date range. Returns counts by entity type, " + "list of changed entities with titles, and total event count. Use this for status " + "report generation instead of get_history to avoid context overflow.",
|
|
2901
|
-
inputSchema:
|
|
2902
|
-
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
|
|
2903
|
-
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
|
|
2904
|
-
}
|
|
3453
|
+
inputSchema: getHistorySummaryInput
|
|
2905
3454
|
}, async ({ startDate, endDate }) => {
|
|
2906
3455
|
const client2 = getApiClient();
|
|
2907
3456
|
const summary = await client2.getHistorySummary({ startDate, endDate });
|
|
@@ -2918,16 +3467,7 @@ function registerGetHistorySummary(server) {
|
|
|
2918
3467
|
function registerCreateStatusUpdate(server) {
|
|
2919
3468
|
server.registerTool("create_status_update", {
|
|
2920
3469
|
description: "Create a new status report. Use this after generating the report content from history events.",
|
|
2921
|
-
inputSchema:
|
|
2922
|
-
startDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
|
|
2923
|
-
endDate: z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
|
|
2924
|
-
content: z15.string().describe("The markdown content of the status report"),
|
|
2925
|
-
title: z15.string().optional().describe("Optional title for the report"),
|
|
2926
|
-
items: z15.array(z15.object({
|
|
2927
|
-
roadmapItemId: z15.string().describe("UUID of the roadmap item"),
|
|
2928
|
-
status: z15.string().describe("Status of the item at report creation time")
|
|
2929
|
-
})).optional().describe("Roadmap items to include in the report snapshot")
|
|
2930
|
-
}
|
|
3470
|
+
inputSchema: createStatusUpdateInput
|
|
2931
3471
|
}, async ({
|
|
2932
3472
|
startDate,
|
|
2933
3473
|
endDate,
|
|
@@ -2965,21 +3505,7 @@ function registerCreateStatusUpdate(server) {
|
|
|
2965
3505
|
function registerSaveStories(server) {
|
|
2966
3506
|
server.registerTool("save_stories", {
|
|
2967
3507
|
description: "Save epics and stories for a roadmap item. Replaces all existing epics/stories. Use this to set the complete list of epics and stories for a roadmap.",
|
|
2968
|
-
inputSchema:
|
|
2969
|
-
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
2970
|
-
epics: z15.array(z15.object({
|
|
2971
|
-
title: z15.string().min(1).describe("Title of the epic"),
|
|
2972
|
-
description: z15.string().nullable().optional().describe("Description of the epic"),
|
|
2973
|
-
stories: z15.array(z15.object({
|
|
2974
|
-
title: z15.string().min(1).describe("Title of the story"),
|
|
2975
|
-
description: z15.string().nullable().optional().describe("Description of the story")
|
|
2976
|
-
})).optional().describe("Stories within this epic")
|
|
2977
|
-
})).optional().describe("List of epics with their nested stories"),
|
|
2978
|
-
stories: z15.array(z15.object({
|
|
2979
|
-
title: z15.string().min(1).describe("Title of the story"),
|
|
2980
|
-
description: z15.string().nullable().optional().describe("Description of the story")
|
|
2981
|
-
})).optional().describe("List of standalone stories (not part of any epic)")
|
|
2982
|
-
}
|
|
3508
|
+
inputSchema: saveStoriesInput
|
|
2983
3509
|
}, async ({
|
|
2984
3510
|
roadmapId,
|
|
2985
3511
|
epics,
|
|
@@ -3008,12 +3534,7 @@ function registerSaveStories(server) {
|
|
|
3008
3534
|
function registerUploadWireframe(server) {
|
|
3009
3535
|
server.registerTool("upload_wireframe", {
|
|
3010
3536
|
description: "Upload an image to a roadmap item's wireframes. Returns a curl command to execute for the upload, then creates the wireframe record. After running the curl command, the wireframe will be visible in the web app.",
|
|
3011
|
-
inputSchema:
|
|
3012
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3013
|
-
filePath: z15.string().describe("Absolute path to the image file on disk"),
|
|
3014
|
-
description: z15.string().optional().describe("Optional description of the wireframe"),
|
|
3015
|
-
outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
|
|
3016
|
-
}
|
|
3537
|
+
inputSchema: uploadWireframeInput
|
|
3017
3538
|
}, async ({
|
|
3018
3539
|
roadmapId,
|
|
3019
3540
|
filePath,
|
|
@@ -3065,11 +3586,7 @@ function registerUploadWireframe(server) {
|
|
|
3065
3586
|
function registerUpdateWireframe(server) {
|
|
3066
3587
|
server.registerTool("update_wireframe", {
|
|
3067
3588
|
description: "Update a wireframe's description or outcome tags.",
|
|
3068
|
-
inputSchema:
|
|
3069
|
-
id: z15.string().describe("The UUID of the wireframe"),
|
|
3070
|
-
description: z15.string().nullable().optional().describe("New description for the wireframe"),
|
|
3071
|
-
outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
|
|
3072
|
-
}
|
|
3589
|
+
inputSchema: updateWireframeInput
|
|
3073
3590
|
}, async ({
|
|
3074
3591
|
id,
|
|
3075
3592
|
description,
|
|
@@ -3103,9 +3620,7 @@ function registerUpdateWireframe(server) {
|
|
|
3103
3620
|
function registerDeleteWireframe(server) {
|
|
3104
3621
|
server.registerTool("delete_wireframe", {
|
|
3105
3622
|
description: "Delete a wireframe (soft delete).",
|
|
3106
|
-
inputSchema:
|
|
3107
|
-
id: z15.string().describe("The UUID of the wireframe to delete")
|
|
3108
|
-
}
|
|
3623
|
+
inputSchema: deleteWireframeInput
|
|
3109
3624
|
}, async ({ id }) => {
|
|
3110
3625
|
const client2 = getApiClient();
|
|
3111
3626
|
await client2.deleteWireframe(id);
|
|
@@ -3122,11 +3637,7 @@ function registerDeleteWireframe(server) {
|
|
|
3122
3637
|
function registerUploadBrainstormMedia(server) {
|
|
3123
3638
|
server.registerTool("upload_brainstorm_media", {
|
|
3124
3639
|
description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
|
|
3125
|
-
inputSchema:
|
|
3126
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3127
|
-
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
3128
|
-
description: z15.string().optional().describe("Optional description of the media")
|
|
3129
|
-
}
|
|
3640
|
+
inputSchema: uploadBrainstormMediaInput
|
|
3130
3641
|
}, async ({
|
|
3131
3642
|
roadmapId,
|
|
3132
3643
|
filePath,
|
|
@@ -3176,10 +3687,7 @@ function registerUploadBrainstormMedia(server) {
|
|
|
3176
3687
|
function registerUpdateBrainstormMedia(server) {
|
|
3177
3688
|
server.registerTool("update_brainstorm_media", {
|
|
3178
3689
|
description: "Update a brainstorm media item's description.",
|
|
3179
|
-
inputSchema:
|
|
3180
|
-
id: z15.string().describe("The UUID of the brainstorm media"),
|
|
3181
|
-
description: z15.string().nullable().describe("New description for the media")
|
|
3182
|
-
}
|
|
3690
|
+
inputSchema: updateBrainstormMediaInput
|
|
3183
3691
|
}, async ({ id, description }) => {
|
|
3184
3692
|
const client2 = getApiClient();
|
|
3185
3693
|
const media = await client2.updateBrainstormMedia(id, { description });
|
|
@@ -3201,9 +3709,7 @@ function registerUpdateBrainstormMedia(server) {
|
|
|
3201
3709
|
function registerDeleteBrainstormMedia(server) {
|
|
3202
3710
|
server.registerTool("delete_brainstorm_media", {
|
|
3203
3711
|
description: "Delete a brainstorm media item (soft delete).",
|
|
3204
|
-
inputSchema:
|
|
3205
|
-
id: z15.string().describe("The UUID of the brainstorm media to delete")
|
|
3206
|
-
}
|
|
3712
|
+
inputSchema: deleteBrainstormMediaInput
|
|
3207
3713
|
}, async ({ id }) => {
|
|
3208
3714
|
const client2 = getApiClient();
|
|
3209
3715
|
await client2.deleteBrainstormMedia(id);
|
|
@@ -3220,11 +3726,7 @@ function registerDeleteBrainstormMedia(server) {
|
|
|
3220
3726
|
function registerUploadProductDesignMedia(server) {
|
|
3221
3727
|
server.registerTool("upload_product_design_media", {
|
|
3222
3728
|
description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
|
|
3223
|
-
inputSchema:
|
|
3224
|
-
productId: z15.string().describe("The UUID of the product"),
|
|
3225
|
-
filePath: z15.string().describe("Absolute path to the image or video file on disk"),
|
|
3226
|
-
description: z15.string().optional().describe("Optional description of the media")
|
|
3227
|
-
}
|
|
3729
|
+
inputSchema: uploadProductDesignMediaInput
|
|
3228
3730
|
}, async ({
|
|
3229
3731
|
productId,
|
|
3230
3732
|
filePath,
|
|
@@ -3275,11 +3777,7 @@ function registerUploadProductDesignMedia(server) {
|
|
|
3275
3777
|
function registerUpdateProductDesignMedia(server) {
|
|
3276
3778
|
server.registerTool("update_product_design_media", {
|
|
3277
3779
|
description: "Update a product design media item's description.",
|
|
3278
|
-
inputSchema:
|
|
3279
|
-
productId: z15.string().describe("The UUID of the product"),
|
|
3280
|
-
mediaId: z15.string().describe("The UUID of the design media"),
|
|
3281
|
-
description: z15.string().nullable().describe("New description for the media")
|
|
3282
|
-
}
|
|
3780
|
+
inputSchema: updateProductDesignMediaInput
|
|
3283
3781
|
}, async ({
|
|
3284
3782
|
productId,
|
|
3285
3783
|
mediaId,
|
|
@@ -3305,10 +3803,7 @@ function registerUpdateProductDesignMedia(server) {
|
|
|
3305
3803
|
function registerDeleteProductDesignMedia(server) {
|
|
3306
3804
|
server.registerTool("delete_product_design_media", {
|
|
3307
3805
|
description: "Delete a product design media item (soft delete).",
|
|
3308
|
-
inputSchema:
|
|
3309
|
-
productId: z15.string().describe("The UUID of the product"),
|
|
3310
|
-
mediaId: z15.string().describe("The UUID of the design media to delete")
|
|
3311
|
-
}
|
|
3806
|
+
inputSchema: deleteProductDesignMediaInput
|
|
3312
3807
|
}, async ({ productId, mediaId }) => {
|
|
3313
3808
|
const client2 = getApiClient();
|
|
3314
3809
|
await client2.deleteProductDesignMedia(productId, mediaId);
|
|
@@ -3328,10 +3823,7 @@ function isVideoContentType(contentType) {
|
|
|
3328
3823
|
function registerUploadDesignWalkthrough(server) {
|
|
3329
3824
|
server.registerTool("upload_design_walkthrough", {
|
|
3330
3825
|
description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
|
|
3331
|
-
inputSchema:
|
|
3332
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3333
|
-
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
3334
|
-
}
|
|
3826
|
+
inputSchema: uploadDesignWalkthroughInput
|
|
3335
3827
|
}, async ({ roadmapId, filePath }) => {
|
|
3336
3828
|
const client2 = getApiClient();
|
|
3337
3829
|
const filename = filePath.split("/").pop() || "video.mp4";
|
|
@@ -3371,10 +3863,7 @@ function registerUploadDesignWalkthrough(server) {
|
|
|
3371
3863
|
function registerUploadReleaseWalkthrough(server) {
|
|
3372
3864
|
server.registerTool("upload_release_walkthrough", {
|
|
3373
3865
|
description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
|
|
3374
|
-
inputSchema:
|
|
3375
|
-
roadmapId: z15.string().describe("The UUID of the roadmap item"),
|
|
3376
|
-
filePath: z15.string().describe("Absolute path to the video file on disk")
|
|
3377
|
-
}
|
|
3866
|
+
inputSchema: uploadReleaseWalkthroughInput
|
|
3378
3867
|
}, async ({ roadmapId, filePath }) => {
|
|
3379
3868
|
const client2 = getApiClient();
|
|
3380
3869
|
const filename = filePath.split("/").pop() || "video.mp4";
|
|
@@ -3430,11 +3919,7 @@ function getPrototypeContentType(filename) {
|
|
|
3430
3919
|
function registerPublishPrototype(server) {
|
|
3431
3920
|
server.registerTool("publish_prototype", {
|
|
3432
3921
|
description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
|
|
3433
|
-
inputSchema:
|
|
3434
|
-
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
|
|
3435
|
-
folderPath: z15.string().describe("Absolute path to the local mockup folder"),
|
|
3436
|
-
entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
|
|
3437
|
-
}
|
|
3922
|
+
inputSchema: publishPrototypeInput
|
|
3438
3923
|
}, async ({
|
|
3439
3924
|
roadmapId,
|
|
3440
3925
|
folderPath,
|
|
@@ -3593,9 +4078,7 @@ Expires: ${expiryDate}`
|
|
|
3593
4078
|
function registerListPrototypes(server) {
|
|
3594
4079
|
server.registerTool("list_prototypes", {
|
|
3595
4080
|
description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
|
|
3596
|
-
inputSchema:
|
|
3597
|
-
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
|
|
3598
|
-
}
|
|
4081
|
+
inputSchema: listPrototypesInput
|
|
3599
4082
|
}, async ({ roadmapId }) => {
|
|
3600
4083
|
const client2 = getApiClient();
|
|
3601
4084
|
const prototypes = await client2.listPrototypes(roadmapId);
|
|
@@ -3638,16 +4121,10 @@ ${lines.join(`
|
|
|
3638
4121
|
};
|
|
3639
4122
|
});
|
|
3640
4123
|
}
|
|
3641
|
-
var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
|
|
3642
4124
|
function registerSearchInitiatives(server) {
|
|
3643
4125
|
server.registerTool("search_initiatives", {
|
|
3644
4126
|
description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
|
|
3645
|
-
inputSchema:
|
|
3646
|
-
query: z15.string().optional().describe("Search query to match against title or description"),
|
|
3647
|
-
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
3648
|
-
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
3649
|
-
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
3650
|
-
}
|
|
4127
|
+
inputSchema: searchInitiativesInput
|
|
3651
4128
|
}, async ({
|
|
3652
4129
|
query,
|
|
3653
4130
|
horizon,
|
|
@@ -3673,7 +4150,7 @@ function registerSearchInitiatives(server) {
|
|
|
3673
4150
|
items: paginatedInitiatives.map((i) => ({
|
|
3674
4151
|
id: i.id,
|
|
3675
4152
|
title: i.title,
|
|
3676
|
-
description: i.description,
|
|
4153
|
+
description: contentToMarkdown(i.description),
|
|
3677
4154
|
horizon: i.horizon,
|
|
3678
4155
|
targetDate: i.targetDate,
|
|
3679
4156
|
itemCount: i.itemCount,
|
|
@@ -3695,9 +4172,7 @@ function registerSearchInitiatives(server) {
|
|
|
3695
4172
|
function registerGetInitiative(server) {
|
|
3696
4173
|
server.registerTool("get_initiative", {
|
|
3697
4174
|
description: "Get full details of an initiative including all linked roadmap items.",
|
|
3698
|
-
inputSchema:
|
|
3699
|
-
id: z15.string().describe("The UUID of the initiative")
|
|
3700
|
-
}
|
|
4175
|
+
inputSchema: getInitiativeInput
|
|
3701
4176
|
}, async ({ id }) => {
|
|
3702
4177
|
const client2 = getApiClient();
|
|
3703
4178
|
const result = await client2.getInitiative(id);
|
|
@@ -3705,7 +4180,13 @@ function registerGetInitiative(server) {
|
|
|
3705
4180
|
content: [
|
|
3706
4181
|
{
|
|
3707
4182
|
type: "text",
|
|
3708
|
-
text: JSON.stringify(
|
|
4183
|
+
text: JSON.stringify({
|
|
4184
|
+
...result,
|
|
4185
|
+
initiative: {
|
|
4186
|
+
...result.initiative,
|
|
4187
|
+
description: contentToMarkdown(result.initiative.description)
|
|
4188
|
+
}
|
|
4189
|
+
}, null, 2)
|
|
3709
4190
|
}
|
|
3710
4191
|
]
|
|
3711
4192
|
};
|
|
@@ -3714,14 +4195,7 @@ function registerGetInitiative(server) {
|
|
|
3714
4195
|
function registerCreateInitiative(server) {
|
|
3715
4196
|
server.registerTool("create_initiative", {
|
|
3716
4197
|
description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
|
|
3717
|
-
inputSchema:
|
|
3718
|
-
title: z15.string().describe("Title of the initiative"),
|
|
3719
|
-
description: z15.string().optional().describe("Description of the initiative (markdown)"),
|
|
3720
|
-
horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
|
|
3721
|
-
dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
|
|
3722
|
-
dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
|
|
3723
|
-
targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
|
|
3724
|
-
}
|
|
4198
|
+
inputSchema: createInitiativeInput
|
|
3725
4199
|
}, async ({
|
|
3726
4200
|
title,
|
|
3727
4201
|
description,
|
|
@@ -3763,16 +4237,7 @@ function registerCreateInitiative(server) {
|
|
|
3763
4237
|
function registerUpdateInitiative(server) {
|
|
3764
4238
|
server.registerTool("update_initiative", {
|
|
3765
4239
|
description: "Update an existing initiative.",
|
|
3766
|
-
inputSchema:
|
|
3767
|
-
id: z15.string().describe("The UUID of the initiative to update"),
|
|
3768
|
-
title: z15.string().optional().describe("New title"),
|
|
3769
|
-
description: z15.string().nullable().optional().describe("New description (null to clear)"),
|
|
3770
|
-
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
3771
|
-
dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
|
|
3772
|
-
dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
|
|
3773
|
-
targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
|
|
3774
|
-
order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
|
|
3775
|
-
}
|
|
4240
|
+
inputSchema: updateInitiativeInput
|
|
3776
4241
|
}, async ({
|
|
3777
4242
|
id,
|
|
3778
4243
|
title,
|
|
@@ -3825,9 +4290,7 @@ function registerUpdateInitiative(server) {
|
|
|
3825
4290
|
function registerDeleteInitiative(server) {
|
|
3826
4291
|
server.registerTool("delete_initiative", {
|
|
3827
4292
|
description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
|
|
3828
|
-
inputSchema:
|
|
3829
|
-
id: z15.string().describe("The UUID of the initiative to delete")
|
|
3830
|
-
}
|
|
4293
|
+
inputSchema: deleteInitiativeInput
|
|
3831
4294
|
}, async ({ id }) => {
|
|
3832
4295
|
const client2 = getApiClient();
|
|
3833
4296
|
await client2.deleteInitiative(id);
|
|
@@ -3844,12 +4307,7 @@ function registerDeleteInitiative(server) {
|
|
|
3844
4307
|
function registerReorderInitiatives(server) {
|
|
3845
4308
|
server.registerTool("reorder_initiatives", {
|
|
3846
4309
|
description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
|
|
3847
|
-
inputSchema:
|
|
3848
|
-
items: z15.array(z15.object({
|
|
3849
|
-
id: z15.string().describe("The UUID of the initiative"),
|
|
3850
|
-
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
3851
|
-
})).describe("Array of initiatives with their new order values")
|
|
3852
|
-
}
|
|
4310
|
+
inputSchema: reorderInitiativesInput
|
|
3853
4311
|
}, async ({ items }) => {
|
|
3854
4312
|
const client2 = getApiClient();
|
|
3855
4313
|
await client2.reorderInitiatives(items);
|
|
@@ -3866,14 +4324,7 @@ function registerReorderInitiatives(server) {
|
|
|
3866
4324
|
function registerSearchExports(server) {
|
|
3867
4325
|
server.registerTool("search_exports", {
|
|
3868
4326
|
description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
|
|
3869
|
-
inputSchema:
|
|
3870
|
-
roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
|
|
3871
|
-
externalSystem: z15.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
|
|
3872
|
-
localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
|
|
3873
|
-
localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
|
|
3874
|
-
limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
3875
|
-
offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
3876
|
-
}
|
|
4327
|
+
inputSchema: searchExportsInput
|
|
3877
4328
|
}, async ({
|
|
3878
4329
|
roadmapId,
|
|
3879
4330
|
externalSystem,
|
|
@@ -3908,9 +4359,7 @@ function registerSearchExports(server) {
|
|
|
3908
4359
|
function registerGetExport(server) {
|
|
3909
4360
|
server.registerTool("get_export", {
|
|
3910
4361
|
description: "Get full details of a single export record by ID.",
|
|
3911
|
-
inputSchema:
|
|
3912
|
-
id: z15.string().uuid().describe("The UUID of the export record")
|
|
3913
|
-
}
|
|
4362
|
+
inputSchema: getExportInput
|
|
3914
4363
|
}, async ({ id }) => {
|
|
3915
4364
|
const client2 = getApiClient();
|
|
3916
4365
|
const exportRecord = await client2.getExport(id);
|
|
@@ -3927,16 +4376,7 @@ function registerGetExport(server) {
|
|
|
3927
4376
|
function registerCreateExport(server) {
|
|
3928
4377
|
server.registerTool("create_export", {
|
|
3929
4378
|
description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
|
|
3930
|
-
inputSchema:
|
|
3931
|
-
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
|
|
3932
|
-
localEntityType: z15.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
|
|
3933
|
-
localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
|
|
3934
|
-
externalSystem: z15.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
|
|
3935
|
-
externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
|
|
3936
|
-
externalId: z15.string().min(1).describe("ID of the object in the external system"),
|
|
3937
|
-
externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
|
|
3938
|
-
metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
|
|
3939
|
-
}
|
|
4379
|
+
inputSchema: createExportInput
|
|
3940
4380
|
}, async ({
|
|
3941
4381
|
roadmapId,
|
|
3942
4382
|
localEntityType,
|
|
@@ -3971,11 +4411,7 @@ function registerCreateExport(server) {
|
|
|
3971
4411
|
function registerUpdateExport(server) {
|
|
3972
4412
|
server.registerTool("update_export", {
|
|
3973
4413
|
description: "Update an export record. Can update the external URL or metadata.",
|
|
3974
|
-
inputSchema:
|
|
3975
|
-
id: z15.string().uuid().describe("The UUID of the export record to update"),
|
|
3976
|
-
externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
|
|
3977
|
-
metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
|
|
3978
|
-
}
|
|
4414
|
+
inputSchema: updateExportInput
|
|
3979
4415
|
}, async ({
|
|
3980
4416
|
id,
|
|
3981
4417
|
externalUrl,
|
|
@@ -3996,9 +4432,7 @@ function registerUpdateExport(server) {
|
|
|
3996
4432
|
function registerDeleteExport(server) {
|
|
3997
4433
|
server.registerTool("delete_export", {
|
|
3998
4434
|
description: "Delete an export record. This is a soft delete.",
|
|
3999
|
-
inputSchema:
|
|
4000
|
-
id: z15.string().uuid().describe("The UUID of the export record to delete")
|
|
4001
|
-
}
|
|
4435
|
+
inputSchema: deleteExportInput
|
|
4002
4436
|
}, async ({ id }) => {
|
|
4003
4437
|
const client2 = getApiClient();
|
|
4004
4438
|
await client2.deleteExport(id);
|
|
@@ -4032,9 +4466,7 @@ function registerListPresentations(server) {
|
|
|
4032
4466
|
function registerGetPresentation(server) {
|
|
4033
4467
|
server.registerTool("get_presentation", {
|
|
4034
4468
|
description: "Get presentation with variants and slides.",
|
|
4035
|
-
inputSchema:
|
|
4036
|
-
id: z15.string().describe("The UUID of the presentation")
|
|
4037
|
-
}
|
|
4469
|
+
inputSchema: getPresentationInput
|
|
4038
4470
|
}, async ({ id }) => {
|
|
4039
4471
|
const client2 = getApiClient();
|
|
4040
4472
|
const presentation2 = await client2.getPresentation(id);
|
|
@@ -4062,10 +4494,7 @@ function registerGetPresentation(server) {
|
|
|
4062
4494
|
function registerCreatePresentation(server) {
|
|
4063
4495
|
server.registerTool("create_presentation", {
|
|
4064
4496
|
description: "Create a new presentation.",
|
|
4065
|
-
inputSchema:
|
|
4066
|
-
title: z15.string().describe("Title of the presentation"),
|
|
4067
|
-
description: z15.string().nullable().optional().describe("Description of the presentation")
|
|
4068
|
-
}
|
|
4497
|
+
inputSchema: createPresentationInput
|
|
4069
4498
|
}, async ({ title, description }) => {
|
|
4070
4499
|
const client2 = getApiClient();
|
|
4071
4500
|
const presentation2 = await client2.createPresentation({
|
|
@@ -4085,11 +4514,7 @@ function registerCreatePresentation(server) {
|
|
|
4085
4514
|
function registerUpdatePresentation(server) {
|
|
4086
4515
|
server.registerTool("update_presentation", {
|
|
4087
4516
|
description: "Update an existing presentation.",
|
|
4088
|
-
inputSchema:
|
|
4089
|
-
id: z15.string().describe("The UUID of the presentation to update"),
|
|
4090
|
-
title: z15.string().optional().describe("New title"),
|
|
4091
|
-
description: z15.string().nullable().optional().describe("New description")
|
|
4092
|
-
}
|
|
4517
|
+
inputSchema: updatePresentationInput
|
|
4093
4518
|
}, async ({
|
|
4094
4519
|
id,
|
|
4095
4520
|
title,
|
|
@@ -4115,9 +4540,7 @@ function registerUpdatePresentation(server) {
|
|
|
4115
4540
|
function registerDeletePresentation(server) {
|
|
4116
4541
|
server.registerTool("delete_presentation", {
|
|
4117
4542
|
description: "Delete a presentation.",
|
|
4118
|
-
inputSchema:
|
|
4119
|
-
id: z15.string().describe("The UUID of the presentation to delete")
|
|
4120
|
-
}
|
|
4543
|
+
inputSchema: deletePresentationInput
|
|
4121
4544
|
}, async ({ id }) => {
|
|
4122
4545
|
const client2 = getApiClient();
|
|
4123
4546
|
await client2.deletePresentation(id);
|
|
@@ -4134,12 +4557,7 @@ function registerDeletePresentation(server) {
|
|
|
4134
4557
|
function registerReorderPresentations(server) {
|
|
4135
4558
|
server.registerTool("reorder_presentations", {
|
|
4136
4559
|
description: "Reorder presentations by setting their order values. Lower order values appear first.",
|
|
4137
|
-
inputSchema:
|
|
4138
|
-
items: z15.array(z15.object({
|
|
4139
|
-
id: z15.string().describe("The UUID of the presentation"),
|
|
4140
|
-
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
4141
|
-
})).describe("Array of presentations with their new order values")
|
|
4142
|
-
}
|
|
4560
|
+
inputSchema: reorderPresentationsInput
|
|
4143
4561
|
}, async ({ items }) => {
|
|
4144
4562
|
const client2 = getApiClient();
|
|
4145
4563
|
await client2.reorderPresentations(items);
|
|
@@ -4156,9 +4574,7 @@ function registerReorderPresentations(server) {
|
|
|
4156
4574
|
function registerListVariants(server) {
|
|
4157
4575
|
server.registerTool("list_variants", {
|
|
4158
4576
|
description: "List all variants for a presentation.",
|
|
4159
|
-
inputSchema:
|
|
4160
|
-
presentationId: z15.string().describe("The UUID of the presentation")
|
|
4161
|
-
}
|
|
4577
|
+
inputSchema: listVariantsInput
|
|
4162
4578
|
}, async ({ presentationId }) => {
|
|
4163
4579
|
const client2 = getApiClient();
|
|
4164
4580
|
const result = await client2.listVariants(presentationId);
|
|
@@ -4175,10 +4591,7 @@ function registerListVariants(server) {
|
|
|
4175
4591
|
function registerGetVariant(server) {
|
|
4176
4592
|
server.registerTool("get_variant", {
|
|
4177
4593
|
description: "Get variant with its slides.",
|
|
4178
|
-
inputSchema:
|
|
4179
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4180
|
-
variantId: z15.string().describe("The UUID of the variant")
|
|
4181
|
-
}
|
|
4594
|
+
inputSchema: getVariantInput
|
|
4182
4595
|
}, async ({ presentationId, variantId }) => {
|
|
4183
4596
|
const client2 = getApiClient();
|
|
4184
4597
|
const variant2 = await client2.getVariant(presentationId, variantId);
|
|
@@ -4199,11 +4612,7 @@ function registerGetVariant(server) {
|
|
|
4199
4612
|
function registerCreateVariant(server) {
|
|
4200
4613
|
server.registerTool("create_variant", {
|
|
4201
4614
|
description: "Create a new variant for a presentation.",
|
|
4202
|
-
inputSchema:
|
|
4203
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4204
|
-
name: z15.string().describe("Name of the variant"),
|
|
4205
|
-
audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
|
|
4206
|
-
}
|
|
4615
|
+
inputSchema: createVariantInput
|
|
4207
4616
|
}, async ({
|
|
4208
4617
|
presentationId,
|
|
4209
4618
|
name,
|
|
@@ -4227,12 +4636,7 @@ function registerCreateVariant(server) {
|
|
|
4227
4636
|
function registerUpdateVariant(server) {
|
|
4228
4637
|
server.registerTool("update_variant", {
|
|
4229
4638
|
description: "Update an existing variant.",
|
|
4230
|
-
inputSchema:
|
|
4231
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4232
|
-
variantId: z15.string().describe("The UUID of the variant to update"),
|
|
4233
|
-
name: z15.string().optional().describe("New name"),
|
|
4234
|
-
audienceId: z15.string().nullable().optional().describe("New target audience UUID")
|
|
4235
|
-
}
|
|
4639
|
+
inputSchema: updateVariantInput
|
|
4236
4640
|
}, async ({
|
|
4237
4641
|
presentationId,
|
|
4238
4642
|
variantId,
|
|
@@ -4259,10 +4663,7 @@ function registerUpdateVariant(server) {
|
|
|
4259
4663
|
function registerDeleteVariant(server) {
|
|
4260
4664
|
server.registerTool("delete_variant", {
|
|
4261
4665
|
description: "Delete a variant.",
|
|
4262
|
-
inputSchema:
|
|
4263
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4264
|
-
variantId: z15.string().describe("The UUID of the variant to delete")
|
|
4265
|
-
}
|
|
4666
|
+
inputSchema: deleteVariantInput
|
|
4266
4667
|
}, async ({ presentationId, variantId }) => {
|
|
4267
4668
|
const client2 = getApiClient();
|
|
4268
4669
|
await client2.deleteVariant(presentationId, variantId);
|
|
@@ -4279,13 +4680,7 @@ function registerDeleteVariant(server) {
|
|
|
4279
4680
|
function registerReorderVariants(server) {
|
|
4280
4681
|
server.registerTool("reorder_variants", {
|
|
4281
4682
|
description: "Reorder variants by setting their order values. Lower order values appear first.",
|
|
4282
|
-
inputSchema:
|
|
4283
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4284
|
-
items: z15.array(z15.object({
|
|
4285
|
-
id: z15.string().describe("The UUID of the variant"),
|
|
4286
|
-
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
4287
|
-
})).describe("Array of variants with their new order values")
|
|
4288
|
-
}
|
|
4683
|
+
inputSchema: reorderVariantsInput
|
|
4289
4684
|
}, async ({
|
|
4290
4685
|
presentationId,
|
|
4291
4686
|
items
|
|
@@ -4305,10 +4700,7 @@ function registerReorderVariants(server) {
|
|
|
4305
4700
|
function registerCloneVariant(server) {
|
|
4306
4701
|
server.registerTool("clone_variant", {
|
|
4307
4702
|
description: "Clone a variant with all its slides.",
|
|
4308
|
-
inputSchema:
|
|
4309
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4310
|
-
variantId: z15.string().describe("The UUID of the variant to clone")
|
|
4311
|
-
}
|
|
4703
|
+
inputSchema: cloneVariantInput
|
|
4312
4704
|
}, async ({ presentationId, variantId }) => {
|
|
4313
4705
|
const client2 = getApiClient();
|
|
4314
4706
|
const clonedVariant = await client2.cloneVariant(presentationId, variantId);
|
|
@@ -4325,10 +4717,7 @@ function registerCloneVariant(server) {
|
|
|
4325
4717
|
function registerSetDefaultVariant(server) {
|
|
4326
4718
|
server.registerTool("set_default_variant", {
|
|
4327
4719
|
description: "Set a variant as the default for the presentation.",
|
|
4328
|
-
inputSchema:
|
|
4329
|
-
presentationId: z15.string().describe("The UUID of the presentation"),
|
|
4330
|
-
variantId: z15.string().describe("The UUID of the variant to set as default")
|
|
4331
|
-
}
|
|
4720
|
+
inputSchema: setDefaultVariantInput
|
|
4332
4721
|
}, async ({ presentationId, variantId }) => {
|
|
4333
4722
|
const client2 = getApiClient();
|
|
4334
4723
|
await client2.setDefaultVariant(presentationId, variantId);
|
|
@@ -4345,9 +4734,7 @@ function registerSetDefaultVariant(server) {
|
|
|
4345
4734
|
function registerListSlides(server) {
|
|
4346
4735
|
server.registerTool("list_slides", {
|
|
4347
4736
|
description: "List all slides in a variant.",
|
|
4348
|
-
inputSchema:
|
|
4349
|
-
variantId: z15.string().describe("The UUID of the variant")
|
|
4350
|
-
}
|
|
4737
|
+
inputSchema: listSlidesInput
|
|
4351
4738
|
}, async ({ variantId }) => {
|
|
4352
4739
|
const client2 = getApiClient();
|
|
4353
4740
|
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
@@ -4375,10 +4762,7 @@ function registerListSlides(server) {
|
|
|
4375
4762
|
function registerGetSlide(server) {
|
|
4376
4763
|
server.registerTool("get_slide", {
|
|
4377
4764
|
description: "Get a slide by ID.",
|
|
4378
|
-
inputSchema:
|
|
4379
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4380
|
-
slideId: z15.string().describe("The UUID of the slide")
|
|
4381
|
-
}
|
|
4765
|
+
inputSchema: getSlideInput
|
|
4382
4766
|
}, async ({ variantId, slideId }) => {
|
|
4383
4767
|
const client2 = getApiClient();
|
|
4384
4768
|
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
@@ -4406,25 +4790,7 @@ function registerGetSlide(server) {
|
|
|
4406
4790
|
function registerCreateSlide(server) {
|
|
4407
4791
|
server.registerTool("create_slide", {
|
|
4408
4792
|
description: "Create a new slide in a variant. Slide types: title (title + subtitle), section_header (title + subtitle), bullets (title + items array), two_column (title + left/right text), comparison (leftLabel + leftContent + rightLabel + rightContent), timeline (title + steps array of {title, description}), image (title + imageUrl + caption), quote (quote + attribution), code (title + code + language), thank_you (title + subtitle), mermaid (title + code with mermaid diagram syntax), paragraph (title + body with markdown text).",
|
|
4409
|
-
inputSchema:
|
|
4410
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4411
|
-
slideType: z15.enum([
|
|
4412
|
-
"title",
|
|
4413
|
-
"section_header",
|
|
4414
|
-
"bullets",
|
|
4415
|
-
"two_column",
|
|
4416
|
-
"comparison",
|
|
4417
|
-
"timeline",
|
|
4418
|
-
"image",
|
|
4419
|
-
"quote",
|
|
4420
|
-
"code",
|
|
4421
|
-
"thank_you",
|
|
4422
|
-
"mermaid",
|
|
4423
|
-
"paragraph"
|
|
4424
|
-
]).default("bullets").describe("The type of slide to create"),
|
|
4425
|
-
content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
|
|
4426
|
-
speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
|
|
4427
|
-
}
|
|
4793
|
+
inputSchema: createSlideInput
|
|
4428
4794
|
}, async ({
|
|
4429
4795
|
variantId,
|
|
4430
4796
|
slideType,
|
|
@@ -4461,13 +4827,7 @@ function registerCreateSlide(server) {
|
|
|
4461
4827
|
function registerUpdateSlide(server) {
|
|
4462
4828
|
server.registerTool("update_slide", {
|
|
4463
4829
|
description: "Update an existing slide.",
|
|
4464
|
-
inputSchema:
|
|
4465
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4466
|
-
slideId: z15.string().describe("The UUID of the slide to update"),
|
|
4467
|
-
title: z15.string().optional().describe("New title"),
|
|
4468
|
-
content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
|
|
4469
|
-
speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
|
|
4470
|
-
}
|
|
4830
|
+
inputSchema: updateSlideInput
|
|
4471
4831
|
}, async ({
|
|
4472
4832
|
variantId,
|
|
4473
4833
|
slideId,
|
|
@@ -4508,10 +4868,7 @@ function registerUpdateSlide(server) {
|
|
|
4508
4868
|
function registerDeleteSlide(server) {
|
|
4509
4869
|
server.registerTool("delete_slide", {
|
|
4510
4870
|
description: "Delete a slide (soft delete).",
|
|
4511
|
-
inputSchema:
|
|
4512
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4513
|
-
slideId: z15.string().describe("The UUID of the slide to delete")
|
|
4514
|
-
}
|
|
4871
|
+
inputSchema: deleteSlideInput
|
|
4515
4872
|
}, async ({ variantId, slideId }) => {
|
|
4516
4873
|
const client2 = getApiClient();
|
|
4517
4874
|
const presentationId = await client2.getVariantPresentationId(variantId);
|
|
@@ -4539,13 +4896,7 @@ function registerDeleteSlide(server) {
|
|
|
4539
4896
|
function registerReorderSlides(server) {
|
|
4540
4897
|
server.registerTool("reorder_slides", {
|
|
4541
4898
|
description: "Reorder slides by setting their order values. Lower order values appear first.",
|
|
4542
|
-
inputSchema:
|
|
4543
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4544
|
-
items: z15.array(z15.object({
|
|
4545
|
-
id: z15.string().describe("The UUID of the slide"),
|
|
4546
|
-
order: z15.number().int().min(0).describe("The new order value (0-based)")
|
|
4547
|
-
})).describe("Array of slides with their new order values")
|
|
4548
|
-
}
|
|
4899
|
+
inputSchema: reorderSlidesInput
|
|
4549
4900
|
}, async ({
|
|
4550
4901
|
variantId,
|
|
4551
4902
|
items
|
|
@@ -4576,11 +4927,7 @@ function registerReorderSlides(server) {
|
|
|
4576
4927
|
function registerUploadSlideImage(server) {
|
|
4577
4928
|
server.registerTool("upload_slide_image", {
|
|
4578
4929
|
description: 'Upload an image to a slide. Gets a presigned URL and returns a curl command to execute for the upload, then updates the slide content with the image URL. The slide must be of type "image".',
|
|
4579
|
-
inputSchema:
|
|
4580
|
-
variantId: z15.string().describe("The UUID of the variant"),
|
|
4581
|
-
slideId: z15.string().describe("The UUID of the slide to add the image to"),
|
|
4582
|
-
filePath: z15.string().describe("Absolute path to the image file on disk")
|
|
4583
|
-
}
|
|
4930
|
+
inputSchema: uploadSlideImageInput
|
|
4584
4931
|
}, async ({
|
|
4585
4932
|
variantId,
|
|
4586
4933
|
slideId,
|
|
@@ -4652,11 +4999,7 @@ function registerUploadSlideImage(server) {
|
|
|
4652
4999
|
function registerCreateFeedbackSession(server) {
|
|
4653
5000
|
server.registerTool("create_feedback_session", {
|
|
4654
5001
|
description: "Create a feedback session for a prototype and get a shareable review link. Reviewers who open the link can optionally enter their name before leaving pin-based feedback.",
|
|
4655
|
-
inputSchema:
|
|
4656
|
-
prototypeId: z15.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
|
|
4657
|
-
name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
|
|
4658
|
-
expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
|
|
4659
|
-
}
|
|
5002
|
+
inputSchema: createFeedbackSessionInput
|
|
4660
5003
|
}, async ({
|
|
4661
5004
|
prototypeId,
|
|
4662
5005
|
name,
|
|
@@ -4703,9 +5046,7 @@ function registerCreateFeedbackSession(server) {
|
|
|
4703
5046
|
function registerListFeedbackSessions(server) {
|
|
4704
5047
|
server.registerTool("list_feedback_sessions", {
|
|
4705
5048
|
description: "List all feedback sessions for a prototype with comment counts and status.",
|
|
4706
|
-
inputSchema:
|
|
4707
|
-
prototypeId: z15.string().uuid().describe("The UUID of the prototype")
|
|
4708
|
-
}
|
|
5049
|
+
inputSchema: listFeedbackSessionsInput
|
|
4709
5050
|
}, async ({ prototypeId }) => {
|
|
4710
5051
|
const client2 = getApiClient();
|
|
4711
5052
|
const sessions = await client2.listFeedbackSessions(prototypeId);
|
|
@@ -4754,11 +5095,7 @@ function formatCommentLine(c) {
|
|
|
4754
5095
|
function registerGetFeedbackSummary(server) {
|
|
4755
5096
|
server.registerTool("get_feedback_summary", {
|
|
4756
5097
|
description: "Get a human-readable summary of feedback for a session, grouped by page. Shows pin numbers, reviewer names, comment text, and which element was pinned. Use this for a quick overview of feedback.",
|
|
4757
|
-
inputSchema:
|
|
4758
|
-
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4759
|
-
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4760
|
-
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
|
|
4761
|
-
}
|
|
5098
|
+
inputSchema: getFeedbackSummaryInput
|
|
4762
5099
|
}, async ({
|
|
4763
5100
|
prototypeId,
|
|
4764
5101
|
sessionId,
|
|
@@ -4797,12 +5134,7 @@ function registerGetFeedbackSummary(server) {
|
|
|
4797
5134
|
function registerGetFeedbackDetail(server) {
|
|
4798
5135
|
server.registerTool("get_feedback_detail", {
|
|
4799
5136
|
description: "Get full raw pin data for feedback comments, including CSS selectors, bounding boxes, parent/sibling DOM context, and coordinates. Use this when you need exact element information to make targeted code changes.",
|
|
4800
|
-
inputSchema:
|
|
4801
|
-
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4802
|
-
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4803
|
-
commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
|
|
4804
|
-
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
|
|
4805
|
-
}
|
|
5137
|
+
inputSchema: getFeedbackDetailInput
|
|
4806
5138
|
}, async ({
|
|
4807
5139
|
prototypeId,
|
|
4808
5140
|
sessionId,
|
|
@@ -4846,11 +5178,7 @@ function registerGetFeedbackDetail(server) {
|
|
|
4846
5178
|
function registerResolveFeedbackComment(server) {
|
|
4847
5179
|
server.registerTool("resolve_feedback_comment", {
|
|
4848
5180
|
description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
|
|
4849
|
-
inputSchema:
|
|
4850
|
-
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4851
|
-
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4852
|
-
commentId: z15.string().uuid().describe("The UUID of the comment to resolve/unresolve")
|
|
4853
|
-
}
|
|
5181
|
+
inputSchema: resolveFeedbackCommentInput
|
|
4854
5182
|
}, async ({
|
|
4855
5183
|
prototypeId,
|
|
4856
5184
|
sessionId,
|