@framingui/mcp-server 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/README.md +1027 -0
  2. package/dist/auth/cache.d.ts +28 -0
  3. package/dist/auth/cache.d.ts.map +1 -0
  4. package/dist/auth/cache.js +48 -0
  5. package/dist/auth/cache.js.map +1 -0
  6. package/dist/auth/guard.d.ts +22 -0
  7. package/dist/auth/guard.d.ts.map +1 -0
  8. package/dist/auth/guard.js +37 -0
  9. package/dist/auth/guard.js.map +1 -0
  10. package/dist/auth/state.d.ts +42 -0
  11. package/dist/auth/state.d.ts.map +1 -0
  12. package/dist/auth/state.js +96 -0
  13. package/dist/auth/state.js.map +1 -0
  14. package/dist/auth/theme-access.d.ts +21 -0
  15. package/dist/auth/theme-access.d.ts.map +1 -0
  16. package/dist/auth/theme-access.js +30 -0
  17. package/dist/auth/theme-access.js.map +1 -0
  18. package/dist/auth/verify.d.ts +44 -0
  19. package/dist/auth/verify.d.ts.map +1 -0
  20. package/dist/auth/verify.js +77 -0
  21. package/dist/auth/verify.js.map +1 -0
  22. package/dist/cli/agent-md-templates.d.ts +16 -0
  23. package/dist/cli/agent-md-templates.d.ts.map +1 -0
  24. package/dist/cli/agent-md-templates.js +311 -0
  25. package/dist/cli/agent-md-templates.js.map +1 -0
  26. package/dist/cli/credentials.d.ts +29 -0
  27. package/dist/cli/credentials.d.ts.map +1 -0
  28. package/dist/cli/credentials.js +66 -0
  29. package/dist/cli/credentials.js.map +1 -0
  30. package/dist/cli/guide-template.d.ts +10 -0
  31. package/dist/cli/guide-template.d.ts.map +1 -0
  32. package/dist/cli/guide-template.js +195 -0
  33. package/dist/cli/guide-template.js.map +1 -0
  34. package/dist/cli/index.d.ts +7 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +41 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/init.d.ts +6 -0
  39. package/dist/cli/init.d.ts.map +1 -0
  40. package/dist/cli/init.js +319 -0
  41. package/dist/cli/init.js.map +1 -0
  42. package/dist/cli/login.d.ts +9 -0
  43. package/dist/cli/login.d.ts.map +1 -0
  44. package/dist/cli/login.js +121 -0
  45. package/dist/cli/login.js.map +1 -0
  46. package/dist/cli/logout.d.ts +9 -0
  47. package/dist/cli/logout.d.ts.map +1 -0
  48. package/dist/cli/logout.js +18 -0
  49. package/dist/cli/logout.js.map +1 -0
  50. package/dist/cli/status.d.ts +9 -0
  51. package/dist/cli/status.d.ts.map +1 -0
  52. package/dist/cli/status.js +31 -0
  53. package/dist/cli/status.js.map +1 -0
  54. package/dist/data/component-props.d.ts +30 -0
  55. package/dist/data/component-props.d.ts.map +1 -0
  56. package/dist/data/component-props.js +537 -0
  57. package/dist/data/component-props.js.map +1 -0
  58. package/dist/data/component-registry.d.ts +30 -0
  59. package/dist/data/component-registry.d.ts.map +1 -0
  60. package/dist/data/component-registry.js +320 -0
  61. package/dist/data/component-registry.js.map +1 -0
  62. package/dist/data/examples/screen-examples.d.ts +38 -0
  63. package/dist/data/examples/screen-examples.d.ts.map +1 -0
  64. package/dist/data/examples/screen-examples.js +500 -0
  65. package/dist/data/examples/screen-examples.js.map +1 -0
  66. package/dist/data/hint-generator.d.ts +16 -0
  67. package/dist/data/hint-generator.d.ts.map +1 -0
  68. package/dist/data/hint-generator.js +298 -0
  69. package/dist/data/hint-generator.js.map +1 -0
  70. package/dist/data/recipe-resolver.d.ts +48 -0
  71. package/dist/data/recipe-resolver.d.ts.map +1 -0
  72. package/dist/data/recipe-resolver.js +226 -0
  73. package/dist/data/recipe-resolver.js.map +1 -0
  74. package/dist/data/template-matcher.d.ts +50 -0
  75. package/dist/data/template-matcher.d.ts.map +1 -0
  76. package/dist/data/template-matcher.js +240 -0
  77. package/dist/data/template-matcher.js.map +1 -0
  78. package/dist/generators/core-resolver.d.ts +56 -0
  79. package/dist/generators/core-resolver.d.ts.map +1 -0
  80. package/dist/generators/core-resolver.js +490 -0
  81. package/dist/generators/core-resolver.js.map +1 -0
  82. package/dist/generators/css-generator.d.ts +49 -0
  83. package/dist/generators/css-generator.d.ts.map +1 -0
  84. package/dist/generators/css-generator.js +294 -0
  85. package/dist/generators/css-generator.js.map +1 -0
  86. package/dist/generators/index.d.ts +13 -0
  87. package/dist/generators/index.d.ts.map +1 -0
  88. package/dist/generators/index.js +16 -0
  89. package/dist/generators/index.js.map +1 -0
  90. package/dist/generators/llm-generator.d.ts +96 -0
  91. package/dist/generators/llm-generator.d.ts.map +1 -0
  92. package/dist/generators/llm-generator.js +296 -0
  93. package/dist/generators/llm-generator.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +965 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/prompts/getting-started.d.ts +18 -0
  99. package/dist/prompts/getting-started.d.ts.map +1 -0
  100. package/dist/prompts/getting-started.js +112 -0
  101. package/dist/prompts/getting-started.js.map +1 -0
  102. package/dist/prompts/screen-workflow.d.ts +17 -0
  103. package/dist/prompts/screen-workflow.d.ts.map +1 -0
  104. package/dist/prompts/screen-workflow.js +246 -0
  105. package/dist/prompts/screen-workflow.js.map +1 -0
  106. package/dist/schemas/mcp-schemas.d.ts +4342 -0
  107. package/dist/schemas/mcp-schemas.d.ts.map +1 -0
  108. package/dist/schemas/mcp-schemas.js +989 -0
  109. package/dist/schemas/mcp-schemas.js.map +1 -0
  110. package/dist/storage/blueprint-storage.d.ts +68 -0
  111. package/dist/storage/blueprint-storage.d.ts.map +1 -0
  112. package/dist/storage/blueprint-storage.js +135 -0
  113. package/dist/storage/blueprint-storage.js.map +1 -0
  114. package/dist/storage/timestamp-manager.d.ts +32 -0
  115. package/dist/storage/timestamp-manager.d.ts.map +1 -0
  116. package/dist/storage/timestamp-manager.js +59 -0
  117. package/dist/storage/timestamp-manager.js.map +1 -0
  118. package/dist/tools/export-screen.d.ts +34 -0
  119. package/dist/tools/export-screen.d.ts.map +1 -0
  120. package/dist/tools/export-screen.js +344 -0
  121. package/dist/tools/export-screen.js.map +1 -0
  122. package/dist/tools/generate-blueprint.d.ts +15 -0
  123. package/dist/tools/generate-blueprint.d.ts.map +1 -0
  124. package/dist/tools/generate-blueprint.js +165 -0
  125. package/dist/tools/generate-blueprint.js.map +1 -0
  126. package/dist/tools/generate-screen.d.ts +13 -0
  127. package/dist/tools/generate-screen.d.ts.map +1 -0
  128. package/dist/tools/generate-screen.js +82 -0
  129. package/dist/tools/generate-screen.js.map +1 -0
  130. package/dist/tools/get-screen-generation-context.d.ts +11 -0
  131. package/dist/tools/get-screen-generation-context.d.ts.map +1 -0
  132. package/dist/tools/get-screen-generation-context.js +325 -0
  133. package/dist/tools/get-screen-generation-context.js.map +1 -0
  134. package/dist/tools/list-components.d.ts +15 -0
  135. package/dist/tools/list-components.d.ts.map +1 -0
  136. package/dist/tools/list-components.js +46 -0
  137. package/dist/tools/list-components.js.map +1 -0
  138. package/dist/tools/list-icon-libraries.d.ts +12 -0
  139. package/dist/tools/list-icon-libraries.d.ts.map +1 -0
  140. package/dist/tools/list-icon-libraries.js +48 -0
  141. package/dist/tools/list-icon-libraries.js.map +1 -0
  142. package/dist/tools/list-screen-templates.d.ts +15 -0
  143. package/dist/tools/list-screen-templates.d.ts.map +1 -0
  144. package/dist/tools/list-screen-templates.js +61 -0
  145. package/dist/tools/list-screen-templates.js.map +1 -0
  146. package/dist/tools/list-themes.d.ts +13 -0
  147. package/dist/tools/list-themes.d.ts.map +1 -0
  148. package/dist/tools/list-themes.js +42 -0
  149. package/dist/tools/list-themes.js.map +1 -0
  150. package/dist/tools/list-tokens.d.ts +13 -0
  151. package/dist/tools/list-tokens.d.ts.map +1 -0
  152. package/dist/tools/list-tokens.js +92 -0
  153. package/dist/tools/list-tokens.js.map +1 -0
  154. package/dist/tools/preview-component.d.ts +18 -0
  155. package/dist/tools/preview-component.d.ts.map +1 -0
  156. package/dist/tools/preview-component.js +63 -0
  157. package/dist/tools/preview-component.js.map +1 -0
  158. package/dist/tools/preview-icon-library.d.ts +13 -0
  159. package/dist/tools/preview-icon-library.d.ts.map +1 -0
  160. package/dist/tools/preview-icon-library.js +63 -0
  161. package/dist/tools/preview-icon-library.js.map +1 -0
  162. package/dist/tools/preview-screen-template.d.ts +18 -0
  163. package/dist/tools/preview-screen-template.d.ts.map +1 -0
  164. package/dist/tools/preview-screen-template.js +99 -0
  165. package/dist/tools/preview-screen-template.js.map +1 -0
  166. package/dist/tools/preview-theme.d.ts +15 -0
  167. package/dist/tools/preview-theme.d.ts.map +1 -0
  168. package/dist/tools/preview-theme.js +172 -0
  169. package/dist/tools/preview-theme.js.map +1 -0
  170. package/dist/tools/validate-environment.d.ts +37 -0
  171. package/dist/tools/validate-environment.d.ts.map +1 -0
  172. package/dist/tools/validate-environment.js +153 -0
  173. package/dist/tools/validate-environment.js.map +1 -0
  174. package/dist/tools/validate-screen-definition.d.ts +10 -0
  175. package/dist/tools/validate-screen-definition.d.ts.map +1 -0
  176. package/dist/tools/validate-screen-definition.js +559 -0
  177. package/dist/tools/validate-screen-definition.js.map +1 -0
  178. package/dist/tools/validate-screen.d.ts +13 -0
  179. package/dist/tools/validate-screen.d.ts.map +1 -0
  180. package/dist/tools/validate-screen.js +106 -0
  181. package/dist/tools/validate-screen.js.map +1 -0
  182. package/dist/tools/whoami.d.ts +17 -0
  183. package/dist/tools/whoami.d.ts.map +1 -0
  184. package/dist/tools/whoami.js +65 -0
  185. package/dist/tools/whoami.js.map +1 -0
  186. package/dist/utils/dependency-extractor.d.ts +13 -0
  187. package/dist/utils/dependency-extractor.d.ts.map +1 -0
  188. package/dist/utils/dependency-extractor.js +232 -0
  189. package/dist/utils/dependency-extractor.js.map +1 -0
  190. package/dist/utils/error-handler.d.ts +29 -0
  191. package/dist/utils/error-handler.d.ts.map +1 -0
  192. package/dist/utils/error-handler.js +48 -0
  193. package/dist/utils/error-handler.js.map +1 -0
  194. package/dist/utils/logger.d.ts +8 -0
  195. package/dist/utils/logger.d.ts.map +1 -0
  196. package/dist/utils/logger.js +14 -0
  197. package/dist/utils/logger.js.map +1 -0
  198. package/dist/utils/package-json-reader.d.ts +37 -0
  199. package/dist/utils/package-json-reader.d.ts.map +1 -0
  200. package/dist/utils/package-json-reader.js +108 -0
  201. package/dist/utils/package-json-reader.js.map +1 -0
  202. package/dist/utils/tailwind-config-reader.d.ts +23 -0
  203. package/dist/utils/tailwind-config-reader.d.ts.map +1 -0
  204. package/dist/utils/tailwind-config-reader.js +81 -0
  205. package/dist/utils/tailwind-config-reader.js.map +1 -0
  206. package/package.json +103 -0
