@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.
- package/dist/index.js +560 -497
- 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/
|
|
909
|
+
// ../../packages/shared/src/schemas/tool-inputs.ts
|
|
907
910
|
import { z as z15 } from "zod";
|
|
908
|
-
var
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
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 =
|
|
920
|
-
name:
|
|
921
|
-
audienceId:
|
|
1370
|
+
var createVariantSchema = z16.object({
|
|
1371
|
+
name: z16.string().min(1),
|
|
1372
|
+
audienceId: z16.string().uuid().nullable().optional()
|
|
922
1373
|
});
|
|
923
|
-
var updateVariantSchema =
|
|
924
|
-
name:
|
|
925
|
-
audienceId:
|
|
1374
|
+
var updateVariantSchema = z16.object({
|
|
1375
|
+
name: z16.string().min(1).optional(),
|
|
1376
|
+
audienceId: z16.string().uuid().nullable().optional()
|
|
926
1377
|
});
|
|
927
|
-
var variantListSchema =
|
|
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
|
-
|
|
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,
|