@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,13 @@
1
+ /**
2
+ * List Tokens MCP Tool
3
+ * SPEC-LAYOUT-002 Phase 4: List available layout tokens from SPEC-LAYOUT-001
4
+ */
5
+ import type { ListTokensInput, ListTokensOutput } from '../schemas/mcp-schemas.js';
6
+ /**
7
+ * List available layout tokens from @framingui/core
8
+ *
9
+ * @param input - Token type filter and optional pattern filter
10
+ * @returns Categorized list of available tokens
11
+ */
12
+ export declare function listTokensTool(input: ListTokensInput): Promise<ListTokensOutput>;
13
+ //# sourceMappingURL=list-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/tools/list-tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAwBlG;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6EtF"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * List Tokens MCP Tool
3
+ * SPEC-LAYOUT-002 Phase 4: List available layout tokens from SPEC-LAYOUT-001
4
+ */
5
+ import { extractErrorMessage } from '../utils/error-handler.js';
6
+ /**
7
+ * Apply pattern filter to tokens
8
+ *
9
+ * @param tokens - Array of token metadata
10
+ * @param filter - Optional pattern filter (case-insensitive substring match)
11
+ * @returns Filtered tokens
12
+ */
13
+ function applyFilter(tokens, filter) {
14
+ if (!filter) {
15
+ return tokens;
16
+ }
17
+ const lowerFilter = filter.toLowerCase();
18
+ return tokens.filter(token => token.id.toLowerCase().includes(lowerFilter) ||
19
+ token.name?.toLowerCase().includes(lowerFilter) ||
20
+ token.description?.toLowerCase().includes(lowerFilter));
21
+ }
22
+ /**
23
+ * List available layout tokens from @framingui/core
24
+ *
25
+ * @param input - Token type filter and optional pattern filter
26
+ * @returns Categorized list of available tokens
27
+ */
28
+ export async function listTokensTool(input) {
29
+ try {
30
+ const { tokenType = 'all', filter } = input;
31
+ // Import token getters from @framingui/core
32
+ const { getAllShellTokens, getAllMobileShellTokens, getAllPageLayoutTokens, getAllSectionPatternTokens, } = await import('@framingui/core');
33
+ // Get tokens based on type
34
+ let shells = [];
35
+ let pages = [];
36
+ let sections = [];
37
+ if (tokenType === 'all' || tokenType === 'shell') {
38
+ // Get both web and mobile shell tokens (SPEC-LAYOUT-001 + SPEC-LAYOUT-004)
39
+ const webShellTokens = getAllShellTokens();
40
+ const mobileShellTokens = getAllMobileShellTokens();
41
+ const allShellTokens = [...webShellTokens, ...mobileShellTokens];
42
+ shells = allShellTokens.map(token => ({
43
+ id: token.id,
44
+ name: token.id.split('.').pop() || token.id, // Extract name from id
45
+ description: token.description,
46
+ platform: token.platform,
47
+ }));
48
+ }
49
+ if (tokenType === 'all' || tokenType === 'page') {
50
+ const pageTokens = getAllPageLayoutTokens();
51
+ pages = pageTokens.map(token => ({
52
+ id: token.id,
53
+ name: token.id.split('.').pop() || token.id, // Extract name from id
54
+ description: token.description,
55
+ purpose: token.purpose,
56
+ }));
57
+ }
58
+ if (tokenType === 'all' || tokenType === 'section') {
59
+ const sectionTokens = getAllSectionPatternTokens();
60
+ sections = sectionTokens.map(token => ({
61
+ id: token.id,
62
+ name: token.id.split('.').pop() || token.id, // Extract name from id
63
+ description: token.description,
64
+ type: token.type,
65
+ }));
66
+ }
67
+ // Apply filter if provided
68
+ if (filter) {
69
+ shells = applyFilter(shells, filter);
70
+ pages = applyFilter(pages, filter);
71
+ sections = applyFilter(sections, filter);
72
+ }
73
+ const total = shells.length + pages.length + sections.length;
74
+ return {
75
+ success: true,
76
+ shells: shells.length > 0 ? shells : undefined,
77
+ pages: pages.length > 0 ? pages : undefined,
78
+ sections: sections.length > 0 ? sections : undefined,
79
+ metadata: {
80
+ total,
81
+ filtered: filter ? total : undefined,
82
+ },
83
+ };
84
+ }
85
+ catch (error) {
86
+ return {
87
+ success: false,
88
+ error: extractErrorMessage(error),
89
+ };
90
+ }
91
+ }
92
+ //# sourceMappingURL=list-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tokens.js","sourceRoot":"","sources":["../../src/tools/list-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Preview Component MCP Tool (SPEC-MCP-003)
3
+ * [TAG-MCP003-007] Preview component with detailed information
4
+ *
5
+ * Returns detailed component information including:
6
+ * - Props and variants
7
+ * - Sub-components
8
+ * - Import statements
9
+ * - Dependencies
10
+ * - Usage examples
11
+ */
12
+ import type { PreviewComponentInput, PreviewComponentOutput } from '../schemas/mcp-schemas.js';
13
+ /**
14
+ * Preview a component with detailed information
15
+ * [TAG-MCP003-012] Component not found error handling
16
+ */
17
+ export declare function previewComponentTool(input: PreviewComponentInput): Promise<PreviewComponentOutput>;
18
+ //# sourceMappingURL=preview-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-component.d.ts","sourceRoot":"","sources":["../../src/tools/preview-component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAG/F;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA+CjC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Preview Component MCP Tool (SPEC-MCP-003)
3
+ * [TAG-MCP003-007] Preview component with detailed information
4
+ *
5
+ * Returns detailed component information including:
6
+ * - Props and variants
7
+ * - Sub-components
8
+ * - Import statements
9
+ * - Dependencies
10
+ * - Usage examples
11
+ */
12
+ import { getComponentById, getAllComponents } from '../data/component-registry.js';
13
+ import { getComponentPropsData } from '../data/component-props.js';
14
+ import { extractErrorMessage } from '../utils/error-handler.js';
15
+ /**
16
+ * Preview a component with detailed information
17
+ * [TAG-MCP003-012] Component not found error handling
18
+ */
19
+ export async function previewComponentTool(input) {
20
+ try {
21
+ // Set default values for optional parameters
22
+ const includeExamples = input.includeExamples ?? true;
23
+ const includeDependencies = input.includeDependencies ?? true;
24
+ const componentMeta = getComponentById(input.componentId);
25
+ if (!componentMeta) {
26
+ // [TAG-MCP003-012] Return error with available components
27
+ const availableComponents = getAllComponents().map(c => c.id);
28
+ return {
29
+ success: false,
30
+ error: `Component not found: ${input.componentId}. Available components: ${availableComponents.join(', ')}`,
31
+ };
32
+ }
33
+ const details = getComponentPropsData(input.componentId);
34
+ // Build component preview
35
+ const component = {
36
+ id: componentMeta.id,
37
+ name: componentMeta.name,
38
+ category: componentMeta.category,
39
+ description: componentMeta.description,
40
+ tier: componentMeta.tier,
41
+ props: details?.props || [],
42
+ variants: includeExamples && details?.variants ? details.variants : undefined,
43
+ subComponents: details?.subComponents,
44
+ importStatement: details?.subComponents
45
+ ? `import { ${componentMeta.name}, ${details.subComponents.join(', ')} } from '@framingui/ui';`
46
+ : `import { ${componentMeta.name} } from '@framingui/ui';`,
47
+ dependencies: includeDependencies ? details?.dependencies : undefined,
48
+ examples: includeExamples && details?.examples ? details.examples : undefined,
49
+ accessibility: details?.accessibility,
50
+ };
51
+ return {
52
+ success: true,
53
+ component,
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ success: false,
59
+ error: extractErrorMessage(error),
60
+ };
61
+ }
62
+ }
63
+ //# sourceMappingURL=preview-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-component.js","sourceRoot":"","sources":["../../src/tools/preview-component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA4B;IAE5B,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC;QACtD,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC;QAE9D,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,0DAA0D;YAC1D,MAAM,mBAAmB,GAAG,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB,KAAK,CAAC,WAAW,2BAA2B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC5G,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEzD,0BAA0B;QAC1B,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,aAAa,CAAC,EAAE;YACpB,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,WAAW,EAAE,aAAa,CAAC,WAAW;YACtC,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3B,QAAQ,EAAE,eAAe,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC7E,aAAa,EAAE,OAAO,EAAE,aAAa;YACrC,eAAe,EAAE,OAAO,EAAE,aAAa;gBACrC,CAAC,CAAC,YAAY,aAAa,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B;gBAC/F,CAAC,CAAC,YAAY,aAAa,CAAC,IAAI,0BAA0B;YAC5D,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS;YACrE,QAAQ,EAAE,eAAe,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC7E,aAAa,EAAE,OAAO,EAAE,aAAa;SACtC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;SAClC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * MCP Tool: preview-icon-library
3
+ * Preview a specific icon library and retrieve its full data
4
+ * [SPEC-ICON-001]
5
+ */
6
+ import type { PreviewIconLibraryInput, PreviewIconLibraryOutput } from '../schemas/mcp-schemas.js';
7
+ /**
8
+ * Preview an icon library and retrieve its full data
9
+ * @param input - Library ID to preview
10
+ * @returns Full icon library data
11
+ */
12
+ export declare function previewIconLibraryTool(input: PreviewIconLibraryInput): Promise<PreviewIconLibraryOutput>;
13
+ //# sourceMappingURL=preview-icon-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-icon-library.d.ts","sourceRoot":"","sources":["../../src/tools/preview-icon-library.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAGnG;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAuDnC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * MCP Tool: preview-icon-library
3
+ * Preview a specific icon library and retrieve its full data
4
+ * [SPEC-ICON-001]
5
+ */
6
+ import { loadIconLibrary, iconLibraryExists } from '@framingui/core';
7
+ import { info, error as logError } from '../utils/logger.js';
8
+ /**
9
+ * Preview an icon library and retrieve its full data
10
+ * @param input - Library ID to preview
11
+ * @returns Full icon library data
12
+ */
13
+ export async function previewIconLibraryTool(input) {
14
+ const { libraryId } = input;
15
+ info(`preview-icon-library: Previewing library "${libraryId}"`);
16
+ // Check if library exists
17
+ if (!iconLibraryExists(libraryId)) {
18
+ logError(`preview-icon-library: Library "${libraryId}" not found`);
19
+ return {
20
+ success: false,
21
+ error: `Icon library "${libraryId}" not found. Use list-icon-libraries to see available libraries.`,
22
+ };
23
+ }
24
+ try {
25
+ const library = loadIconLibrary(libraryId);
26
+ if (!library) {
27
+ return {
28
+ success: false,
29
+ error: `Failed to load icon library "${libraryId}"`,
30
+ };
31
+ }
32
+ // Get first 20 icons as sample
33
+ const iconNames = Object.keys(library.icons);
34
+ const iconSample = iconNames.slice(0, 20);
35
+ info(`preview-icon-library: Successfully loaded library "${libraryId}"`);
36
+ return {
37
+ success: true,
38
+ library: {
39
+ id: library.id,
40
+ name: library.name,
41
+ description: library.description,
42
+ version: library.version,
43
+ license: library.license,
44
+ website: library.website,
45
+ totalIcons: library.totalIcons,
46
+ categories: library.categories,
47
+ sizeMapping: library.sizeMapping,
48
+ frameworks: library.frameworks,
49
+ defaultVariant: library.defaultVariant,
50
+ iconSample,
51
+ },
52
+ };
53
+ }
54
+ catch (err) {
55
+ const errorMessage = err instanceof Error ? err.message : String(err);
56
+ logError(`preview-icon-library: Failed to preview library: ${errorMessage}`);
57
+ return {
58
+ success: false,
59
+ error: `Failed to preview icon library: ${errorMessage}`,
60
+ };
61
+ }
62
+ }
63
+ //# sourceMappingURL=preview-icon-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-icon-library.js","sourceRoot":"","sources":["../../src/tools/preview-icon-library.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAA8B;IAE9B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5B,IAAI,CAAC,6CAA6C,SAAS,GAAG,CAAC,CAAC;IAEhE,0BAA0B;IAC1B,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,kCAAkC,SAAS,aAAa,CAAC,CAAC;QACnE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iBAAiB,SAAS,kEAAkE;SACpG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,gCAAgC,SAAS,GAAG;aACpD,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC,sDAAsD,SAAS,GAAG,CAAC,CAAC;QAEzE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,UAAU;aACX;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,QAAQ,CAAC,oDAAoD,YAAY,EAAE,CAAC,CAAC;QAC7E,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mCAAmC,YAAY,EAAE;SACzD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Preview Screen Template MCP Tool (SPEC-MCP-003)
3
+ * [TAG-MCP003-009] Preview template with detailed structure
4
+ *
5
+ * Returns detailed template information including:
6
+ * - Skeleton structure (non-customizable)
7
+ * - Layout configuration (responsive breakpoints)
8
+ * - Customization boundaries (what AI can modify)
9
+ * - Required components
10
+ * - Example props
11
+ */
12
+ import type { PreviewScreenTemplateInput, PreviewScreenTemplateOutput } from '../schemas/mcp-schemas.js';
13
+ /**
14
+ * Preview a screen template with detailed structure
15
+ * [TAG-MCP003-013] Template not found error handling
16
+ */
17
+ export declare function previewScreenTemplateTool(input: PreviewScreenTemplateInput): Promise<PreviewScreenTemplateOutput>;
18
+ //# sourceMappingURL=preview-screen-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-screen-template.d.ts","sourceRoot":"","sources":["../../src/tools/preview-screen-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAG5B,MAAM,2BAA2B,CAAC;AAGnC;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CAuFtC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Preview Screen Template MCP Tool (SPEC-MCP-003)
3
+ * [TAG-MCP003-009] Preview template with detailed structure
4
+ *
5
+ * Returns detailed template information including:
6
+ * - Skeleton structure (non-customizable)
7
+ * - Layout configuration (responsive breakpoints)
8
+ * - Customization boundaries (what AI can modify)
9
+ * - Required components
10
+ * - Example props
11
+ */
12
+ import { templateRegistry } from '@framingui/ui';
13
+ import { extractErrorMessage } from '../utils/error-handler.js';
14
+ /**
15
+ * Preview a screen template with detailed structure
16
+ * [TAG-MCP003-013] Template not found error handling
17
+ */
18
+ export async function previewScreenTemplateTool(input) {
19
+ try {
20
+ // Set default value for optional parameter
21
+ const includeLayoutTokens = input.includeLayoutTokens ?? true;
22
+ const template = templateRegistry.get(input.templateId);
23
+ if (!template) {
24
+ // [TAG-MCP003-013] Return error with available templates
25
+ const availableTemplates = templateRegistry.getAll().map((t) => t.id);
26
+ return {
27
+ success: false,
28
+ error: `Template not found: ${input.templateId}. Available templates: ${availableTemplates.join(', ')}`,
29
+ };
30
+ }
31
+ // Build skeleton structure
32
+ const skeleton = {
33
+ shell: template.skeleton.shell,
34
+ page: template.skeleton.page,
35
+ sections: template.skeleton.sections.map((s) => ({
36
+ id: s.id,
37
+ name: s.name,
38
+ slot: s.slot,
39
+ required: s.required,
40
+ })),
41
+ };
42
+ // Build layout configuration
43
+ const layout = {
44
+ type: template.layout.type,
45
+ responsive: includeLayoutTokens && template.layout.responsive
46
+ ? {
47
+ mobile: {
48
+ padding: template.layout.responsive.mobile.padding,
49
+ gap: template.layout.responsive.mobile.gap,
50
+ columns: template.layout.responsive.mobile.columns,
51
+ },
52
+ tablet: {
53
+ padding: template.layout.responsive.tablet.padding,
54
+ gap: template.layout.responsive.tablet.gap,
55
+ columns: template.layout.responsive.tablet.columns,
56
+ },
57
+ desktop: {
58
+ padding: template.layout.responsive.desktop.padding,
59
+ gap: template.layout.responsive.desktop.gap,
60
+ columns: template.layout.responsive.desktop.columns,
61
+ },
62
+ }
63
+ : undefined,
64
+ };
65
+ // Build customization boundaries
66
+ const customizable = {
67
+ texts: template.customizable.texts,
68
+ optional: template.customizable.optional,
69
+ slots: template.customizable.slots,
70
+ };
71
+ // Build import statement
72
+ const importStatement = `import { ${template.name}Template } from '@framingui/ui';`;
73
+ return {
74
+ success: true,
75
+ template: {
76
+ id: template.id,
77
+ name: template.name,
78
+ category: template.category,
79
+ description: template.description,
80
+ version: template.version,
81
+ skeleton,
82
+ layout,
83
+ customizable,
84
+ requiredComponents: template.requiredComponents,
85
+ importStatement,
86
+ created: template.created,
87
+ updated: template.updated,
88
+ tags: template.tags,
89
+ },
90
+ };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ success: false,
95
+ error: extractErrorMessage(error),
96
+ };
97
+ }
98
+ }
99
+ //# sourceMappingURL=preview-screen-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-screen-template.js","sourceRoot":"","sources":["../../src/tools/preview-screen-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Preview Theme MCP Tool (v2.1)
3
+ * SPEC-MCP-002: E-002 Theme Preview Request
4
+ * SPEC-DEPLOY-001: 인증된 사용자의 라이선스 보유 테마만 접근 가능
5
+ */
6
+ import type { PreviewThemeInput, PreviewThemeOutput } from '../schemas/mcp-schemas.js';
7
+ /**
8
+ * Preview theme MCP tool implementation
9
+ * 인증된 사용자의 라이선스 보유 테마만 미리보기 가능
10
+ *
11
+ * @param input - Theme ID to preview, optional includeCSS flag
12
+ * @returns Full v2.1 theme data (MCP JSON-RPC format), optionally with CSS variables
13
+ */
14
+ export declare function previewThemeTool(input: PreviewThemeInput): Promise<PreviewThemeOutput>;
15
+ //# sourceMappingURL=preview-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-theme.d.ts","sourceRoot":"","sources":["../../src/tools/preview-theme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA2GvF;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkE5F"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Preview Theme MCP Tool (v2.1)
3
+ * SPEC-MCP-002: E-002 Theme Preview Request
4
+ * SPEC-DEPLOY-001: 인증된 사용자의 라이선스 보유 테마만 접근 가능
5
+ */
6
+ import { loadTheme, listThemes } from '@framingui/core';
7
+ import { themeToCSS } from '@framingui/ui';
8
+ import { createThemeNotFoundError, extractErrorMessage } from '../utils/error-handler.js';
9
+ import { getAuthData } from '../auth/state.js';
10
+ /**
11
+ * ThemeV2 (core) -> ThemeDefinition (ui) 어댑터
12
+ *
13
+ * ThemeV2의 semantic 토큰 구조는 ThemeDefinition과 다를 수 있으므로
14
+ * 필수 필드를 폴백 값과 함께 안전하게 매핑합니다.
15
+ *
16
+ * 주요 차이점:
17
+ * - ThemeV2.semantic.background.brand: Record<string, string> (default, subtle 등)
18
+ * - ThemeDefinition.semantic.background.brand: { subtle, default, emphasis }
19
+ * - ThemeV2.semantic.border: { default, input, ... } (flat)
20
+ * - ThemeDefinition.semantic.border.default: { subtle, default, emphasis }
21
+ */
22
+ function themeV2ToDefinition(theme) {
23
+ const semantic = theme.tokens.semantic;
24
+ // background.surface 매핑 (폴백 포함)
25
+ const surfaceRaw = semantic.background?.surface;
26
+ const surface = {
27
+ subtle: surfaceRaw?.subtle ?? 'atomic.color.neutral.50',
28
+ default: surfaceRaw?.default ?? 'atomic.color.neutral.white',
29
+ emphasis: surfaceRaw?.emphasis ?? surfaceRaw?.popover ?? 'atomic.color.neutral.100',
30
+ };
31
+ // background.brand 매핑 (폴백 포함)
32
+ const brandRaw = semantic.background?.brand;
33
+ const brand = {
34
+ subtle: brandRaw?.subtle ?? 'atomic.color.brand.100',
35
+ default: brandRaw?.default ?? 'atomic.color.brand.500',
36
+ emphasis: brandRaw?.emphasis ?? 'atomic.color.brand.700',
37
+ };
38
+ // border 매핑 - ThemeV2는 flat 구조, ThemeDefinition은 nested
39
+ const borderRaw = semantic.border;
40
+ const borderDefault = {
41
+ subtle: borderRaw?.default?.subtle ??
42
+ borderRaw?.input ??
43
+ 'atomic.color.neutral.200',
44
+ default: borderRaw?.default?.default ??
45
+ borderRaw?.default ??
46
+ 'atomic.color.neutral.200',
47
+ emphasis: borderRaw?.default?.emphasis ??
48
+ borderRaw?.emphasis ??
49
+ 'atomic.color.neutral.300',
50
+ };
51
+ // text 매핑 (optional)
52
+ const textRaw = semantic.text;
53
+ const text = textRaw
54
+ ? {
55
+ primary: textRaw.primary ?? 'atomic.color.neutral.900',
56
+ secondary: textRaw.secondary ?? 'atomic.color.neutral.500',
57
+ muted: textRaw.muted ?? 'atomic.color.neutral.400',
58
+ }
59
+ : undefined;
60
+ return {
61
+ id: theme.id,
62
+ name: theme.name,
63
+ schemaVersion: theme.schemaVersion,
64
+ tokens: {
65
+ atomic: {
66
+ color: theme.tokens.atomic.color,
67
+ spacing: theme.tokens.atomic.spacing,
68
+ radius: theme.tokens.atomic.radius,
69
+ },
70
+ semantic: {
71
+ background: {
72
+ canvas: semantic.background?.canvas ?? 'atomic.color.neutral.white',
73
+ surface,
74
+ brand,
75
+ },
76
+ border: {
77
+ default: borderDefault,
78
+ },
79
+ ...(text ? { text } : {}),
80
+ },
81
+ },
82
+ stateLayer: theme.stateLayer
83
+ ? {
84
+ hover: theme.stateLayer.hover
85
+ ? { opacity: theme.stateLayer.hover.opacity ?? 0.08 }
86
+ : undefined,
87
+ disabled: theme.stateLayer.disabled
88
+ ? {
89
+ opacity: theme.stateLayer.disabled.opacity ?? 0.38,
90
+ contentOpacity: theme.stateLayer.disabled.contentOpacity ?? 0.38,
91
+ }
92
+ : undefined,
93
+ }
94
+ : undefined,
95
+ typography: theme.typography
96
+ ? {
97
+ fontFamily: theme.typography.fontFamily,
98
+ fontWeight: theme.typography.fontWeight,
99
+ }
100
+ : undefined,
101
+ };
102
+ }
103
+ /**
104
+ * Preview theme MCP tool implementation
105
+ * 인증된 사용자의 라이선스 보유 테마만 미리보기 가능
106
+ *
107
+ * @param input - Theme ID to preview, optional includeCSS flag
108
+ * @returns Full v2.1 theme data (MCP JSON-RPC format), optionally with CSS variables
109
+ */
110
+ export async function previewThemeTool(input) {
111
+ try {
112
+ const authData = getAuthData();
113
+ const themeId = input.themeId;
114
+ // 인증 + 라이선스 확인
115
+ if (!authData || !authData.valid) {
116
+ return {
117
+ success: false,
118
+ error: `Authentication required to preview themes. Run \`tekton-mcp login\` to authenticate.`,
119
+ };
120
+ }
121
+ // 라이선스 보유 확인
122
+ const licensedThemes = authData.themes?.licensed || [];
123
+ if (!licensedThemes.includes(themeId)) {
124
+ return {
125
+ success: false,
126
+ error: `Theme "${themeId}" is not included in your license. Please purchase this theme at https://framingui.com.`,
127
+ };
128
+ }
129
+ // @framingui/core에서 테마 로드
130
+ const theme = loadTheme(themeId);
131
+ if (!theme) {
132
+ const availableThemes = listThemes().map((t) => t.id);
133
+ return createThemeNotFoundError(themeId, availableThemes);
134
+ }
135
+ // includeCSS가 true인 경우 CSS 변수 생성
136
+ let css;
137
+ if (input.includeCSS) {
138
+ const themeDefinition = themeV2ToDefinition(theme);
139
+ css = themeToCSS(themeDefinition);
140
+ }
141
+ // v2.1 테마 데이터 반환
142
+ return {
143
+ success: true,
144
+ theme: {
145
+ id: theme.id,
146
+ name: theme.name,
147
+ description: theme.description,
148
+ brandTone: theme.brandTone,
149
+ schemaVersion: theme.schemaVersion,
150
+ designDNA: theme.designDNA,
151
+ tokens: {
152
+ atomic: theme.tokens.atomic,
153
+ semantic: theme.tokens.semantic,
154
+ component: theme.tokens.component,
155
+ recipes: theme.tokens.recipes,
156
+ },
157
+ stateLayer: theme.stateLayer,
158
+ motion: theme.motion,
159
+ elevation: theme.elevation,
160
+ typography: theme.typography,
161
+ },
162
+ ...(css ? { css } : {}),
163
+ };
164
+ }
165
+ catch (error) {
166
+ return {
167
+ success: false,
168
+ error: extractErrorMessage(error),
169
+ };
170
+ }
171
+ }
172
+ //# sourceMappingURL=preview-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-theme.js","sourceRoot":"","sources":["../../src/tools/preview-theme.ts"],"names":[],"mappings":"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"}