@@ -0,0 +1,989 @@
1
+ /**
2
+ * MCP Tool Input/Output Schemas with Zod validation
3
+ * SPEC-MCP-002: U-002 Input Schema Validation
4
+ */
5
+ import { z } from 'zod';
6
+ // ============================================================================
7
+ // Whoami Tool Schemas
8
+ // ============================================================================
9
+ /**
10
+ * Whoami Input Schema
11
+ * 입력 파라미터 없음
12
+ */
13
+ export const WhoamiInputSchema = z.object({});
14
+ /**
15
+ * Whoami Output Schema
16
+ * 유저 tier, 라이선스 정보, MCP 지원 기간 반환
17
+ */
18
+ export const WhoamiOutputSchema = z.object({
19
+ success: z.boolean(),
20
+ plan: z.enum(['free', 'pro', 'enterprise', 'master']).optional(),
21
+ isMaster: z.boolean().optional(),
22
+ licensedThemes: z.array(z.string()).optional(),
23
+ totalThemes: z.number().optional(),
24
+ mcpSupport: z
25
+ .object({
26
+ expiresAt: z.string().nullable(),
27
+ renewable: z.boolean(),
28
+ })
29
+ .optional(),
30
+ error: z.string().optional(),
31
+ });
32
+ // ============================================================================
33
+ // Generate Blueprint Tool Schemas
34
+ // ============================================================================
35
+ /**
36
+ * Layout types from @framingui/core LAYOUTS
37
+ */
38
+ export const LayoutTypeSchema = z.enum([
39
+ 'single-column',
40
+ 'two-column',
41
+ 'sidebar-left',
42
+ 'sidebar-right',
43
+ 'dashboard',
44
+ 'landing',
45
+ ]);
46
+ /**
47
+ * ComponentNode schema - recursive structure from @framingui/core
48
+ */
49
+ const ComponentNodeSchema = z.lazy(() => z.object({
50
+ type: z.string(),
51
+ props: z.record(z.string(), z.unknown()).optional(),
52
+ children: z.array(z.union([ComponentNodeSchema, z.string()])).optional(),
53
+ slot: z.string().optional(),
54
+ }));
55
+ /**
56
+ * Theme ID validation - alphanumeric with hyphens only (security: prevent path traversal)
57
+ * SPEC: UW-002 No Theme ID Injection
58
+ */
59
+ export const ThemeIdSchema = z
60
+ .string()
61
+ .regex(/^[a-z0-9-]+$/, 'Theme ID must contain only lowercase letters, numbers, and hyphens');
62
+ /**
63
+ * Generate Blueprint Input Schema
64
+ * SPEC: E-001 Blueprint Generation Request
65
+ * SPEC-ICON-001: Added iconLibrary parameter
66
+ */
67
+ export const GenerateBlueprintInputSchema = z.object({
68
+ description: z
69
+ .string()
70
+ .min(10, 'Description must be at least 10 characters')
71
+ .max(500, 'Description must not exceed 500 characters'),
72
+ layout: LayoutTypeSchema,
73
+ themeId: ThemeIdSchema,
74
+ iconLibrary: z
75
+ .string()
76
+ .regex(/^[a-z0-9-]+$/, 'Icon library ID must contain only lowercase letters, numbers, and hyphens')
77
+ .optional(),
78
+ componentHints: z.array(z.string()).optional(),
79
+ });
80
+ /**
81
+ * Template Recommendation Schema
82
+ * SPEC-MCP-004 Phase 3: Blueprint Generator Enhancement
83
+ */
84
+ export const TemplateRecommendationSchema = z.object({
85
+ templateId: z.string(),
86
+ templateName: z.string(),
87
+ category: z.string(),
88
+ confidence: z.number(), // 0-100
89
+ matchedKeywords: z.array(z.string()),
90
+ layoutRecommendation: z.object({
91
+ shell: z.string(),
92
+ page: z.string(),
93
+ description: z.string(),
94
+ }),
95
+ });
96
+ /**
97
+ * Generate Blueprint Output Schema (MCP JSON-RPC format - no previewUrl)
98
+ * SPEC-ICON-001: Added iconLibrary field
99
+ * SPEC-MCP-004: Added templateRecommendations field
100
+ */
101
+ export const GenerateBlueprintOutputSchema = z.object({
102
+ success: z.boolean(),
103
+ blueprint: z.optional(z.object({
104
+ id: z.string(),
105
+ name: z.string(),
106
+ themeId: z.string(),
107
+ iconLibrary: z.string(), // SPEC-ICON-001: Icon library used
108
+ layout: LayoutTypeSchema,
109
+ components: z.array(ComponentNodeSchema), // ComponentNode[] from @framingui/core
110
+ timestamp: z.number(),
111
+ })),
112
+ // SPEC-MCP-004 Phase 3: Template recommendations based on description analysis
113
+ templateRecommendations: z.array(TemplateRecommendationSchema).optional(),
114
+ error: z.string().optional(),
115
+ });
116
+ // ============================================================================
117
+ // List Themes Tool Schemas (v2.1)
118
+ // ============================================================================
119
+ /**
120
+ * List Themes Input Schema
121
+ * No input required - lists all available themes
122
+ */
123
+ export const ListThemesInputSchema = z.object({});
124
+ /**
125
+ * Theme metadata schema for v2.1 themes
126
+ */
127
+ export const ThemeMetaSchema = z.object({
128
+ id: z.string(),
129
+ name: z.string(),
130
+ description: z.string().optional(),
131
+ brandTone: z.string(),
132
+ schemaVersion: z.string(),
133
+ });
134
+ /**
135
+ * List Themes Output Schema
136
+ */
137
+ export const ListThemesOutputSchema = z.object({
138
+ success: z.boolean(),
139
+ themes: z.array(ThemeMetaSchema).optional(),
140
+ count: z.number().optional(),
141
+ error: z.string().optional(),
142
+ });
143
+ // ============================================================================
144
+ // Preview Theme Tool Schemas (v2.1 Updated)
145
+ // ============================================================================
146
+ /**
147
+ * Preview Theme Input Schema
148
+ * SPEC: E-002 Theme Preview Request
149
+ */
150
+ export const PreviewThemeInputSchema = z.object({
151
+ themeId: ThemeIdSchema,
152
+ includeCSS: z.boolean().optional().default(false),
153
+ });
154
+ /**
155
+ * Preview Theme Output Schema (v2.1 - includes full theme data)
156
+ */
157
+ export const PreviewThemeOutputSchema = z.object({
158
+ success: z.boolean(),
159
+ theme: z.optional(z.object({
160
+ id: z.string(),
161
+ name: z.string(),
162
+ description: z.string().optional(),
163
+ brandTone: z.string(),
164
+ schemaVersion: z.string(),
165
+ designDNA: z
166
+ .object({
167
+ moodKeywords: z.array(z.string()),
168
+ targetEmotion: z.string(),
169
+ visualAtmosphere: z.string(),
170
+ })
171
+ .optional(),
172
+ tokens: z.object({
173
+ atomic: z.unknown(),
174
+ semantic: z.unknown(),
175
+ component: z.unknown().optional(),
176
+ recipes: z.unknown().optional(),
177
+ }),
178
+ stateLayer: z.unknown().optional(),
179
+ motion: z.unknown().optional(),
180
+ elevation: z.unknown().optional(),
181
+ typography: z.unknown().optional(),
182
+ })),
183
+ css: z.string().optional(),
184
+ error: z.string().optional(),
185
+ });
186
+ // ============================================================================
187
+ // Export Screen Tool Schemas
188
+ // ============================================================================
189
+ /**
190
+ * Export format types
191
+ * SPEC: S-004 Export Format Compatibility
192
+ */
193
+ export const ExportFormatSchema = z.enum(['jsx', 'tsx', 'vue']);
194
+ /**
195
+ * Export Screen Input Schema (MCP JSON-RPC format - accepts blueprint object)
196
+ * SPEC: E-003 Screen Export Request
197
+ */
198
+ export const ExportScreenInputSchema = z.object({
199
+ blueprint: z.unknown(), // Blueprint from @framingui/core (accept any object for flexibility)
200
+ format: ExportFormatSchema,
201
+ });
202
+ /**
203
+ * Export Screen Output Schema (MCP JSON-RPC format - no filePath)
204
+ */
205
+ export const ExportScreenOutputSchema = z.object({
206
+ success: z.boolean(),
207
+ code: z.string().optional(),
208
+ error: z.string().optional(),
209
+ });
210
+ // ============================================================================
211
+ // Hybrid Export Tool Schemas (SPEC-COMPONENT-001-D)
212
+ // ============================================================================
213
+ /**
214
+ * Export component resolution tier
215
+ * - tier1: Copy from @framingui/ui (fast, deterministic)
216
+ * - tier2: Generate with LLM (flexible, customizable)
217
+ * - auto: Automatically choose based on component availability
218
+ */
219
+ export const ExportTierSchema = z.enum(['tier1', 'tier2', 'auto']);
220
+ /**
221
+ * Hybrid Export Input Schema
222
+ * SPEC-COMPONENT-001-D: Hybrid Export System
223
+ */
224
+ export const HybridExportInputSchema = z.object({
225
+ /** Blueprint or component name */
226
+ blueprint: z.unknown().optional(),
227
+ /** Single component name for direct export */
228
+ componentName: z.string().optional(),
229
+ /** Component description (for Tier 2 LLM generation) */
230
+ componentDescription: z.string().optional(),
231
+ /** Output format */
232
+ format: ExportFormatSchema,
233
+ /** Include CSS Variables */
234
+ includeCSS: z.boolean().optional().default(false),
235
+ /** Resolution tier preference */
236
+ tier: ExportTierSchema.optional().default('auto'),
237
+ /** Theme ID for CSS generation */
238
+ themeId: ThemeIdSchema.optional(),
239
+ });
240
+ /**
241
+ * Component resolution result
242
+ */
243
+ export const ComponentResolutionSchema = z.object({
244
+ componentName: z.string(),
245
+ code: z.string(),
246
+ source: z.enum(['tier1-ui', 'tier1-example', 'tier2-llm', 'tier2-mock']),
247
+ });
248
+ /**
249
+ * Hybrid Export Output Schema
250
+ * SPEC-COMPONENT-001-D: Hybrid Export System
251
+ */
252
+ export const HybridExportOutputSchema = z.object({
253
+ success: z.boolean(),
254
+ /** Screen/component code */
255
+ code: z.string().optional(),
256
+ /** CSS Variables (if includeCSS was true) */
257
+ css: z.string().optional(),
258
+ /** Component resolution details */
259
+ components: z.array(ComponentResolutionSchema).optional(),
260
+ /** Tier used for resolution */
261
+ tierUsed: ExportTierSchema.optional(),
262
+ error: z.string().optional(),
263
+ });
264
+ // ============================================================================
265
+ // Common Error Response Schema
266
+ // ============================================================================
267
+ /**
268
+ * Standardized error response format
269
+ * SPEC: U-004 Error Response Consistency
270
+ */
271
+ export const ErrorResponseSchema = z.object({
272
+ success: z.literal(false),
273
+ error: z.string(),
274
+ });
275
+ // ============================================================================
276
+ // Dependencies Schema (used by dependency-extractor)
277
+ // ============================================================================
278
+ /**
279
+ * Dependencies structure for generated code
280
+ * SPEC-MCP-005: Automatic dependency extraction and environment validation
281
+ */
282
+ export const DependenciesSchema = z.object({
283
+ external: z.array(z.string()).describe('External NPM packages required by generated code'),
284
+ internal: z.array(z.string()).describe('Internal @tekton packages'),
285
+ installCommands: z.object({
286
+ npm: z.string(),
287
+ yarn: z.string(),
288
+ pnpm: z.string(),
289
+ bun: z.string(),
290
+ }),
291
+ compatibility: z
292
+ .object({
293
+ react: z.string().optional(),
294
+ node: z.string().optional(),
295
+ })
296
+ .optional(),
297
+ notes: z.array(z.string()).optional(),
298
+ });
299
+ /**
300
+ * Generate Screen Output Schema
301
+ */
302
+ export const GenerateScreenOutputSchema = z.object({
303
+ success: z.boolean(),
304
+ code: z.string().optional(),
305
+ cssVariables: z.string().optional(),
306
+ dependencies: DependenciesSchema.optional(),
307
+ errors: z.array(z.string()).optional(),
308
+ error: z.string().optional(),
309
+ });
310
+ // ============================================================================
311
+ // Validate Screen Tool Schemas (SPEC-LAYOUT-002 Phase 4)
312
+ // ============================================================================
313
+ /**
314
+ * Validate Screen Input Schema
315
+ */
316
+ export const ValidateScreenInputSchema = z.object({
317
+ screenDefinition: z.unknown(), // Accept any object for validation
318
+ strictMode: z.boolean().optional().default(false),
319
+ });
320
+ /**
321
+ * Validation suggestion
322
+ */
323
+ export const ValidationSuggestionSchema = z.object({
324
+ field: z.string(),
325
+ message: z.string(),
326
+ suggestion: z.string().optional(),
327
+ });
328
+ /**
329
+ * Validate Screen Output Schema
330
+ */
331
+ export const ValidateScreenOutputSchema = z.object({
332
+ success: z.boolean(),
333
+ valid: z.boolean().optional(),
334
+ errors: z.array(z.string()).optional(),
335
+ warnings: z.array(z.string()).optional(),
336
+ suggestions: z.array(ValidationSuggestionSchema).optional(),
337
+ error: z.string().optional(),
338
+ });
339
+ // ============================================================================
340
+ // List Tokens Tool Schemas (SPEC-LAYOUT-002 Phase 4)
341
+ // ============================================================================
342
+ /**
343
+ * Token type filter
344
+ */
345
+ export const TokenTypeSchema = z.enum(['shell', 'page', 'section', 'all']);
346
+ /**
347
+ * List Tokens Input Schema
348
+ */
349
+ export const ListTokensInputSchema = z.object({
350
+ tokenType: TokenTypeSchema.optional().default('all'),
351
+ filter: z.string().optional(),
352
+ });
353
+ /**
354
+ * Token metadata
355
+ */
356
+ export const TokenMetadataSchema = z.object({
357
+ id: z.string(),
358
+ name: z.string().optional(),
359
+ description: z.string().optional(),
360
+ platform: z.string().optional(),
361
+ purpose: z.string().optional(),
362
+ type: z.string().optional(),
363
+ });
364
+ /**
365
+ * List Tokens Output Schema
366
+ */
367
+ export const ListTokensOutputSchema = z.object({
368
+ success: z.boolean(),
369
+ shells: z.array(TokenMetadataSchema).optional(),
370
+ pages: z.array(TokenMetadataSchema).optional(),
371
+ sections: z.array(TokenMetadataSchema).optional(),
372
+ metadata: z
373
+ .object({
374
+ total: z.number(),
375
+ filtered: z.number().optional(),
376
+ })
377
+ .optional(),
378
+ error: z.string().optional(),
379
+ });
380
+ // ============================================================================
381
+ // Icon Library Tool Schemas (SPEC-ICON-001)
382
+ // ============================================================================
383
+ /**
384
+ * Icon Library ID validation - alphanumeric with hyphens only
385
+ * SPEC-ICON-001: UW-001 No Icon Library ID Injection
386
+ */
387
+ export const IconLibraryIdSchema = z
388
+ .string()
389
+ .regex(/^[a-z0-9-]+$/, 'Icon library ID must contain only lowercase letters, numbers, and hyphens');
390
+ /**
391
+ * List Icon Libraries Input Schema
392
+ * No input required - lists all available icon libraries
393
+ */
394
+ export const ListIconLibrariesInputSchema = z.object({});
395
+ /**
396
+ * Icon library metadata schema
397
+ */
398
+ export const IconLibraryMetaSchema = z.object({
399
+ id: z.string(),
400
+ name: z.string(),
401
+ description: z.string(),
402
+ version: z.string(),
403
+ license: z.string(),
404
+ totalIcons: z.number(),
405
+ categories: z.array(z.string()),
406
+ });
407
+ /**
408
+ * List Icon Libraries Output Schema
409
+ */
410
+ export const ListIconLibrariesOutputSchema = z.object({
411
+ success: z.boolean(),
412
+ libraries: z.array(IconLibraryMetaSchema).optional(),
413
+ count: z.number().optional(),
414
+ error: z.string().optional(),
415
+ });
416
+ /**
417
+ * Preview Icon Library Input Schema
418
+ */
419
+ export const PreviewIconLibraryInputSchema = z.object({
420
+ libraryId: IconLibraryIdSchema,
421
+ });
422
+ /**
423
+ * Icon size mapping schema
424
+ */
425
+ export const IconSizeMappingSchema = z.object({
426
+ xs: z.number().optional(),
427
+ sm: z.number(),
428
+ md: z.number(),
429
+ lg: z.number(),
430
+ xl: z.number().optional(),
431
+ });
432
+ /**
433
+ * Framework config schema
434
+ */
435
+ export const IconFrameworkConfigSchema = z.object({
436
+ packageName: z.string(),
437
+ importStatement: z.string(),
438
+ componentPattern: z.string(),
439
+ variants: z.record(z.string()).optional(),
440
+ });
441
+ /**
442
+ * Preview Icon Library Output Schema
443
+ */
444
+ export const PreviewIconLibraryOutputSchema = z.object({
445
+ success: z.boolean(),
446
+ library: z.optional(z.object({
447
+ id: z.string(),
448
+ name: z.string(),
449
+ description: z.string(),
450
+ version: z.string(),
451
+ license: z.string(),
452
+ website: z.string(),
453
+ totalIcons: z.number(),
454
+ categories: z.array(z.string()),
455
+ sizeMapping: IconSizeMappingSchema,
456
+ frameworks: z.object({
457
+ react: IconFrameworkConfigSchema,
458
+ vue: IconFrameworkConfigSchema,
459
+ }),
460
+ defaultVariant: z.string().optional(),
461
+ iconSample: z.array(z.string()).optional(),
462
+ })),
463
+ error: z.string().optional(),
464
+ });
465
+ // ============================================================================
466
+ // Component Discovery Tool Schemas (SPEC-MCP-003)
467
+ // ============================================================================
468
+ /**
469
+ * Component category types
470
+ * SPEC-MCP-003: Component tier system
471
+ */
472
+ export const ComponentCategorySchema = z.enum(['core', 'complex', 'advanced']);
473
+ /**
474
+ * List Components Input Schema
475
+ * SPEC-MCP-003: [TAG-MCP003-006]
476
+ */
477
+ export const ListComponentsInputSchema = z.object({
478
+ category: z.enum(['core', 'complex', 'advanced', 'all']).optional().default('all'),
479
+ search: z.string().optional(),
480
+ });
481
+ /**
482
+ * Component metadata schema
483
+ */
484
+ export const ComponentMetaSchema = z.object({
485
+ id: z.string(),
486
+ name: z.string(),
487
+ category: ComponentCategorySchema,
488
+ description: z.string(),
489
+ variantsCount: z.number(),
490
+ hasSubComponents: z.boolean(),
491
+ tier: z.number(),
492
+ });
493
+ /**
494
+ * List Components Output Schema
495
+ */
496
+ export const ListComponentsOutputSchema = z.object({
497
+ success: z.boolean(),
498
+ components: z.array(ComponentMetaSchema).optional(),
499
+ count: z.number().optional(),
500
+ categories: z
501
+ .object({
502
+ core: z.number(),
503
+ complex: z.number(),
504
+ advanced: z.number(),
505
+ })
506
+ .optional(),
507
+ error: z.string().optional(),
508
+ });
509
+ /**
510
+ * Preview Component Input Schema
511
+ * SPEC-MCP-003: [TAG-MCP003-007]
512
+ */
513
+ export const PreviewComponentInputSchema = z.object({
514
+ componentId: z.string().regex(/^[a-z-]+$/, 'Component ID must be lowercase with hyphens'),
515
+ includeExamples: z.boolean().optional(),
516
+ includeDependencies: z.boolean().optional(),
517
+ });
518
+ /**
519
+ * Prop definition schema
520
+ */
521
+ export const PropDefinitionSchema = z.object({
522
+ name: z.string(),
523
+ type: z.string(),
524
+ required: z.boolean(),
525
+ defaultValue: z.string().optional(),
526
+ description: z.string().optional(),
527
+ });
528
+ /**
529
+ * Variant schema
530
+ */
531
+ export const VariantSchema = z.object({
532
+ name: z.string(),
533
+ value: z.string(),
534
+ description: z.string().optional(),
535
+ });
536
+ /**
537
+ * Usage example schema
538
+ */
539
+ export const UsageExampleSchema = z.object({
540
+ title: z.string(),
541
+ code: z.string(),
542
+ description: z.string().optional(),
543
+ });
544
+ /**
545
+ * Preview Component Output Schema
546
+ */
547
+ export const PreviewComponentOutputSchema = z.object({
548
+ success: z.boolean(),
549
+ component: z
550
+ .object({
551
+ id: z.string(),
552
+ name: z.string(),
553
+ category: ComponentCategorySchema,
554
+ description: z.string(),
555
+ tier: z.number(),
556
+ props: z.array(PropDefinitionSchema),
557
+ variants: z.array(VariantSchema).optional(),
558
+ subComponents: z.array(z.string()).optional(),
559
+ importStatement: z.string(),
560
+ dependencies: z
561
+ .object({
562
+ internal: z.array(z.string()),
563
+ external: z.array(z.string()),
564
+ })
565
+ .optional(),
566
+ examples: z.array(UsageExampleSchema).optional(),
567
+ accessibility: z.string().optional(),
568
+ })
569
+ .optional(),
570
+ error: z.string().optional(),
571
+ });
572
+ // ============================================================================
573
+ // Screen Template Discovery Tool Schemas (SPEC-MCP-003)
574
+ // ============================================================================
575
+ /**
576
+ * Template category types
577
+ */
578
+ export const TemplateCategorySchema = z.enum([
579
+ 'auth',
580
+ 'dashboard',
581
+ 'form',
582
+ 'marketing',
583
+ 'feedback',
584
+ ]);
585
+ /**
586
+ * List Screen Templates Input Schema
587
+ * SPEC-MCP-003: [TAG-MCP003-008]
588
+ */
589
+ export const ListScreenTemplatesInputSchema = z.object({
590
+ category: z
591
+ .enum(['auth', 'dashboard', 'form', 'marketing', 'feedback', 'all'])
592
+ .optional()
593
+ .default('all'),
594
+ search: z.string().optional(),
595
+ });
596
+ /**
597
+ * Template layout type schema
598
+ */
599
+ export const TemplateLayoutTypeSchema = z.enum(['centered', 'sidebar', 'full']);
600
+ /**
601
+ * Template metadata schema
602
+ */
603
+ export const TemplateMetaSchema = z.object({
604
+ id: z.string(),
605
+ name: z.string(),
606
+ category: TemplateCategorySchema,
607
+ description: z.string(),
608
+ requiredComponentsCount: z.number(),
609
+ layoutType: TemplateLayoutTypeSchema,
610
+ version: z.string(),
611
+ tags: z.array(z.string()).optional(),
612
+ });
613
+ /**
614
+ * List Screen Templates Output Schema
615
+ */
616
+ export const ListScreenTemplatesOutputSchema = z.object({
617
+ success: z.boolean(),
618
+ templates: z.array(TemplateMetaSchema).optional(),
619
+ count: z.number().optional(),
620
+ categories: z
621
+ .object({
622
+ auth: z.number(),
623
+ dashboard: z.number(),
624
+ form: z.number(),
625
+ marketing: z.number(),
626
+ feedback: z.number(),
627
+ })
628
+ .optional(),
629
+ error: z.string().optional(),
630
+ });
631
+ /**
632
+ * Preview Screen Template Input Schema
633
+ * SPEC-MCP-003: [TAG-MCP003-009]
634
+ */
635
+ export const PreviewScreenTemplateInputSchema = z.object({
636
+ templateId: z.string().regex(/^[a-z]+\.[a-z-]+$/, 'Template ID must be in format category.name'),
637
+ includeLayoutTokens: z.boolean().optional(),
638
+ });
639
+ /**
640
+ * Skeleton schema
641
+ */
642
+ export const SkeletonSchema = z.object({
643
+ shell: z.string(),
644
+ page: z.string(),
645
+ sections: z.array(z.object({
646
+ id: z.string(),
647
+ name: z.string(),
648
+ slot: z.string(),
649
+ required: z.boolean(),
650
+ })),
651
+ });
652
+ /**
653
+ * Customization schema
654
+ */
655
+ export const CustomizationSchema = z.object({
656
+ texts: z.array(z.string()),
657
+ optional: z.array(z.string()),
658
+ slots: z.array(z.string()),
659
+ });
660
+ /**
661
+ * Responsive layout schema
662
+ */
663
+ export const ResponsiveLayoutSchema = z.object({
664
+ mobile: z.object({
665
+ padding: z.string(),
666
+ gap: z.string(),
667
+ columns: z.number(),
668
+ }),
669
+ tablet: z.object({
670
+ padding: z.string(),
671
+ gap: z.string(),
672
+ columns: z.number(),
673
+ }),
674
+ desktop: z.object({
675
+ padding: z.string(),
676
+ gap: z.string(),
677
+ columns: z.number(),
678
+ }),
679
+ });
680
+ /**
681
+ * Preview Screen Template Output Schema
682
+ */
683
+ export const PreviewScreenTemplateOutputSchema = z.object({
684
+ success: z.boolean(),
685
+ template: z
686
+ .object({
687
+ id: z.string(),
688
+ name: z.string(),
689
+ category: TemplateCategorySchema,
690
+ description: z.string(),
691
+ version: z.string(),
692
+ skeleton: SkeletonSchema,
693
+ layout: z.object({
694
+ type: TemplateLayoutTypeSchema,
695
+ responsive: ResponsiveLayoutSchema.optional(),
696
+ }),
697
+ customizable: CustomizationSchema,
698
+ requiredComponents: z.array(z.string()),
699
+ importStatement: z.string(),
700
+ exampleProps: z
701
+ .object({
702
+ texts: z.record(z.string()).optional(),
703
+ options: z.record(z.boolean()).optional(),
704
+ slots: z.array(z.string()).optional(),
705
+ })
706
+ .optional(),
707
+ created: z.string(),
708
+ updated: z.string(),
709
+ tags: z.array(z.string()).optional(),
710
+ })
711
+ .optional(),
712
+ error: z.string().optional(),
713
+ });
714
+ // ============================================================================
715
+ // Get Screen Generation Context Tool Schemas (SPEC-MCP-004 Phase 3.5)
716
+ // ============================================================================
717
+ /**
718
+ * Get Screen Generation Context Input Schema
719
+ * SPEC-MCP-004 Phase 3.5: Provides coding agents with complete context for screen generation
720
+ */
721
+ export const GetScreenGenerationContextInputSchema = z.object({
722
+ description: z
723
+ .string()
724
+ .min(5, 'Description must be at least 5 characters')
725
+ .max(1000, 'Description must not exceed 1000 characters'),
726
+ themeId: ThemeIdSchema.optional(),
727
+ includeExamples: z.boolean().optional().default(true),
728
+ });
729
+ /**
730
+ * Template match result for generation context
731
+ */
732
+ export const ContextTemplateMatchSchema = z.object({
733
+ templateId: z.string(),
734
+ templateName: z.string(),
735
+ category: z.string(),
736
+ confidence: z.number(),
737
+ matchedKeywords: z.array(z.string()),
738
+ skeleton: SkeletonSchema.optional(),
739
+ requiredComponents: z.array(z.string()).optional(),
740
+ });
741
+ /**
742
+ * Component info for generation context
743
+ */
744
+ export const ContextComponentInfoSchema = z.object({
745
+ id: z.string(),
746
+ name: z.string(),
747
+ category: ComponentCategorySchema,
748
+ description: z.string(),
749
+ importStatement: z.string(),
750
+ props: z.array(PropDefinitionSchema),
751
+ variants: z.array(VariantSchema).optional(),
752
+ });
753
+ /**
754
+ * Screen definition schema for validation and examples
755
+ */
756
+ export const ScreenDefinitionSchema = z.object({
757
+ id: z.string().regex(/^[a-z0-9-]+$/, 'Screen ID must be lowercase alphanumeric with hyphens'),
758
+ name: z.string().optional(),
759
+ description: z.string().optional(),
760
+ shell: z
761
+ .string()
762
+ .regex(/^shell\.[a-z]+\.[a-z-]+$/, 'Shell token must be in format shell.platform.name'),
763
+ page: z.string().regex(/^page\.[a-z-]+$/, 'Page token must be in format page.name'),
764
+ themeId: ThemeIdSchema.optional(),
765
+ sections: z.array(z.object({
766
+ id: z.string(),
767
+ pattern: z
768
+ .string()
769
+ .regex(/^section\.[a-z0-9-]+$/, 'Section pattern must be in format section.name'),
770
+ slot: z.string().optional(),
771
+ components: z.array(z.object({
772
+ type: z.string(),
773
+ props: z.record(z.unknown()).optional(),
774
+ children: z.union([z.string(), z.array(z.unknown())]).optional(),
775
+ })),
776
+ })),
777
+ metadata: z
778
+ .object({
779
+ version: z.string().optional(),
780
+ author: z.string().optional(),
781
+ created: z.string().optional(),
782
+ updated: z.string().optional(),
783
+ })
784
+ .optional(),
785
+ });
786
+ /**
787
+ * Example screen definition with description
788
+ */
789
+ export const ScreenExampleSchema = z.object({
790
+ name: z.string(),
791
+ description: z.string(),
792
+ definition: ScreenDefinitionSchema,
793
+ });
794
+ /**
795
+ * Theme recipe info for generation context
796
+ */
797
+ export const ThemeRecipeInfoSchema = z.object({
798
+ componentType: z.string(),
799
+ variants: z.array(z.string()),
800
+ defaultClassName: z.string().optional(),
801
+ });
802
+ /**
803
+ * Generation hint for coding agents
804
+ */
805
+ export const GenerationHintSchema = z.object({
806
+ category: z.enum(['layout', 'component', 'styling', 'accessibility', 'best-practice']),
807
+ priority: z.enum(['high', 'medium', 'low']),
808
+ message: z.string(),
809
+ example: z.string().optional(),
810
+ });
811
+ /**
812
+ * Workflow Step Schema
813
+ * SPEC-MCP-004 Phase 5: E2E workflow guide for agents
814
+ */
815
+ export const WorkflowStepSchema = z.object({
816
+ step: z.number(),
817
+ action: z.string(),
818
+ tool: z.string().optional(),
819
+ description: z.string(),
820
+ example: z.string().optional(),
821
+ });
822
+ /**
823
+ * Workflow Guide Schema
824
+ * Provides step-by-step guidance for agents to generate screens
825
+ */
826
+ export const WorkflowGuideSchema = z.object({
827
+ title: z.string(),
828
+ description: z.string(),
829
+ steps: z.array(WorkflowStepSchema),
830
+ notes: z.array(z.string()).optional(),
831
+ });
832
+ /**
833
+ * Get Screen Generation Context Output Schema
834
+ */
835
+ export const GetScreenGenerationContextOutputSchema = z.object({
836
+ success: z.boolean(),
837
+ templateMatch: ContextTemplateMatchSchema.optional(),
838
+ components: z.array(ContextComponentInfoSchema).optional(),
839
+ schema: z
840
+ .object({
841
+ screenDefinition: z.unknown(), // JSON Schema representation
842
+ description: z.string(),
843
+ })
844
+ .optional(),
845
+ examples: z.array(ScreenExampleSchema).optional(),
846
+ themeRecipes: z.array(ThemeRecipeInfoSchema).optional(),
847
+ hints: z.array(GenerationHintSchema).optional(),
848
+ workflow: WorkflowGuideSchema.optional(),
849
+ error: z.string().optional(),
850
+ });
851
+ // ============================================================================
852
+ // Generate Screen Tool Schemas (SPEC-LAYOUT-002 Phase 4)
853
+ // ============================================================================
854
+ /**
855
+ * Output format for code generation
856
+ */
857
+ export const OutputFormatSchema = z.enum(['css-in-js', 'tailwind', 'react']);
858
+ /**
859
+ * CSS Framework options for CSS-in-JS format
860
+ */
861
+ export const CSSFrameworkSchema = z.enum(['styled-components', 'emotion']);
862
+ /**
863
+ * Generation options for generate_screen tool
864
+ */
865
+ export const GenerationOptionsSchema = z.object({
866
+ cssFramework: CSSFrameworkSchema.optional(),
867
+ typescript: z.boolean().optional().default(true),
868
+ prettier: z.boolean().optional().default(false),
869
+ });
870
+ /**
871
+ * Generate Screen Input Schema
872
+ * SPEC-LAYOUT-002: Generate production code from screen definition
873
+ */
874
+ export const GenerateScreenInputSchema = z.object({
875
+ screenDefinition: z.unknown(), // Accept any object - will be validated by @framingui/core
876
+ outputFormat: OutputFormatSchema,
877
+ options: GenerationOptionsSchema.optional(),
878
+ });
879
+ // Note: DependenciesSchema and GenerateScreenOutputSchema are defined later in this file
880
+ // (see lines 1113-1145) to avoid circular dependencies
881
+ // ============================================================================
882
+ // Validate Screen Definition Tool Schemas (SPEC-MCP-004 Phase 3.5)
883
+ // ============================================================================
884
+ /**
885
+ * Validate Screen Definition Input Schema
886
+ * SPEC-MCP-004 Phase 3.5: Validates screen definitions with helpful feedback
887
+ */
888
+ export const ValidateScreenDefinitionInputSchema = z.object({
889
+ definition: z.unknown(), // Accept any object for validation
890
+ strict: z.boolean().optional().default(true),
891
+ });
892
+ /**
893
+ * JSON Patch Operation Schema (RFC 6902 subset)
894
+ * Auto-fix 패치를 위한 스키마
895
+ */
896
+ export const JsonPatchOperationSchema = z.object({
897
+ op: z.enum(['replace', 'add', 'remove']),
898
+ path: z.string(),
899
+ value: z.unknown().optional(),
900
+ });
901
+ /**
902
+ * Validation error with path and suggestion
903
+ */
904
+ export const ValidationErrorSchema = z.object({
905
+ path: z.string(),
906
+ code: z.string(),
907
+ message: z.string(),
908
+ expected: z.string().optional(),
909
+ received: z.string().optional(),
910
+ suggestion: z.string().optional(),
911
+ autoFix: z.array(JsonPatchOperationSchema).optional(),
912
+ });
913
+ /**
914
+ * Validation warning (non-blocking)
915
+ */
916
+ export const ValidationWarningSchema = z.object({
917
+ path: z.string(),
918
+ code: z.string(),
919
+ message: z.string(),
920
+ recommendation: z.string().optional(),
921
+ });
922
+ /**
923
+ * Improvement suggestion
924
+ */
925
+ export const ImprovementSuggestionSchema = z.object({
926
+ category: z.enum(['accessibility', 'performance', 'maintainability', 'consistency']),
927
+ message: z.string(),
928
+ affectedPath: z.string().optional(),
929
+ suggestedChange: z.string().optional(),
930
+ autoFix: z.array(JsonPatchOperationSchema).optional(),
931
+ });
932
+ /**
933
+ * Validate Screen Definition Output Schema
934
+ */
935
+ export const ValidateScreenDefinitionOutputSchema = z.object({
936
+ success: z.boolean(),
937
+ valid: z.boolean().optional(),
938
+ errors: z.array(ValidationErrorSchema).optional(),
939
+ warnings: z.array(ValidationWarningSchema).optional(),
940
+ suggestions: z.array(ImprovementSuggestionSchema).optional(),
941
+ autoFixPatches: z.array(JsonPatchOperationSchema).optional(),
942
+ error: z.string().optional(),
943
+ });
944
+ // ============================================================================
945
+ // Validate Environment Tool Schemas (SPEC-MCP-005 Phase 2)
946
+ // ============================================================================
947
+ /**
948
+ * Validate Environment Input Schema
949
+ * SPEC-MCP-005 Phase 2: Check user's environment for missing dependencies
950
+ */
951
+ export const ValidateEnvironmentInputSchema = z.object({
952
+ projectPath: z.string().describe('Path to package.json or project root'),
953
+ requiredPackages: z.array(z.string()).describe('Packages required by the screen components'),
954
+ checkTailwind: z
955
+ .boolean()
956
+ .optional()
957
+ .default(true)
958
+ .describe('Also validate Tailwind CSS configuration for @framingui/ui compatibility'),
959
+ });
960
+ /**
961
+ * Validate Environment Output Schema
962
+ */
963
+ export const ValidateEnvironmentOutputSchema = z.object({
964
+ success: z.boolean(),
965
+ installed: z.record(z.string()).optional().describe('Packages already installed with versions'),
966
+ missing: z.array(z.string()).optional().describe('Packages that need to be installed'),
967
+ installCommands: z
968
+ .object({
969
+ npm: z.string(),
970
+ yarn: z.string(),
971
+ pnpm: z.string(),
972
+ bun: z.string(),
973
+ })
974
+ .optional(),
975
+ warnings: z.array(z.string()).optional().describe('Version conflicts or compatibility issues'),
976
+ tailwind: z
977
+ .object({
978
+ configFound: z.boolean(),
979
+ configPath: z.string().optional(),
980
+ hasUiContentPath: z.boolean(),
981
+ hasAnimatePlugin: z.boolean(),
982
+ issues: z.array(z.string()),
983
+ fixes: z.array(z.string()),
984
+ })
985
+ .optional()
986
+ .describe('Tailwind CSS configuration validation for @framingui/ui compatibility'),
987
+ error: z.string().optional(),
988
+ });
989
+ //# sourceMappingURL=mcp-schemas.js.map