@ourroadmaps/mcp 0.29.0 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +560 -497
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -280,6 +280,7 @@ var audienceSchema = z2.object({
280
280
  id: z2.string().uuid(),
281
281
  organizationId: z2.string(),
282
282
  name: z2.string(),
283
+ type: z2.enum(["stakeholder", "persona"]).nullable(),
283
284
  description: z2.string().nullable(),
284
285
  order: z2.number().int(),
285
286
  createdAt: z2.string(),
@@ -614,6 +615,8 @@ var roadmapSchema = z11.object({
614
615
  title: z11.string(),
615
616
  horizon: horizonSchema.nullable(),
616
617
  status: roadmapStatusSchema.nullable(),
618
+ phase: z11.string().nullable(),
619
+ phaseStep: z11.string().nullable(),
617
620
  value: effortSchema.nullable(),
618
621
  effort: effortSchema.nullable(),
619
622
  order: z11.number().int(),
@@ -903,31 +906,476 @@ var statusUpdateSchema = z14.object({
903
906
  items: z14.array(statusUpdateItemSchema).optional()
904
907
  });
905
908
  var statusUpdateListSchema = z14.array(statusUpdateSchema);
906
- // ../../packages/shared/src/schemas/variant.ts
909
+ // ../../packages/shared/src/schemas/tool-inputs.ts
907
910
  import { z as z15 } from "zod";
908
- var variantSchema = z15.object({
909
- id: z15.string().uuid(),
910
- presentationId: z15.string().uuid(),
911
- name: z15.string(),
912
- audienceId: z15.string().uuid().nullable(),
913
- isDefault: z15.boolean(),
914
- order: z15.number().int(),
915
- createdAt: z15.string(),
916
- createdBy: z15.string(),
917
- updatedAt: z15.string().nullable()
911
+ var paginationFields = {
912
+ limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
913
+ offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
914
+ };
915
+ var idField = (entity) => z15.string().describe(`The UUID of the ${entity}`);
916
+ var uuidField = (entity) => z15.string().uuid().describe(`The UUID of the ${entity}`);
917
+ var orderItemsField = (entity) => z15.array(z15.object({
918
+ id: z15.string().describe(`The UUID of the ${entity}`),
919
+ order: z15.number().int().min(0).describe("The new order value (0-based)")
920
+ })).describe(`Array of ${entity}s with their new order values`);
921
+ var yyyyMmDdField = (description) => z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe(description);
922
+ var sizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
923
+ var searchRoadmapsInput = {
924
+ query: z15.string().optional().describe("Search query to match against title or description"),
925
+ status: roadmapStatusSchema.optional().describe("Filter by status"),
926
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
927
+ phase: z15.string().optional().describe("Filter by phase"),
928
+ phaseStep: z15.string().optional().describe("Filter by phase step"),
929
+ ...paginationFields
930
+ };
931
+ var getRoadmapInput = {
932
+ id: idField("roadmap item")
933
+ };
934
+ var createRoadmapItemInput = {
935
+ title: z15.string().describe("Title of the roadmap item"),
936
+ status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
937
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
938
+ phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
939
+ phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
940
+ initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
941
+ dateGranularity: dateGranularitySchema.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
942
+ dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
943
+ targetGranularity: dateGranularitySchema.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
944
+ targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
945
+ };
946
+ var updateRoadmapItemInput = {
947
+ id: idField("roadmap item to update"),
948
+ title: z15.string().optional().describe("New title"),
949
+ status: roadmapStatusSchema.optional().describe("New status"),
950
+ horizon: horizonSchema.optional().describe("New planning horizon"),
951
+ phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
952
+ phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
953
+ value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
954
+ effort: effortSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
955
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
956
+ initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
957
+ designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
958
+ planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
959
+ buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
960
+ releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
961
+ prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
962
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
963
+ dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
964
+ targetGranularity: dateGranularitySchema.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
965
+ targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
966
+ };
967
+ var deleteRoadmapItemInput = {
968
+ id: idField("roadmap item to delete")
969
+ };
970
+ var reorderRoadmapsInput = {
971
+ items: z15.array(z15.object({
972
+ id: z15.string().describe("The UUID of the roadmap item"),
973
+ order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
974
+ })).describe("Array of roadmap items with their new order values")
975
+ };
976
+ var savePrdInput = {
977
+ roadmapId: idField("roadmap item"),
978
+ what: z15.string().nullable().describe("What is being built - the feature description"),
979
+ why: z15.string().nullable().describe("Why this is being built - the business justification"),
980
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
981
+ };
982
+ var updateBrainstormNotesInput = {
983
+ roadmapId: idField("roadmap item"),
984
+ notes: z15.string().describe("The brainstorm notes content")
985
+ };
986
+ var searchFeaturesInput = {
987
+ query: z15.string().optional().describe("Search query to match against name"),
988
+ type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
989
+ };
990
+ var getFeatureInput = {
991
+ id: idField("feature")
992
+ };
993
+ var addFeatureInput = {
994
+ name: z15.string().describe("Name of the feature"),
995
+ description: z15.string().optional().describe("Description of the feature"),
996
+ type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
997
+ parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
998
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
999
+ linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
1000
+ };
1001
+ var updateFeatureInput = {
1002
+ id: idField("feature to update"),
1003
+ name: z15.string().optional().describe("New name for the feature"),
1004
+ type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
1005
+ parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
1006
+ };
1007
+ var deleteFeatureInput = {
1008
+ id: idField("feature to delete")
1009
+ };
1010
+ var searchIdeasInput = {
1011
+ query: z15.string().optional().describe("Search query to match against title or description"),
1012
+ status: ideaStatusSchema.optional().describe("Filter by status")
1013
+ };
1014
+ var getIdeaInput = {
1015
+ id: idField("idea")
1016
+ };
1017
+ var captureIdeaInput = {
1018
+ title: z15.string().describe("Title of the idea"),
1019
+ description: z15.string().optional().describe("Detailed description of the idea"),
1020
+ source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
1021
+ };
1022
+ var updateIdeaInput = {
1023
+ id: idField("idea to update"),
1024
+ title: z15.string().optional().describe("New title"),
1025
+ description: z15.string().nullable().optional().describe("New description"),
1026
+ status: ideaStatusSchema.optional().describe("New status"),
1027
+ value: sizeSchema.nullable().optional().describe("Estimated value"),
1028
+ effort: sizeSchema.nullable().optional().describe("Estimated effort")
1029
+ };
1030
+ var deleteIdeaInput = {
1031
+ id: idField("idea to delete")
1032
+ };
1033
+ var updateStrategyInput = {
1034
+ vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
1035
+ mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
1036
+ };
1037
+ var createScenarioInput = {
1038
+ title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
1039
+ description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
1040
+ };
1041
+ var updateScenarioInput = {
1042
+ id: idField("scenario to update"),
1043
+ title: z15.string().optional().describe("New title"),
1044
+ description: z15.string().nullable().optional().describe("New description")
1045
+ };
1046
+ var deleteScenarioInput = {
1047
+ id: idField("scenario to delete")
1048
+ };
1049
+ var searchProductsInput = {
1050
+ query: z15.string().optional().describe("Search query to match against product name"),
1051
+ type: productTypeSchema.optional().describe("Filter by product type")
1052
+ };
1053
+ var getProductInput = {
1054
+ id: idField("product")
1055
+ };
1056
+ var createProductInput = {
1057
+ type: productTypeSchema.describe("Type of product"),
1058
+ name: z15.string().describe("Name of the product"),
1059
+ parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
1060
+ };
1061
+ var updateProductInput = {
1062
+ id: idField("product to update"),
1063
+ name: z15.string().optional().describe("New name"),
1064
+ parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
1065
+ };
1066
+ var deleteProductInput = {
1067
+ id: idField("product to delete")
1068
+ };
1069
+ var getProductDocumentationInput = {
1070
+ productId: idField("product")
1071
+ };
1072
+ var updateProductDocumentationInput = {
1073
+ productId: idField("product"),
1074
+ designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
1075
+ adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
1076
+ };
1077
+ var createAudienceInput = {
1078
+ name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
1079
+ description: z15.string().nullable().optional().describe("Description of the audience")
1080
+ };
1081
+ var updateAudienceInput = {
1082
+ id: idField("audience to update"),
1083
+ name: z15.string().optional().describe("New name"),
1084
+ description: z15.string().nullable().optional().describe("New description")
1085
+ };
1086
+ var deleteAudienceInput = {
1087
+ id: idField("audience to delete")
1088
+ };
1089
+ var getHistoryInput = {
1090
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1091
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format"),
1092
+ entityType: z15.enum([
1093
+ "roadmap",
1094
+ "feature",
1095
+ "idea",
1096
+ "prd",
1097
+ "wireframe",
1098
+ "product",
1099
+ "audience",
1100
+ "scenario"
1101
+ ]).optional().describe("Filter to specific entity type")
1102
+ };
1103
+ var getHistorySummaryInput = {
1104
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1105
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format")
1106
+ };
1107
+ var createStatusUpdateInput = {
1108
+ startDate: yyyyMmDdField("Report period start date in YYYY-MM-DD format"),
1109
+ endDate: yyyyMmDdField("Report period end date in YYYY-MM-DD format"),
1110
+ content: z15.string().describe("The markdown content of the status report"),
1111
+ title: z15.string().optional().describe("Optional title for the report"),
1112
+ items: z15.array(z15.object({
1113
+ roadmapItemId: z15.string().describe("UUID of the roadmap item"),
1114
+ status: z15.string().describe("Status of the item at report creation time")
1115
+ })).optional().describe("Roadmap items to include in the report snapshot")
1116
+ };
1117
+ var saveStoriesInput = {
1118
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1119
+ epics: z15.array(z15.object({
1120
+ title: z15.string().min(1).describe("Title of the epic"),
1121
+ description: z15.string().nullable().optional().describe("Description of the epic"),
1122
+ stories: z15.array(z15.object({
1123
+ title: z15.string().min(1).describe("Title of the story"),
1124
+ description: z15.string().nullable().optional().describe("Description of the story")
1125
+ })).optional().describe("Stories within this epic")
1126
+ })).optional().describe("List of epics with their nested stories"),
1127
+ stories: z15.array(z15.object({
1128
+ title: z15.string().min(1).describe("Title of the story"),
1129
+ description: z15.string().nullable().optional().describe("Description of the story")
1130
+ })).optional().describe("List of standalone stories (not part of any epic)")
1131
+ };
1132
+ var searchInitiativesInput = {
1133
+ query: z15.string().optional().describe("Search query to match against title or description"),
1134
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1135
+ ...paginationFields
1136
+ };
1137
+ var getInitiativeInput = {
1138
+ id: idField("initiative")
1139
+ };
1140
+ var createInitiativeInput = {
1141
+ title: z15.string().describe("Title of the initiative"),
1142
+ description: z15.string().optional().describe("Description of the initiative (markdown)"),
1143
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1144
+ dateGranularity: dateGranularitySchema.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
1145
+ dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
1146
+ targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
1147
+ };
1148
+ var updateInitiativeInput = {
1149
+ id: idField("initiative to update"),
1150
+ title: z15.string().optional().describe("New title"),
1151
+ description: z15.string().nullable().optional().describe("New description (null to clear)"),
1152
+ horizon: horizonSchema.optional().describe("New planning horizon"),
1153
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("New target date granularity (null to clear)"),
1154
+ dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
1155
+ targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
1156
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
1157
+ };
1158
+ var deleteInitiativeInput = {
1159
+ id: idField("initiative to delete")
1160
+ };
1161
+ var reorderInitiativesInput = {
1162
+ items: orderItemsField("initiative")
1163
+ };
1164
+ var uploadWireframeInput = {
1165
+ roadmapId: idField("roadmap item"),
1166
+ filePath: z15.string().describe("Absolute path to the image file on disk"),
1167
+ description: z15.string().optional().describe("Optional description of the wireframe"),
1168
+ outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
1169
+ };
1170
+ var updateWireframeInput = {
1171
+ id: idField("wireframe"),
1172
+ description: z15.string().nullable().optional().describe("New description for the wireframe"),
1173
+ outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
1174
+ };
1175
+ var deleteWireframeInput = {
1176
+ id: idField("wireframe to delete")
1177
+ };
1178
+ var uploadBrainstormMediaInput = {
1179
+ roadmapId: idField("roadmap item"),
1180
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1181
+ description: z15.string().optional().describe("Optional description of the media")
1182
+ };
1183
+ var updateBrainstormMediaInput = {
1184
+ id: idField("brainstorm media"),
1185
+ description: z15.string().nullable().describe("New description for the media")
1186
+ };
1187
+ var deleteBrainstormMediaInput = {
1188
+ id: idField("brainstorm media to delete")
1189
+ };
1190
+ var uploadProductDesignMediaInput = {
1191
+ productId: idField("product"),
1192
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1193
+ description: z15.string().optional().describe("Optional description of the media")
1194
+ };
1195
+ var updateProductDesignMediaInput = {
1196
+ productId: idField("product"),
1197
+ mediaId: idField("design media"),
1198
+ description: z15.string().nullable().describe("New description for the media")
1199
+ };
1200
+ var deleteProductDesignMediaInput = {
1201
+ productId: idField("product"),
1202
+ mediaId: idField("design media to delete")
1203
+ };
1204
+ var uploadDesignWalkthroughInput = {
1205
+ roadmapId: idField("roadmap item"),
1206
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1207
+ };
1208
+ var uploadReleaseWalkthroughInput = {
1209
+ roadmapId: idField("roadmap item"),
1210
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1211
+ };
1212
+ var publishPrototypeInput = {
1213
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
1214
+ folderPath: z15.string().describe("Absolute path to the local mockup folder"),
1215
+ entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
1216
+ };
1217
+ var listPrototypesInput = {
1218
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
1219
+ };
1220
+ var createFeedbackSessionInput = {
1221
+ prototypeId: uuidField("prototype to create a feedback session for"),
1222
+ name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
1223
+ expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
1224
+ };
1225
+ var listFeedbackSessionsInput = {
1226
+ prototypeId: uuidField("prototype")
1227
+ };
1228
+ var getFeedbackSummaryInput = {
1229
+ prototypeId: uuidField("prototype"),
1230
+ sessionId: uuidField("feedback session"),
1231
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
1232
+ };
1233
+ var getFeedbackDetailInput = {
1234
+ prototypeId: uuidField("prototype"),
1235
+ sessionId: uuidField("feedback session"),
1236
+ commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
1237
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
1238
+ };
1239
+ var resolveFeedbackCommentInput = {
1240
+ prototypeId: uuidField("prototype"),
1241
+ sessionId: uuidField("feedback session"),
1242
+ commentId: uuidField("comment to resolve/unresolve")
1243
+ };
1244
+ var searchExportsInput = {
1245
+ roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
1246
+ externalSystem: externalSystemSchema.optional().describe("Filter by external system"),
1247
+ localEntityType: localEntityTypeSchema.optional().describe("Filter by local entity type"),
1248
+ localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
1249
+ ...paginationFields
1250
+ };
1251
+ var getExportInput = {
1252
+ id: z15.string().uuid().describe("The UUID of the export record")
1253
+ };
1254
+ var createExportInput = {
1255
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1256
+ localEntityType: localEntityTypeSchema.describe("Type of local entity being exported"),
1257
+ localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
1258
+ externalSystem: externalSystemSchema.describe("External system where the entity was exported"),
1259
+ externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
1260
+ externalId: z15.string().min(1).describe("ID of the object in the external system"),
1261
+ externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
1262
+ metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
1263
+ };
1264
+ var updateExportInput = {
1265
+ id: z15.string().uuid().describe("The UUID of the export record to update"),
1266
+ externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
1267
+ metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
1268
+ };
1269
+ var deleteExportInput = {
1270
+ id: z15.string().uuid().describe("The UUID of the export record to delete")
1271
+ };
1272
+ var getPresentationInput = {
1273
+ id: idField("presentation")
1274
+ };
1275
+ var createPresentationInput = {
1276
+ title: z15.string().describe("Title of the presentation"),
1277
+ description: z15.string().nullable().optional().describe("Description of the presentation")
1278
+ };
1279
+ var updatePresentationInput = {
1280
+ id: idField("presentation to update"),
1281
+ title: z15.string().optional().describe("New title"),
1282
+ description: z15.string().nullable().optional().describe("New description")
1283
+ };
1284
+ var deletePresentationInput = {
1285
+ id: idField("presentation to delete")
1286
+ };
1287
+ var reorderPresentationsInput = {
1288
+ items: orderItemsField("presentation")
1289
+ };
1290
+ var listVariantsInput = {
1291
+ presentationId: idField("presentation")
1292
+ };
1293
+ var getVariantInput = {
1294
+ presentationId: idField("presentation"),
1295
+ variantId: idField("variant")
1296
+ };
1297
+ var createVariantInput = {
1298
+ presentationId: idField("presentation"),
1299
+ name: z15.string().describe("Name of the variant"),
1300
+ audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
1301
+ };
1302
+ var updateVariantInput = {
1303
+ presentationId: idField("presentation"),
1304
+ variantId: idField("variant to update"),
1305
+ name: z15.string().optional().describe("New name"),
1306
+ audienceId: z15.string().nullable().optional().describe("New target audience UUID")
1307
+ };
1308
+ var deleteVariantInput = {
1309
+ presentationId: idField("presentation"),
1310
+ variantId: idField("variant to delete")
1311
+ };
1312
+ var reorderVariantsInput = {
1313
+ presentationId: idField("presentation"),
1314
+ items: orderItemsField("variant")
1315
+ };
1316
+ var cloneVariantInput = {
1317
+ presentationId: idField("presentation"),
1318
+ variantId: idField("variant to clone")
1319
+ };
1320
+ var setDefaultVariantInput = {
1321
+ presentationId: idField("presentation"),
1322
+ variantId: idField("variant to set as default")
1323
+ };
1324
+ var listSlidesInput = {
1325
+ variantId: idField("variant")
1326
+ };
1327
+ var getSlideInput = {
1328
+ variantId: idField("variant"),
1329
+ slideId: idField("slide")
1330
+ };
1331
+ var createSlideInput = {
1332
+ variantId: idField("variant"),
1333
+ slideType: slideTypeSchema.default("bullets").describe("The type of slide to create"),
1334
+ 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.'),
1335
+ speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
1336
+ };
1337
+ var updateSlideInput = {
1338
+ variantId: idField("variant"),
1339
+ slideId: idField("slide to update"),
1340
+ title: z15.string().optional().describe("New title"),
1341
+ content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
1342
+ speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
1343
+ };
1344
+ var deleteSlideInput = {
1345
+ variantId: idField("variant"),
1346
+ slideId: idField("slide to delete")
1347
+ };
1348
+ var reorderSlidesInput = {
1349
+ variantId: idField("variant"),
1350
+ items: orderItemsField("slide")
1351
+ };
1352
+ var uploadSlideImageInput = {
1353
+ variantId: idField("variant"),
1354
+ slideId: idField("slide to add the image to"),
1355
+ filePath: z15.string().describe("Absolute path to the image file on disk")
1356
+ };
1357
+ // ../../packages/shared/src/schemas/variant.ts
1358
+ import { z as z16 } from "zod";
1359
+ var variantSchema = z16.object({
1360
+ id: z16.string().uuid(),
1361
+ presentationId: z16.string().uuid(),
1362
+ name: z16.string(),
1363
+ audienceId: z16.string().uuid().nullable(),
1364
+ isDefault: z16.boolean(),
1365
+ order: z16.number().int(),
1366
+ createdAt: z16.string(),
1367
+ createdBy: z16.string(),
1368
+ updatedAt: z16.string().nullable()
918
1369
  });
919
- var createVariantSchema = z15.object({
920
- name: z15.string().min(1),
921
- audienceId: z15.string().uuid().nullable().optional()
1370
+ var createVariantSchema = z16.object({
1371
+ name: z16.string().min(1),
1372
+ audienceId: z16.string().uuid().nullable().optional()
922
1373
  });
923
- var updateVariantSchema = z15.object({
924
- name: z15.string().min(1).optional(),
925
- audienceId: z15.string().uuid().nullable().optional()
1374
+ var updateVariantSchema = z16.object({
1375
+ name: z16.string().min(1).optional(),
1376
+ audienceId: z16.string().uuid().nullable().optional()
926
1377
  });
927
- var variantListSchema = z15.array(variantSchema);
928
- // src/tools/index.ts
929
- import { z as z16 } from "zod";
930
-
1378
+ var variantListSchema = z16.array(variantSchema);
931
1379
  // src/auth.ts
932
1380
  function getCredentials() {
933
1381
  const apiKey = process.env.ROADMAPS_API_KEY;
@@ -980,6 +1428,10 @@ class ApiClient {
980
1428
  searchParams.set("horizon", params.horizon);
981
1429
  if (params?.query)
982
1430
  searchParams.set("query", params.query);
1431
+ if (params?.phase)
1432
+ searchParams.set("phase", params.phase);
1433
+ if (params?.phaseStep)
1434
+ searchParams.set("phaseStep", params.phaseStep);
983
1435
  const queryString = searchParams.toString();
984
1436
  const path = queryString ? `/v1/roadmaps?${queryString}` : "/v1/roadmaps";
985
1437
  return await this.request(path);
@@ -1751,15 +2203,7 @@ function registerGetWorkflows(server) {
1751
2203
  function registerSearchRoadmaps(server) {
1752
2204
  server.registerTool("search_roadmaps", {
1753
2205
  description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
1754
- inputSchema: {
1755
- query: z16.string().optional().describe("Search query to match against title or description"),
1756
- status: roadmapStatusSchema.optional().describe("Filter by status"),
1757
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1758
- phase: z16.string().optional().describe("Filter by phase"),
1759
- phaseStep: z16.string().optional().describe("Filter by phase step"),
1760
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1761
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
1762
- }
2206
+ inputSchema: searchRoadmapsInput
1763
2207
  }, async ({
1764
2208
  query,
1765
2209
  status,
@@ -1808,9 +2252,7 @@ function registerSearchRoadmaps(server) {
1808
2252
  function registerGetRoadmap(server) {
1809
2253
  server.registerTool("get_roadmap", {
1810
2254
  description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
1811
- inputSchema: {
1812
- id: z16.string().describe("The UUID of the roadmap item")
1813
- }
2255
+ inputSchema: getRoadmapInput
1814
2256
  }, async ({ id }) => {
1815
2257
  const client2 = getApiClient();
1816
2258
  const roadmap2 = await client2.getRoadmap(id);
@@ -1870,10 +2312,7 @@ function registerGetRoadmap(server) {
1870
2312
  function registerSearchFeatures(server) {
1871
2313
  server.registerTool("search_features", {
1872
2314
  description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
1873
- inputSchema: {
1874
- query: z16.string().optional().describe("Search query to match against name"),
1875
- type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
1876
- }
2315
+ inputSchema: searchFeaturesInput
1877
2316
  }, async ({ query, type }) => {
1878
2317
  const client2 = getApiClient();
1879
2318
  let features = await client2.listFeatures();
@@ -1902,9 +2341,7 @@ function registerSearchFeatures(server) {
1902
2341
  function registerGetFeature(server) {
1903
2342
  server.registerTool("get_feature", {
1904
2343
  description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
1905
- inputSchema: {
1906
- id: z16.string().describe("The UUID of the feature")
1907
- }
2344
+ inputSchema: getFeatureInput
1908
2345
  }, async ({ id }) => {
1909
2346
  const client2 = getApiClient();
1910
2347
  const feature2 = await client2.getFeature(id);
@@ -1941,10 +2378,7 @@ function registerGetFeature(server) {
1941
2378
  function registerSearchIdeas(server) {
1942
2379
  server.registerTool("search_ideas", {
1943
2380
  description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
1944
- inputSchema: {
1945
- query: z16.string().optional().describe("Search query to match against title or description"),
1946
- status: ideaStatusSchema.optional().describe("Filter by status")
1947
- }
2381
+ inputSchema: searchIdeasInput
1948
2382
  }, async ({ query, status }) => {
1949
2383
  const client2 = getApiClient();
1950
2384
  let ideas = await client2.listIdeas();
@@ -2010,11 +2444,9 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
2010
2444
  })),
2011
2445
  audiences: audiences.map((a) => ({
2012
2446
  id: a.id,
2447
+ name: a.name,
2013
2448
  type: a.type,
2014
- role: a.role,
2015
- likes: a.likes,
2016
- dislikes: a.dislikes,
2017
- priorities: a.priorities
2449
+ description: a.description
2018
2450
  })),
2019
2451
  scenarios: scenarios.map((s) => ({
2020
2452
  id: s.id,
@@ -2041,11 +2473,7 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
2041
2473
  function registerCaptureIdea(server) {
2042
2474
  server.registerTool("capture_idea", {
2043
2475
  description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
2044
- inputSchema: {
2045
- title: z16.string().describe("Title of the idea"),
2046
- description: z16.string().optional().describe("Detailed description of the idea"),
2047
- source: z16.string().optional().describe('Source of the idea (defaults to "claude-code")')
2048
- }
2476
+ inputSchema: captureIdeaInput
2049
2477
  }, async ({
2050
2478
  title,
2051
2479
  description,
@@ -2080,18 +2508,7 @@ function registerCaptureIdea(server) {
2080
2508
  function registerCreateRoadmapItem(server) {
2081
2509
  server.registerTool("create_roadmap_item", {
2082
2510
  description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
2083
- inputSchema: {
2084
- title: z16.string().describe("Title of the roadmap item"),
2085
- status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
2086
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
2087
- phase: z16.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
2088
- phaseStep: z16.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
2089
- initiativeId: z16.string().optional().describe("UUID of initiative to link this item to on creation"),
2090
- dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
2091
- dateValue: z16.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2092
- targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
2093
- targetValue: z16.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2094
- }
2511
+ inputSchema: createRoadmapItemInput
2095
2512
  }, async ({
2096
2513
  title,
2097
2514
  status,
@@ -2152,31 +2569,10 @@ function registerCreateRoadmapItem(server) {
2152
2569
  };
2153
2570
  });
2154
2571
  }
2155
- var effortSizeSchema = z16.enum(["xs", "s", "m", "l", "xl"]);
2156
2572
  function registerUpdateRoadmapItem(server) {
2157
2573
  server.registerTool("update_roadmap_item", {
2158
2574
  description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
2159
- inputSchema: {
2160
- id: z16.string().describe("The UUID of the roadmap item to update"),
2161
- title: z16.string().optional().describe("New title"),
2162
- status: roadmapStatusSchema.optional().describe("New status"),
2163
- horizon: horizonSchema.optional().describe("New planning horizon"),
2164
- phase: z16.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
2165
- phaseStep: z16.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
2166
- value: z16.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
2167
- effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
2168
- order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
2169
- initiativeId: z16.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
2170
- designDescription: z16.string().nullable().optional().describe("Description for the Design phase"),
2171
- planDescription: z16.string().nullable().optional().describe("Description for the Planning phase"),
2172
- buildDescription: z16.string().nullable().optional().describe("Description for the Build phase"),
2173
- releaseDescription: z16.string().nullable().optional().describe("Description for the Release phase"),
2174
- prompt: z16.string().nullable().optional().describe("Build prompt for the roadmap item"),
2175
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
2176
- dateValue: z16.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2177
- targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
2178
- targetValue: z16.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2179
- }
2575
+ inputSchema: updateRoadmapItemInput
2180
2576
  }, async ({
2181
2577
  id,
2182
2578
  title,
@@ -2285,14 +2681,7 @@ function registerUpdateRoadmapItem(server) {
2285
2681
  function registerAddFeature(server) {
2286
2682
  server.registerTool("add_feature", {
2287
2683
  description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
2288
- inputSchema: {
2289
- name: z16.string().describe("Name of the feature"),
2290
- description: z16.string().optional().describe("Description of the feature"),
2291
- type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
2292
- parentId: z16.string().optional().describe("UUID of parent feature/area to nest under"),
2293
- outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes for this feature"),
2294
- linkToRoadmapId: z16.string().optional().describe("UUID of roadmap item to link this feature to")
2295
- }
2684
+ inputSchema: addFeatureInput
2296
2685
  }, async ({
2297
2686
  name,
2298
2687
  description,
@@ -2337,12 +2726,7 @@ function registerAddFeature(server) {
2337
2726
  function registerSavePrd(server) {
2338
2727
  server.registerTool("save_prd", {
2339
2728
  description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
2340
- inputSchema: {
2341
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
2342
- what: z16.string().nullable().describe("What is being built - the feature description"),
2343
- why: z16.string().nullable().describe("Why this is being built - the business justification"),
2344
- outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes/success criteria")
2345
- }
2729
+ inputSchema: savePrdInput
2346
2730
  }, async ({
2347
2731
  roadmapId,
2348
2732
  what,
@@ -2378,10 +2762,7 @@ function registerSavePrd(server) {
2378
2762
  function registerUpdateBrainstormNotes(server) {
2379
2763
  server.registerTool("update_brainstorm_notes", {
2380
2764
  description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
2381
- inputSchema: {
2382
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
2383
- notes: z16.string().describe("The brainstorm notes content")
2384
- }
2765
+ inputSchema: updateBrainstormNotesInput
2385
2766
  }, async ({ roadmapId, notes }) => {
2386
2767
  const client2 = getApiClient();
2387
2768
  const roadmap2 = await client2.updateRoadmap(roadmapId, {
@@ -2408,9 +2789,7 @@ function registerUpdateBrainstormNotes(server) {
2408
2789
  function registerDeleteRoadmapItem(server) {
2409
2790
  server.registerTool("delete_roadmap_item", {
2410
2791
  description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
2411
- inputSchema: {
2412
- id: z16.string().describe("The UUID of the roadmap item to delete")
2413
- }
2792
+ inputSchema: deleteRoadmapItemInput
2414
2793
  }, async ({ id }) => {
2415
2794
  const client2 = getApiClient();
2416
2795
  await client2.deleteRoadmap(id);
@@ -2430,12 +2809,7 @@ function registerDeleteRoadmapItem(server) {
2430
2809
  function registerReorderRoadmaps(server) {
2431
2810
  server.registerTool("reorder_roadmaps", {
2432
2811
  description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
2433
- inputSchema: {
2434
- items: z16.array(z16.object({
2435
- id: z16.string().describe("The UUID of the roadmap item"),
2436
- order: z16.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
2437
- })).describe("Array of roadmap items with their new order values")
2438
- }
2812
+ inputSchema: reorderRoadmapsInput
2439
2813
  }, async ({ items }) => {
2440
2814
  const client2 = getApiClient();
2441
2815
  const result = await client2.reorderRoadmaps(items);
@@ -2456,12 +2830,7 @@ function registerReorderRoadmaps(server) {
2456
2830
  function registerUpdateFeature(server) {
2457
2831
  server.registerTool("update_feature", {
2458
2832
  description: "Update an existing feature. Can update name, type, or parent.",
2459
- inputSchema: {
2460
- id: z16.string().describe("The UUID of the feature to update"),
2461
- name: z16.string().optional().describe("New name for the feature"),
2462
- type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
2463
- parentId: z16.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2464
- }
2833
+ inputSchema: updateFeatureInput
2465
2834
  }, async ({
2466
2835
  id,
2467
2836
  name,
@@ -2498,9 +2867,7 @@ function registerUpdateFeature(server) {
2498
2867
  function registerDeleteFeature(server) {
2499
2868
  server.registerTool("delete_feature", {
2500
2869
  description: "Delete a feature. This is a soft delete that also deletes all child features.",
2501
- inputSchema: {
2502
- id: z16.string().describe("The UUID of the feature to delete")
2503
- }
2870
+ inputSchema: deleteFeatureInput
2504
2871
  }, async ({ id }) => {
2505
2872
  const client2 = getApiClient();
2506
2873
  await client2.deleteFeature(id);
@@ -2520,9 +2887,7 @@ function registerDeleteFeature(server) {
2520
2887
  function registerGetIdea(server) {
2521
2888
  server.registerTool("get_idea", {
2522
2889
  description: "Get full details of a single idea by ID.",
2523
- inputSchema: {
2524
- id: z16.string().describe("The UUID of the idea")
2525
- }
2890
+ inputSchema: getIdeaInput
2526
2891
  }, async ({ id }) => {
2527
2892
  const client2 = getApiClient();
2528
2893
  const idea2 = await client2.getIdea(id);
@@ -2549,14 +2914,7 @@ function registerGetIdea(server) {
2549
2914
  function registerUpdateIdea(server) {
2550
2915
  server.registerTool("update_idea", {
2551
2916
  description: "Update an existing idea. Can update title, description, status, value, or effort.",
2552
- inputSchema: {
2553
- id: z16.string().describe("The UUID of the idea to update"),
2554
- title: z16.string().optional().describe("New title"),
2555
- description: z16.string().nullable().optional().describe("New description"),
2556
- status: ideaStatusSchema.optional().describe("New status"),
2557
- value: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
2558
- effort: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
2559
- }
2917
+ inputSchema: updateIdeaInput
2560
2918
  }, async ({
2561
2919
  id,
2562
2920
  title,
@@ -2601,9 +2959,7 @@ function registerUpdateIdea(server) {
2601
2959
  function registerDeleteIdea(server) {
2602
2960
  server.registerTool("delete_idea", {
2603
2961
  description: "Delete an idea. This is a soft delete.",
2604
- inputSchema: {
2605
- id: z16.string().describe("The UUID of the idea to delete")
2606
- }
2962
+ inputSchema: deleteIdeaInput
2607
2963
  }, async ({ id }) => {
2608
2964
  const client2 = getApiClient();
2609
2965
  await client2.deleteIdea(id);
@@ -2643,10 +2999,7 @@ function registerGetStrategy(server) {
2643
2999
  function registerUpdateStrategy(server) {
2644
3000
  server.registerTool("update_strategy", {
2645
3001
  description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
2646
- inputSchema: {
2647
- vision: z16.string().nullable().optional().describe("The vision statement - where the product is headed"),
2648
- mission: z16.string().nullable().optional().describe("The mission statement - why the product exists")
2649
- }
3002
+ inputSchema: updateStrategyInput
2650
3003
  }, async ({ vision, mission }) => {
2651
3004
  const client2 = getApiClient();
2652
3005
  const updates = {};
@@ -2692,10 +3045,7 @@ function registerListScenarios(server) {
2692
3045
  function registerCreateScenario(server) {
2693
3046
  server.registerTool("create_scenario", {
2694
3047
  description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
2695
- inputSchema: {
2696
- title: z16.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
2697
- description: z16.string().nullable().optional().describe("Detailed description of the scenario workflow")
2698
- }
3048
+ inputSchema: createScenarioInput
2699
3049
  }, async ({ title, description }) => {
2700
3050
  const client2 = getApiClient();
2701
3051
  const scenario2 = await client2.createScenario({
@@ -2722,11 +3072,7 @@ function registerCreateScenario(server) {
2722
3072
  function registerUpdateScenario(server) {
2723
3073
  server.registerTool("update_scenario", {
2724
3074
  description: "Update an existing scenario.",
2725
- inputSchema: {
2726
- id: z16.string().describe("The UUID of the scenario to update"),
2727
- title: z16.string().optional().describe("New title"),
2728
- description: z16.string().nullable().optional().describe("New description")
2729
- }
3075
+ inputSchema: updateScenarioInput
2730
3076
  }, async ({
2731
3077
  id,
2732
3078
  title,
@@ -2759,9 +3105,7 @@ function registerUpdateScenario(server) {
2759
3105
  function registerDeleteScenario(server) {
2760
3106
  server.registerTool("delete_scenario", {
2761
3107
  description: "Delete a scenario. This is a soft delete.",
2762
- inputSchema: {
2763
- id: z16.string().describe("The UUID of the scenario to delete")
2764
- }
3108
+ inputSchema: deleteScenarioInput
2765
3109
  }, async ({ id }) => {
2766
3110
  const client2 = getApiClient();
2767
3111
  await client2.deleteScenario(id);
@@ -2775,22 +3119,10 @@ function registerDeleteScenario(server) {
2775
3119
  };
2776
3120
  });
2777
3121
  }
2778
- var productTypeSchema2 = z16.enum([
2779
- "brand",
2780
- "product",
2781
- "app",
2782
- "marketing_site",
2783
- "landing_page",
2784
- "service"
2785
- ]);
2786
3122
  function registerCreateProduct(server) {
2787
3123
  server.registerTool("create_product", {
2788
3124
  description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
2789
- inputSchema: {
2790
- type: productTypeSchema2.describe("Type of product"),
2791
- name: z16.string().describe("Name of the product"),
2792
- parentId: z16.string().nullable().optional().describe("UUID of parent product to nest under")
2793
- }
3125
+ inputSchema: createProductInput
2794
3126
  }, async ({
2795
3127
  type,
2796
3128
  name,
@@ -2823,11 +3155,7 @@ function registerCreateProduct(server) {
2823
3155
  function registerUpdateProduct(server) {
2824
3156
  server.registerTool("update_product", {
2825
3157
  description: "Update an existing product.",
2826
- inputSchema: {
2827
- id: z16.string().describe("The UUID of the product to update"),
2828
- name: z16.string().optional().describe("New name"),
2829
- parentId: z16.string().nullable().optional().describe("New parent product UUID, or null to move to root")
2830
- }
3158
+ inputSchema: updateProductInput
2831
3159
  }, async ({ id, name, parentId }) => {
2832
3160
  const client2 = getApiClient();
2833
3161
  const updates = {};
@@ -2857,9 +3185,7 @@ function registerUpdateProduct(server) {
2857
3185
  function registerDeleteProduct(server) {
2858
3186
  server.registerTool("delete_product", {
2859
3187
  description: "Delete a product. This is a soft delete that also deletes all child products.",
2860
- inputSchema: {
2861
- id: z16.string().describe("The UUID of the product to delete")
2862
- }
3188
+ inputSchema: deleteProductInput
2863
3189
  }, async ({ id }) => {
2864
3190
  const client2 = getApiClient();
2865
3191
  const result = await client2.deleteProduct(id);
@@ -2880,9 +3206,7 @@ function registerDeleteProduct(server) {
2880
3206
  function registerGetProduct(server) {
2881
3207
  server.registerTool("get_product", {
2882
3208
  description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
2883
- inputSchema: {
2884
- id: z16.string().describe("The UUID of the product")
2885
- }
3209
+ inputSchema: getProductInput
2886
3210
  }, async ({ id }) => {
2887
3211
  const client2 = getApiClient();
2888
3212
  const [product2, documentation] = await Promise.all([
@@ -2917,10 +3241,7 @@ function registerGetProduct(server) {
2917
3241
  function registerSearchProducts(server) {
2918
3242
  server.registerTool("search_products", {
2919
3243
  description: "Search for products by name. Returns a list of matching products with basic info.",
2920
- inputSchema: {
2921
- query: z16.string().optional().describe("Search query to match against product name"),
2922
- type: productTypeSchema2.optional().describe("Filter by product type")
2923
- }
3244
+ inputSchema: searchProductsInput
2924
3245
  }, async ({ query, type }) => {
2925
3246
  const client2 = getApiClient();
2926
3247
  let products = await client2.listProducts();
@@ -2952,9 +3273,7 @@ function registerSearchProducts(server) {
2952
3273
  function registerGetProductDocumentation(server) {
2953
3274
  server.registerTool("get_product_documentation", {
2954
3275
  description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
2955
- inputSchema: {
2956
- productId: z16.string().describe("The UUID of the product")
2957
- }
3276
+ inputSchema: getProductDocumentationInput
2958
3277
  }, async ({ productId }) => {
2959
3278
  const client2 = getApiClient();
2960
3279
  const documentation = await client2.getProductDocumentation(productId);
@@ -2980,11 +3299,7 @@ function registerGetProductDocumentation(server) {
2980
3299
  function registerUpdateProductDocumentation(server) {
2981
3300
  server.registerTool("update_product_documentation", {
2982
3301
  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.",
2983
- inputSchema: {
2984
- productId: z16.string().describe("The UUID of the product"),
2985
- designSystem: z16.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2986
- adrs: z16.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
2987
- }
3302
+ inputSchema: updateProductDocumentationInput
2988
3303
  }, async ({
2989
3304
  productId,
2990
3305
  designSystem,
@@ -3019,10 +3334,7 @@ function registerUpdateProductDocumentation(server) {
3019
3334
  function registerCreateAudience(server) {
3020
3335
  server.registerTool("create_audience", {
3021
3336
  description: "Create a new audience member. Audiences represent who the product serves.",
3022
- inputSchema: {
3023
- name: z16.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
3024
- description: z16.string().nullable().optional().describe("Description of the audience")
3025
- }
3337
+ inputSchema: createAudienceInput
3026
3338
  }, async ({ name, description }) => {
3027
3339
  const client2 = getApiClient();
3028
3340
  const audience2 = await client2.createAudience({
@@ -3049,11 +3361,7 @@ function registerCreateAudience(server) {
3049
3361
  function registerUpdateAudience(server) {
3050
3362
  server.registerTool("update_audience", {
3051
3363
  description: "Update an existing audience member.",
3052
- inputSchema: {
3053
- id: z16.string().describe("The UUID of the audience to update"),
3054
- name: z16.string().optional().describe("New name"),
3055
- description: z16.string().nullable().optional().describe("New description")
3056
- }
3364
+ inputSchema: updateAudienceInput
3057
3365
  }, async ({
3058
3366
  id,
3059
3367
  name,
@@ -3086,9 +3394,7 @@ function registerUpdateAudience(server) {
3086
3394
  function registerDeleteAudience(server) {
3087
3395
  server.registerTool("delete_audience", {
3088
3396
  description: "Delete an audience member. This is a soft delete.",
3089
- inputSchema: {
3090
- id: z16.string().describe("The UUID of the audience to delete")
3091
- }
3397
+ inputSchema: deleteAudienceInput
3092
3398
  }, async ({ id }) => {
3093
3399
  const client2 = getApiClient();
3094
3400
  await client2.deleteAudience(id);
@@ -3128,20 +3434,7 @@ function registerListStatusUpdates(server) {
3128
3434
  function registerGetHistory(server) {
3129
3435
  server.registerTool("get_history", {
3130
3436
  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.",
3131
- inputSchema: {
3132
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3133
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
3134
- entityType: z16.enum([
3135
- "roadmap",
3136
- "feature",
3137
- "idea",
3138
- "prd",
3139
- "wireframe",
3140
- "product",
3141
- "audience",
3142
- "scenario"
3143
- ]).optional().describe("Filter to specific entity type")
3144
- }
3437
+ inputSchema: getHistoryInput
3145
3438
  }, async ({
3146
3439
  startDate,
3147
3440
  endDate,
@@ -3162,10 +3455,7 @@ function registerGetHistory(server) {
3162
3455
  function registerGetHistorySummary(server) {
3163
3456
  server.registerTool("get_history_summary", {
3164
3457
  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.",
3165
- inputSchema: {
3166
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3167
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
3168
- }
3458
+ inputSchema: getHistorySummaryInput
3169
3459
  }, async ({ startDate, endDate }) => {
3170
3460
  const client2 = getApiClient();
3171
3461
  const summary = await client2.getHistorySummary({ startDate, endDate });
@@ -3182,16 +3472,7 @@ function registerGetHistorySummary(server) {
3182
3472
  function registerCreateStatusUpdate(server) {
3183
3473
  server.registerTool("create_status_update", {
3184
3474
  description: "Create a new status report. Use this after generating the report content from history events.",
3185
- inputSchema: {
3186
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
3187
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
3188
- content: z16.string().describe("The markdown content of the status report"),
3189
- title: z16.string().optional().describe("Optional title for the report"),
3190
- items: z16.array(z16.object({
3191
- roadmapItemId: z16.string().describe("UUID of the roadmap item"),
3192
- status: z16.string().describe("Status of the item at report creation time")
3193
- })).optional().describe("Roadmap items to include in the report snapshot")
3194
- }
3475
+ inputSchema: createStatusUpdateInput
3195
3476
  }, async ({
3196
3477
  startDate,
3197
3478
  endDate,
@@ -3229,21 +3510,7 @@ function registerCreateStatusUpdate(server) {
3229
3510
  function registerSaveStories(server) {
3230
3511
  server.registerTool("save_stories", {
3231
3512
  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.",
3232
- inputSchema: {
3233
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
3234
- epics: z16.array(z16.object({
3235
- title: z16.string().min(1).describe("Title of the epic"),
3236
- description: z16.string().nullable().optional().describe("Description of the epic"),
3237
- stories: z16.array(z16.object({
3238
- title: z16.string().min(1).describe("Title of the story"),
3239
- description: z16.string().nullable().optional().describe("Description of the story")
3240
- })).optional().describe("Stories within this epic")
3241
- })).optional().describe("List of epics with their nested stories"),
3242
- stories: z16.array(z16.object({
3243
- title: z16.string().min(1).describe("Title of the story"),
3244
- description: z16.string().nullable().optional().describe("Description of the story")
3245
- })).optional().describe("List of standalone stories (not part of any epic)")
3246
- }
3513
+ inputSchema: saveStoriesInput
3247
3514
  }, async ({
3248
3515
  roadmapId,
3249
3516
  epics,
@@ -3272,12 +3539,7 @@ function registerSaveStories(server) {
3272
3539
  function registerUploadWireframe(server) {
3273
3540
  server.registerTool("upload_wireframe", {
3274
3541
  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.",
3275
- inputSchema: {
3276
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3277
- filePath: z16.string().describe("Absolute path to the image file on disk"),
3278
- description: z16.string().optional().describe("Optional description of the wireframe"),
3279
- outcomeIds: z16.array(z16.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
3280
- }
3542
+ inputSchema: uploadWireframeInput
3281
3543
  }, async ({
3282
3544
  roadmapId,
3283
3545
  filePath,
@@ -3329,11 +3591,7 @@ function registerUploadWireframe(server) {
3329
3591
  function registerUpdateWireframe(server) {
3330
3592
  server.registerTool("update_wireframe", {
3331
3593
  description: "Update a wireframe's description or outcome tags.",
3332
- inputSchema: {
3333
- id: z16.string().describe("The UUID of the wireframe"),
3334
- description: z16.string().nullable().optional().describe("New description for the wireframe"),
3335
- outcomeIds: z16.array(z16.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
3336
- }
3594
+ inputSchema: updateWireframeInput
3337
3595
  }, async ({
3338
3596
  id,
3339
3597
  description,
@@ -3367,9 +3625,7 @@ function registerUpdateWireframe(server) {
3367
3625
  function registerDeleteWireframe(server) {
3368
3626
  server.registerTool("delete_wireframe", {
3369
3627
  description: "Delete a wireframe (soft delete).",
3370
- inputSchema: {
3371
- id: z16.string().describe("The UUID of the wireframe to delete")
3372
- }
3628
+ inputSchema: deleteWireframeInput
3373
3629
  }, async ({ id }) => {
3374
3630
  const client2 = getApiClient();
3375
3631
  await client2.deleteWireframe(id);
@@ -3386,11 +3642,7 @@ function registerDeleteWireframe(server) {
3386
3642
  function registerUploadBrainstormMedia(server) {
3387
3643
  server.registerTool("upload_brainstorm_media", {
3388
3644
  description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
3389
- inputSchema: {
3390
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3391
- filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3392
- description: z16.string().optional().describe("Optional description of the media")
3393
- }
3645
+ inputSchema: uploadBrainstormMediaInput
3394
3646
  }, async ({
3395
3647
  roadmapId,
3396
3648
  filePath,
@@ -3440,10 +3692,7 @@ function registerUploadBrainstormMedia(server) {
3440
3692
  function registerUpdateBrainstormMedia(server) {
3441
3693
  server.registerTool("update_brainstorm_media", {
3442
3694
  description: "Update a brainstorm media item's description.",
3443
- inputSchema: {
3444
- id: z16.string().describe("The UUID of the brainstorm media"),
3445
- description: z16.string().nullable().describe("New description for the media")
3446
- }
3695
+ inputSchema: updateBrainstormMediaInput
3447
3696
  }, async ({ id, description }) => {
3448
3697
  const client2 = getApiClient();
3449
3698
  const media = await client2.updateBrainstormMedia(id, { description });
@@ -3465,9 +3714,7 @@ function registerUpdateBrainstormMedia(server) {
3465
3714
  function registerDeleteBrainstormMedia(server) {
3466
3715
  server.registerTool("delete_brainstorm_media", {
3467
3716
  description: "Delete a brainstorm media item (soft delete).",
3468
- inputSchema: {
3469
- id: z16.string().describe("The UUID of the brainstorm media to delete")
3470
- }
3717
+ inputSchema: deleteBrainstormMediaInput
3471
3718
  }, async ({ id }) => {
3472
3719
  const client2 = getApiClient();
3473
3720
  await client2.deleteBrainstormMedia(id);
@@ -3484,11 +3731,7 @@ function registerDeleteBrainstormMedia(server) {
3484
3731
  function registerUploadProductDesignMedia(server) {
3485
3732
  server.registerTool("upload_product_design_media", {
3486
3733
  description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
3487
- inputSchema: {
3488
- productId: z16.string().describe("The UUID of the product"),
3489
- filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3490
- description: z16.string().optional().describe("Optional description of the media")
3491
- }
3734
+ inputSchema: uploadProductDesignMediaInput
3492
3735
  }, async ({
3493
3736
  productId,
3494
3737
  filePath,
@@ -3539,11 +3782,7 @@ function registerUploadProductDesignMedia(server) {
3539
3782
  function registerUpdateProductDesignMedia(server) {
3540
3783
  server.registerTool("update_product_design_media", {
3541
3784
  description: "Update a product design media item's description.",
3542
- inputSchema: {
3543
- productId: z16.string().describe("The UUID of the product"),
3544
- mediaId: z16.string().describe("The UUID of the design media"),
3545
- description: z16.string().nullable().describe("New description for the media")
3546
- }
3785
+ inputSchema: updateProductDesignMediaInput
3547
3786
  }, async ({
3548
3787
  productId,
3549
3788
  mediaId,
@@ -3569,10 +3808,7 @@ function registerUpdateProductDesignMedia(server) {
3569
3808
  function registerDeleteProductDesignMedia(server) {
3570
3809
  server.registerTool("delete_product_design_media", {
3571
3810
  description: "Delete a product design media item (soft delete).",
3572
- inputSchema: {
3573
- productId: z16.string().describe("The UUID of the product"),
3574
- mediaId: z16.string().describe("The UUID of the design media to delete")
3575
- }
3811
+ inputSchema: deleteProductDesignMediaInput
3576
3812
  }, async ({ productId, mediaId }) => {
3577
3813
  const client2 = getApiClient();
3578
3814
  await client2.deleteProductDesignMedia(productId, mediaId);
@@ -3592,10 +3828,7 @@ function isVideoContentType(contentType) {
3592
3828
  function registerUploadDesignWalkthrough(server) {
3593
3829
  server.registerTool("upload_design_walkthrough", {
3594
3830
  description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
3595
- inputSchema: {
3596
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3597
- filePath: z16.string().describe("Absolute path to the video file on disk")
3598
- }
3831
+ inputSchema: uploadDesignWalkthroughInput
3599
3832
  }, async ({ roadmapId, filePath }) => {
3600
3833
  const client2 = getApiClient();
3601
3834
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3635,10 +3868,7 @@ function registerUploadDesignWalkthrough(server) {
3635
3868
  function registerUploadReleaseWalkthrough(server) {
3636
3869
  server.registerTool("upload_release_walkthrough", {
3637
3870
  description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
3638
- inputSchema: {
3639
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3640
- filePath: z16.string().describe("Absolute path to the video file on disk")
3641
- }
3871
+ inputSchema: uploadReleaseWalkthroughInput
3642
3872
  }, async ({ roadmapId, filePath }) => {
3643
3873
  const client2 = getApiClient();
3644
3874
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3694,11 +3924,7 @@ function getPrototypeContentType(filename) {
3694
3924
  function registerPublishPrototype(server) {
3695
3925
  server.registerTool("publish_prototype", {
3696
3926
  description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
3697
- inputSchema: {
3698
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
3699
- folderPath: z16.string().describe("Absolute path to the local mockup folder"),
3700
- entryPoint: z16.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
3701
- }
3927
+ inputSchema: publishPrototypeInput
3702
3928
  }, async ({
3703
3929
  roadmapId,
3704
3930
  folderPath,
@@ -3857,9 +4083,7 @@ Expires: ${expiryDate}`
3857
4083
  function registerListPrototypes(server) {
3858
4084
  server.registerTool("list_prototypes", {
3859
4085
  description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
3860
- inputSchema: {
3861
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item")
3862
- }
4086
+ inputSchema: listPrototypesInput
3863
4087
  }, async ({ roadmapId }) => {
3864
4088
  const client2 = getApiClient();
3865
4089
  const prototypes = await client2.listPrototypes(roadmapId);
@@ -3902,16 +4126,10 @@ ${lines.join(`
3902
4126
  };
3903
4127
  });
3904
4128
  }
3905
- var dateGranularitySchema2 = z16.enum(["day", "month", "quarter", "half-year", "year"]);
3906
4129
  function registerSearchInitiatives(server) {
3907
4130
  server.registerTool("search_initiatives", {
3908
4131
  description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
3909
- inputSchema: {
3910
- query: z16.string().optional().describe("Search query to match against title or description"),
3911
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
3912
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3913
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3914
- }
4132
+ inputSchema: searchInitiativesInput
3915
4133
  }, async ({
3916
4134
  query,
3917
4135
  horizon,
@@ -3959,9 +4177,7 @@ function registerSearchInitiatives(server) {
3959
4177
  function registerGetInitiative(server) {
3960
4178
  server.registerTool("get_initiative", {
3961
4179
  description: "Get full details of an initiative including all linked roadmap items.",
3962
- inputSchema: {
3963
- id: z16.string().describe("The UUID of the initiative")
3964
- }
4180
+ inputSchema: getInitiativeInput
3965
4181
  }, async ({ id }) => {
3966
4182
  const client2 = getApiClient();
3967
4183
  const result = await client2.getInitiative(id);
@@ -3984,14 +4200,7 @@ function registerGetInitiative(server) {
3984
4200
  function registerCreateInitiative(server) {
3985
4201
  server.registerTool("create_initiative", {
3986
4202
  description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
3987
- inputSchema: {
3988
- title: z16.string().describe("Title of the initiative"),
3989
- description: z16.string().optional().describe("Description of the initiative (markdown)"),
3990
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
3991
- dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
3992
- dateValue: z16.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3993
- targetDate: z16.string().optional().describe("Target date in YYYY-MM-DD format")
3994
- }
4203
+ inputSchema: createInitiativeInput
3995
4204
  }, async ({
3996
4205
  title,
3997
4206
  description,
@@ -4033,16 +4242,7 @@ function registerCreateInitiative(server) {
4033
4242
  function registerUpdateInitiative(server) {
4034
4243
  server.registerTool("update_initiative", {
4035
4244
  description: "Update an existing initiative.",
4036
- inputSchema: {
4037
- id: z16.string().describe("The UUID of the initiative to update"),
4038
- title: z16.string().optional().describe("New title"),
4039
- description: z16.string().nullable().optional().describe("New description (null to clear)"),
4040
- horizon: horizonSchema.optional().describe("New planning horizon"),
4041
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
4042
- dateValue: z16.string().nullable().optional().describe("New target date value (null to clear)"),
4043
- targetDate: z16.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
4044
- order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
4045
- }
4245
+ inputSchema: updateInitiativeInput
4046
4246
  }, async ({
4047
4247
  id,
4048
4248
  title,
@@ -4095,9 +4295,7 @@ function registerUpdateInitiative(server) {
4095
4295
  function registerDeleteInitiative(server) {
4096
4296
  server.registerTool("delete_initiative", {
4097
4297
  description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
4098
- inputSchema: {
4099
- id: z16.string().describe("The UUID of the initiative to delete")
4100
- }
4298
+ inputSchema: deleteInitiativeInput
4101
4299
  }, async ({ id }) => {
4102
4300
  const client2 = getApiClient();
4103
4301
  await client2.deleteInitiative(id);
@@ -4114,12 +4312,7 @@ function registerDeleteInitiative(server) {
4114
4312
  function registerReorderInitiatives(server) {
4115
4313
  server.registerTool("reorder_initiatives", {
4116
4314
  description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
4117
- inputSchema: {
4118
- items: z16.array(z16.object({
4119
- id: z16.string().describe("The UUID of the initiative"),
4120
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4121
- })).describe("Array of initiatives with their new order values")
4122
- }
4315
+ inputSchema: reorderInitiativesInput
4123
4316
  }, async ({ items }) => {
4124
4317
  const client2 = getApiClient();
4125
4318
  await client2.reorderInitiatives(items);
@@ -4136,14 +4329,7 @@ function registerReorderInitiatives(server) {
4136
4329
  function registerSearchExports(server) {
4137
4330
  server.registerTool("search_exports", {
4138
4331
  description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
4139
- inputSchema: {
4140
- roadmapId: z16.string().uuid().optional().describe("Filter by roadmap item ID"),
4141
- externalSystem: z16.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
4142
- localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
4143
- localEntityId: z16.string().uuid().optional().describe("Filter by local entity ID"),
4144
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
4145
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
4146
- }
4332
+ inputSchema: searchExportsInput
4147
4333
  }, async ({
4148
4334
  roadmapId,
4149
4335
  externalSystem,
@@ -4178,9 +4364,7 @@ function registerSearchExports(server) {
4178
4364
  function registerGetExport(server) {
4179
4365
  server.registerTool("get_export", {
4180
4366
  description: "Get full details of a single export record by ID.",
4181
- inputSchema: {
4182
- id: z16.string().uuid().describe("The UUID of the export record")
4183
- }
4367
+ inputSchema: getExportInput
4184
4368
  }, async ({ id }) => {
4185
4369
  const client2 = getApiClient();
4186
4370
  const exportRecord = await client2.getExport(id);
@@ -4197,16 +4381,7 @@ function registerGetExport(server) {
4197
4381
  function registerCreateExport(server) {
4198
4382
  server.registerTool("create_export", {
4199
4383
  description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
4200
- inputSchema: {
4201
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
4202
- localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
4203
- localEntityId: z16.string().uuid().describe("The UUID of the local entity"),
4204
- externalSystem: z16.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
4205
- externalObjectType: z16.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
4206
- externalId: z16.string().min(1).describe("ID of the object in the external system"),
4207
- externalUrl: z16.string().url().optional().describe("URL to the object in the external system"),
4208
- metadata: z16.record(z16.unknown()).optional().describe("Additional metadata about the export")
4209
- }
4384
+ inputSchema: createExportInput
4210
4385
  }, async ({
4211
4386
  roadmapId,
4212
4387
  localEntityType,
@@ -4241,11 +4416,7 @@ function registerCreateExport(server) {
4241
4416
  function registerUpdateExport(server) {
4242
4417
  server.registerTool("update_export", {
4243
4418
  description: "Update an export record. Can update the external URL or metadata.",
4244
- inputSchema: {
4245
- id: z16.string().uuid().describe("The UUID of the export record to update"),
4246
- externalUrl: z16.string().url().nullable().optional().describe("New URL to the object in the external system"),
4247
- metadata: z16.record(z16.unknown()).optional().describe("New metadata to replace existing metadata")
4248
- }
4419
+ inputSchema: updateExportInput
4249
4420
  }, async ({
4250
4421
  id,
4251
4422
  externalUrl,
@@ -4266,9 +4437,7 @@ function registerUpdateExport(server) {
4266
4437
  function registerDeleteExport(server) {
4267
4438
  server.registerTool("delete_export", {
4268
4439
  description: "Delete an export record. This is a soft delete.",
4269
- inputSchema: {
4270
- id: z16.string().uuid().describe("The UUID of the export record to delete")
4271
- }
4440
+ inputSchema: deleteExportInput
4272
4441
  }, async ({ id }) => {
4273
4442
  const client2 = getApiClient();
4274
4443
  await client2.deleteExport(id);
@@ -4302,9 +4471,7 @@ function registerListPresentations(server) {
4302
4471
  function registerGetPresentation(server) {
4303
4472
  server.registerTool("get_presentation", {
4304
4473
  description: "Get presentation with variants and slides.",
4305
- inputSchema: {
4306
- id: z16.string().describe("The UUID of the presentation")
4307
- }
4474
+ inputSchema: getPresentationInput
4308
4475
  }, async ({ id }) => {
4309
4476
  const client2 = getApiClient();
4310
4477
  const presentation2 = await client2.getPresentation(id);
@@ -4332,10 +4499,7 @@ function registerGetPresentation(server) {
4332
4499
  function registerCreatePresentation(server) {
4333
4500
  server.registerTool("create_presentation", {
4334
4501
  description: "Create a new presentation.",
4335
- inputSchema: {
4336
- title: z16.string().describe("Title of the presentation"),
4337
- description: z16.string().nullable().optional().describe("Description of the presentation")
4338
- }
4502
+ inputSchema: createPresentationInput
4339
4503
  }, async ({ title, description }) => {
4340
4504
  const client2 = getApiClient();
4341
4505
  const presentation2 = await client2.createPresentation({
@@ -4355,11 +4519,7 @@ function registerCreatePresentation(server) {
4355
4519
  function registerUpdatePresentation(server) {
4356
4520
  server.registerTool("update_presentation", {
4357
4521
  description: "Update an existing presentation.",
4358
- inputSchema: {
4359
- id: z16.string().describe("The UUID of the presentation to update"),
4360
- title: z16.string().optional().describe("New title"),
4361
- description: z16.string().nullable().optional().describe("New description")
4362
- }
4522
+ inputSchema: updatePresentationInput
4363
4523
  }, async ({
4364
4524
  id,
4365
4525
  title,
@@ -4385,9 +4545,7 @@ function registerUpdatePresentation(server) {
4385
4545
  function registerDeletePresentation(server) {
4386
4546
  server.registerTool("delete_presentation", {
4387
4547
  description: "Delete a presentation.",
4388
- inputSchema: {
4389
- id: z16.string().describe("The UUID of the presentation to delete")
4390
- }
4548
+ inputSchema: deletePresentationInput
4391
4549
  }, async ({ id }) => {
4392
4550
  const client2 = getApiClient();
4393
4551
  await client2.deletePresentation(id);
@@ -4404,12 +4562,7 @@ function registerDeletePresentation(server) {
4404
4562
  function registerReorderPresentations(server) {
4405
4563
  server.registerTool("reorder_presentations", {
4406
4564
  description: "Reorder presentations by setting their order values. Lower order values appear first.",
4407
- inputSchema: {
4408
- items: z16.array(z16.object({
4409
- id: z16.string().describe("The UUID of the presentation"),
4410
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4411
- })).describe("Array of presentations with their new order values")
4412
- }
4565
+ inputSchema: reorderPresentationsInput
4413
4566
  }, async ({ items }) => {
4414
4567
  const client2 = getApiClient();
4415
4568
  await client2.reorderPresentations(items);
@@ -4426,9 +4579,7 @@ function registerReorderPresentations(server) {
4426
4579
  function registerListVariants(server) {
4427
4580
  server.registerTool("list_variants", {
4428
4581
  description: "List all variants for a presentation.",
4429
- inputSchema: {
4430
- presentationId: z16.string().describe("The UUID of the presentation")
4431
- }
4582
+ inputSchema: listVariantsInput
4432
4583
  }, async ({ presentationId }) => {
4433
4584
  const client2 = getApiClient();
4434
4585
  const result = await client2.listVariants(presentationId);
@@ -4445,10 +4596,7 @@ function registerListVariants(server) {
4445
4596
  function registerGetVariant(server) {
4446
4597
  server.registerTool("get_variant", {
4447
4598
  description: "Get variant with its slides.",
4448
- inputSchema: {
4449
- presentationId: z16.string().describe("The UUID of the presentation"),
4450
- variantId: z16.string().describe("The UUID of the variant")
4451
- }
4599
+ inputSchema: getVariantInput
4452
4600
  }, async ({ presentationId, variantId }) => {
4453
4601
  const client2 = getApiClient();
4454
4602
  const variant2 = await client2.getVariant(presentationId, variantId);
@@ -4469,11 +4617,7 @@ function registerGetVariant(server) {
4469
4617
  function registerCreateVariant(server) {
4470
4618
  server.registerTool("create_variant", {
4471
4619
  description: "Create a new variant for a presentation.",
4472
- inputSchema: {
4473
- presentationId: z16.string().describe("The UUID of the presentation"),
4474
- name: z16.string().describe("Name of the variant"),
4475
- audienceId: z16.string().nullable().optional().describe("The UUID of the target audience")
4476
- }
4620
+ inputSchema: createVariantInput
4477
4621
  }, async ({
4478
4622
  presentationId,
4479
4623
  name,
@@ -4497,12 +4641,7 @@ function registerCreateVariant(server) {
4497
4641
  function registerUpdateVariant(server) {
4498
4642
  server.registerTool("update_variant", {
4499
4643
  description: "Update an existing variant.",
4500
- inputSchema: {
4501
- presentationId: z16.string().describe("The UUID of the presentation"),
4502
- variantId: z16.string().describe("The UUID of the variant to update"),
4503
- name: z16.string().optional().describe("New name"),
4504
- audienceId: z16.string().nullable().optional().describe("New target audience UUID")
4505
- }
4644
+ inputSchema: updateVariantInput
4506
4645
  }, async ({
4507
4646
  presentationId,
4508
4647
  variantId,
@@ -4529,10 +4668,7 @@ function registerUpdateVariant(server) {
4529
4668
  function registerDeleteVariant(server) {
4530
4669
  server.registerTool("delete_variant", {
4531
4670
  description: "Delete a variant.",
4532
- inputSchema: {
4533
- presentationId: z16.string().describe("The UUID of the presentation"),
4534
- variantId: z16.string().describe("The UUID of the variant to delete")
4535
- }
4671
+ inputSchema: deleteVariantInput
4536
4672
  }, async ({ presentationId, variantId }) => {
4537
4673
  const client2 = getApiClient();
4538
4674
  await client2.deleteVariant(presentationId, variantId);
@@ -4549,13 +4685,7 @@ function registerDeleteVariant(server) {
4549
4685
  function registerReorderVariants(server) {
4550
4686
  server.registerTool("reorder_variants", {
4551
4687
  description: "Reorder variants by setting their order values. Lower order values appear first.",
4552
- inputSchema: {
4553
- presentationId: z16.string().describe("The UUID of the presentation"),
4554
- items: z16.array(z16.object({
4555
- id: z16.string().describe("The UUID of the variant"),
4556
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4557
- })).describe("Array of variants with their new order values")
4558
- }
4688
+ inputSchema: reorderVariantsInput
4559
4689
  }, async ({
4560
4690
  presentationId,
4561
4691
  items
@@ -4575,10 +4705,7 @@ function registerReorderVariants(server) {
4575
4705
  function registerCloneVariant(server) {
4576
4706
  server.registerTool("clone_variant", {
4577
4707
  description: "Clone a variant with all its slides.",
4578
- inputSchema: {
4579
- presentationId: z16.string().describe("The UUID of the presentation"),
4580
- variantId: z16.string().describe("The UUID of the variant to clone")
4581
- }
4708
+ inputSchema: cloneVariantInput
4582
4709
  }, async ({ presentationId, variantId }) => {
4583
4710
  const client2 = getApiClient();
4584
4711
  const clonedVariant = await client2.cloneVariant(presentationId, variantId);
@@ -4595,10 +4722,7 @@ function registerCloneVariant(server) {
4595
4722
  function registerSetDefaultVariant(server) {
4596
4723
  server.registerTool("set_default_variant", {
4597
4724
  description: "Set a variant as the default for the presentation.",
4598
- inputSchema: {
4599
- presentationId: z16.string().describe("The UUID of the presentation"),
4600
- variantId: z16.string().describe("The UUID of the variant to set as default")
4601
- }
4725
+ inputSchema: setDefaultVariantInput
4602
4726
  }, async ({ presentationId, variantId }) => {
4603
4727
  const client2 = getApiClient();
4604
4728
  await client2.setDefaultVariant(presentationId, variantId);
@@ -4615,9 +4739,7 @@ function registerSetDefaultVariant(server) {
4615
4739
  function registerListSlides(server) {
4616
4740
  server.registerTool("list_slides", {
4617
4741
  description: "List all slides in a variant.",
4618
- inputSchema: {
4619
- variantId: z16.string().describe("The UUID of the variant")
4620
- }
4742
+ inputSchema: listSlidesInput
4621
4743
  }, async ({ variantId }) => {
4622
4744
  const client2 = getApiClient();
4623
4745
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4645,10 +4767,7 @@ function registerListSlides(server) {
4645
4767
  function registerGetSlide(server) {
4646
4768
  server.registerTool("get_slide", {
4647
4769
  description: "Get a slide by ID.",
4648
- inputSchema: {
4649
- variantId: z16.string().describe("The UUID of the variant"),
4650
- slideId: z16.string().describe("The UUID of the slide")
4651
- }
4770
+ inputSchema: getSlideInput
4652
4771
  }, async ({ variantId, slideId }) => {
4653
4772
  const client2 = getApiClient();
4654
4773
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4676,25 +4795,7 @@ function registerGetSlide(server) {
4676
4795
  function registerCreateSlide(server) {
4677
4796
  server.registerTool("create_slide", {
4678
4797
  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).",
4679
- inputSchema: {
4680
- variantId: z16.string().describe("The UUID of the variant"),
4681
- slideType: z16.enum([
4682
- "title",
4683
- "section_header",
4684
- "bullets",
4685
- "two_column",
4686
- "comparison",
4687
- "timeline",
4688
- "image",
4689
- "quote",
4690
- "code",
4691
- "thank_you",
4692
- "mermaid",
4693
- "paragraph"
4694
- ]).default("bullets").describe("The type of slide to create"),
4695
- content: z16.record(z16.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
4696
- speakerNotes: z16.string().nullable().optional().describe("Speaker notes for the slide")
4697
- }
4798
+ inputSchema: createSlideInput
4698
4799
  }, async ({
4699
4800
  variantId,
4700
4801
  slideType,
@@ -4731,13 +4832,7 @@ function registerCreateSlide(server) {
4731
4832
  function registerUpdateSlide(server) {
4732
4833
  server.registerTool("update_slide", {
4733
4834
  description: "Update an existing slide.",
4734
- inputSchema: {
4735
- variantId: z16.string().describe("The UUID of the variant"),
4736
- slideId: z16.string().describe("The UUID of the slide to update"),
4737
- title: z16.string().optional().describe("New title"),
4738
- content: z16.object({ body: z16.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
4739
- speakerNotes: z16.string().nullable().optional().describe("New speaker notes")
4740
- }
4835
+ inputSchema: updateSlideInput
4741
4836
  }, async ({
4742
4837
  variantId,
4743
4838
  slideId,
@@ -4778,10 +4873,7 @@ function registerUpdateSlide(server) {
4778
4873
  function registerDeleteSlide(server) {
4779
4874
  server.registerTool("delete_slide", {
4780
4875
  description: "Delete a slide (soft delete).",
4781
- inputSchema: {
4782
- variantId: z16.string().describe("The UUID of the variant"),
4783
- slideId: z16.string().describe("The UUID of the slide to delete")
4784
- }
4876
+ inputSchema: deleteSlideInput
4785
4877
  }, async ({ variantId, slideId }) => {
4786
4878
  const client2 = getApiClient();
4787
4879
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4809,13 +4901,7 @@ function registerDeleteSlide(server) {
4809
4901
  function registerReorderSlides(server) {
4810
4902
  server.registerTool("reorder_slides", {
4811
4903
  description: "Reorder slides by setting their order values. Lower order values appear first.",
4812
- inputSchema: {
4813
- variantId: z16.string().describe("The UUID of the variant"),
4814
- items: z16.array(z16.object({
4815
- id: z16.string().describe("The UUID of the slide"),
4816
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4817
- })).describe("Array of slides with their new order values")
4818
- }
4904
+ inputSchema: reorderSlidesInput
4819
4905
  }, async ({
4820
4906
  variantId,
4821
4907
  items
@@ -4846,11 +4932,7 @@ function registerReorderSlides(server) {
4846
4932
  function registerUploadSlideImage(server) {
4847
4933
  server.registerTool("upload_slide_image", {
4848
4934
  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".',
4849
- inputSchema: {
4850
- variantId: z16.string().describe("The UUID of the variant"),
4851
- slideId: z16.string().describe("The UUID of the slide to add the image to"),
4852
- filePath: z16.string().describe("Absolute path to the image file on disk")
4853
- }
4935
+ inputSchema: uploadSlideImageInput
4854
4936
  }, async ({
4855
4937
  variantId,
4856
4938
  slideId,
@@ -4922,11 +5004,7 @@ function registerUploadSlideImage(server) {
4922
5004
  function registerCreateFeedbackSession(server) {
4923
5005
  server.registerTool("create_feedback_session", {
4924
5006
  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.",
4925
- inputSchema: {
4926
- prototypeId: z16.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
4927
- name: z16.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
4928
- expiresInDays: z16.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
4929
- }
5007
+ inputSchema: createFeedbackSessionInput
4930
5008
  }, async ({
4931
5009
  prototypeId,
4932
5010
  name,
@@ -4973,9 +5051,7 @@ function registerCreateFeedbackSession(server) {
4973
5051
  function registerListFeedbackSessions(server) {
4974
5052
  server.registerTool("list_feedback_sessions", {
4975
5053
  description: "List all feedback sessions for a prototype with comment counts and status.",
4976
- inputSchema: {
4977
- prototypeId: z16.string().uuid().describe("The UUID of the prototype")
4978
- }
5054
+ inputSchema: listFeedbackSessionsInput
4979
5055
  }, async ({ prototypeId }) => {
4980
5056
  const client2 = getApiClient();
4981
5057
  const sessions = await client2.listFeedbackSessions(prototypeId);
@@ -5024,11 +5100,7 @@ function formatCommentLine(c) {
5024
5100
  function registerGetFeedbackSummary(server) {
5025
5101
  server.registerTool("get_feedback_summary", {
5026
5102
  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.",
5027
- inputSchema: {
5028
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5029
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5030
- filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
5031
- }
5103
+ inputSchema: getFeedbackSummaryInput
5032
5104
  }, async ({
5033
5105
  prototypeId,
5034
5106
  sessionId,
@@ -5067,12 +5139,7 @@ function registerGetFeedbackSummary(server) {
5067
5139
  function registerGetFeedbackDetail(server) {
5068
5140
  server.registerTool("get_feedback_detail", {
5069
5141
  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.",
5070
- inputSchema: {
5071
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5072
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5073
- commentId: z16.string().uuid().optional().describe("Optional: get detail for a single comment"),
5074
- filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
5075
- }
5142
+ inputSchema: getFeedbackDetailInput
5076
5143
  }, async ({
5077
5144
  prototypeId,
5078
5145
  sessionId,
@@ -5116,11 +5183,7 @@ function registerGetFeedbackDetail(server) {
5116
5183
  function registerResolveFeedbackComment(server) {
5117
5184
  server.registerTool("resolve_feedback_comment", {
5118
5185
  description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
5119
- inputSchema: {
5120
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5121
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5122
- commentId: z16.string().uuid().describe("The UUID of the comment to resolve/unresolve")
5123
- }
5186
+ inputSchema: resolveFeedbackCommentInput
5124
5187
  }, async ({
5125
5188
  prototypeId,
5126
5189
  sessionId,