@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.
- package/README.md +1027 -0
- package/dist/auth/cache.d.ts +28 -0
- package/dist/auth/cache.d.ts.map +1 -0
- package/dist/auth/cache.js +48 -0
- package/dist/auth/cache.js.map +1 -0
- package/dist/auth/guard.d.ts +22 -0
- package/dist/auth/guard.d.ts.map +1 -0
- package/dist/auth/guard.js +37 -0
- package/dist/auth/guard.js.map +1 -0
- package/dist/auth/state.d.ts +42 -0
- package/dist/auth/state.d.ts.map +1 -0
- package/dist/auth/state.js +96 -0
- package/dist/auth/state.js.map +1 -0
- package/dist/auth/theme-access.d.ts +21 -0
- package/dist/auth/theme-access.d.ts.map +1 -0
- package/dist/auth/theme-access.js +30 -0
- package/dist/auth/theme-access.js.map +1 -0
- package/dist/auth/verify.d.ts +44 -0
- package/dist/auth/verify.d.ts.map +1 -0
- package/dist/auth/verify.js +77 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli/agent-md-templates.d.ts +16 -0
- package/dist/cli/agent-md-templates.d.ts.map +1 -0
- package/dist/cli/agent-md-templates.js +311 -0
- package/dist/cli/agent-md-templates.js.map +1 -0
- package/dist/cli/credentials.d.ts +29 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +66 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/guide-template.d.ts +10 -0
- package/dist/cli/guide-template.d.ts.map +1 -0
- package/dist/cli/guide-template.js +195 -0
- package/dist/cli/guide-template.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +319 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +121 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logout.d.ts +9 -0
- package/dist/cli/logout.d.ts.map +1 -0
- package/dist/cli/logout.js +18 -0
- package/dist/cli/logout.js.map +1 -0
- package/dist/cli/status.d.ts +9 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +31 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/data/component-props.d.ts +30 -0
- package/dist/data/component-props.d.ts.map +1 -0
- package/dist/data/component-props.js +537 -0
- package/dist/data/component-props.js.map +1 -0
- package/dist/data/component-registry.d.ts +30 -0
- package/dist/data/component-registry.d.ts.map +1 -0
- package/dist/data/component-registry.js +320 -0
- package/dist/data/component-registry.js.map +1 -0
- package/dist/data/examples/screen-examples.d.ts +38 -0
- package/dist/data/examples/screen-examples.d.ts.map +1 -0
- package/dist/data/examples/screen-examples.js +500 -0
- package/dist/data/examples/screen-examples.js.map +1 -0
- package/dist/data/hint-generator.d.ts +16 -0
- package/dist/data/hint-generator.d.ts.map +1 -0
- package/dist/data/hint-generator.js +298 -0
- package/dist/data/hint-generator.js.map +1 -0
- package/dist/data/recipe-resolver.d.ts +48 -0
- package/dist/data/recipe-resolver.d.ts.map +1 -0
- package/dist/data/recipe-resolver.js +226 -0
- package/dist/data/recipe-resolver.js.map +1 -0
- package/dist/data/template-matcher.d.ts +50 -0
- package/dist/data/template-matcher.d.ts.map +1 -0
- package/dist/data/template-matcher.js +240 -0
- package/dist/data/template-matcher.js.map +1 -0
- package/dist/generators/core-resolver.d.ts +56 -0
- package/dist/generators/core-resolver.d.ts.map +1 -0
- package/dist/generators/core-resolver.js +490 -0
- package/dist/generators/core-resolver.js.map +1 -0
- package/dist/generators/css-generator.d.ts +49 -0
- package/dist/generators/css-generator.d.ts.map +1 -0
- package/dist/generators/css-generator.js +294 -0
- package/dist/generators/css-generator.js.map +1 -0
- package/dist/generators/index.d.ts +13 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +16 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/llm-generator.d.ts +96 -0
- package/dist/generators/llm-generator.d.ts.map +1 -0
- package/dist/generators/llm-generator.js +296 -0
- package/dist/generators/llm-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +965 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/getting-started.d.ts +18 -0
- package/dist/prompts/getting-started.d.ts.map +1 -0
- package/dist/prompts/getting-started.js +112 -0
- package/dist/prompts/getting-started.js.map +1 -0
- package/dist/prompts/screen-workflow.d.ts +17 -0
- package/dist/prompts/screen-workflow.d.ts.map +1 -0
- package/dist/prompts/screen-workflow.js +246 -0
- package/dist/prompts/screen-workflow.js.map +1 -0
- package/dist/schemas/mcp-schemas.d.ts +4342 -0
- package/dist/schemas/mcp-schemas.d.ts.map +1 -0
- package/dist/schemas/mcp-schemas.js +989 -0
- package/dist/schemas/mcp-schemas.js.map +1 -0
- package/dist/storage/blueprint-storage.d.ts +68 -0
- package/dist/storage/blueprint-storage.d.ts.map +1 -0
- package/dist/storage/blueprint-storage.js +135 -0
- package/dist/storage/blueprint-storage.js.map +1 -0
- package/dist/storage/timestamp-manager.d.ts +32 -0
- package/dist/storage/timestamp-manager.d.ts.map +1 -0
- package/dist/storage/timestamp-manager.js +59 -0
- package/dist/storage/timestamp-manager.js.map +1 -0
- package/dist/tools/export-screen.d.ts +34 -0
- package/dist/tools/export-screen.d.ts.map +1 -0
- package/dist/tools/export-screen.js +344 -0
- package/dist/tools/export-screen.js.map +1 -0
- package/dist/tools/generate-blueprint.d.ts +15 -0
- package/dist/tools/generate-blueprint.d.ts.map +1 -0
- package/dist/tools/generate-blueprint.js +165 -0
- package/dist/tools/generate-blueprint.js.map +1 -0
- package/dist/tools/generate-screen.d.ts +13 -0
- package/dist/tools/generate-screen.d.ts.map +1 -0
- package/dist/tools/generate-screen.js +82 -0
- package/dist/tools/generate-screen.js.map +1 -0
- package/dist/tools/get-screen-generation-context.d.ts +11 -0
- package/dist/tools/get-screen-generation-context.d.ts.map +1 -0
- package/dist/tools/get-screen-generation-context.js +325 -0
- package/dist/tools/get-screen-generation-context.js.map +1 -0
- package/dist/tools/list-components.d.ts +15 -0
- package/dist/tools/list-components.d.ts.map +1 -0
- package/dist/tools/list-components.js +46 -0
- package/dist/tools/list-components.js.map +1 -0
- package/dist/tools/list-icon-libraries.d.ts +12 -0
- package/dist/tools/list-icon-libraries.d.ts.map +1 -0
- package/dist/tools/list-icon-libraries.js +48 -0
- package/dist/tools/list-icon-libraries.js.map +1 -0
- package/dist/tools/list-screen-templates.d.ts +15 -0
- package/dist/tools/list-screen-templates.d.ts.map +1 -0
- package/dist/tools/list-screen-templates.js +61 -0
- package/dist/tools/list-screen-templates.js.map +1 -0
- package/dist/tools/list-themes.d.ts +13 -0
- package/dist/tools/list-themes.d.ts.map +1 -0
- package/dist/tools/list-themes.js +42 -0
- package/dist/tools/list-themes.js.map +1 -0
- package/dist/tools/list-tokens.d.ts +13 -0
- package/dist/tools/list-tokens.d.ts.map +1 -0
- package/dist/tools/list-tokens.js +92 -0
- package/dist/tools/list-tokens.js.map +1 -0
- package/dist/tools/preview-component.d.ts +18 -0
- package/dist/tools/preview-component.d.ts.map +1 -0
- package/dist/tools/preview-component.js +63 -0
- package/dist/tools/preview-component.js.map +1 -0
- package/dist/tools/preview-icon-library.d.ts +13 -0
- package/dist/tools/preview-icon-library.d.ts.map +1 -0
- package/dist/tools/preview-icon-library.js +63 -0
- package/dist/tools/preview-icon-library.js.map +1 -0
- package/dist/tools/preview-screen-template.d.ts +18 -0
- package/dist/tools/preview-screen-template.d.ts.map +1 -0
- package/dist/tools/preview-screen-template.js +99 -0
- package/dist/tools/preview-screen-template.js.map +1 -0
- package/dist/tools/preview-theme.d.ts +15 -0
- package/dist/tools/preview-theme.d.ts.map +1 -0
- package/dist/tools/preview-theme.js +172 -0
- package/dist/tools/preview-theme.js.map +1 -0
- package/dist/tools/validate-environment.d.ts +37 -0
- package/dist/tools/validate-environment.d.ts.map +1 -0
- package/dist/tools/validate-environment.js +153 -0
- package/dist/tools/validate-environment.js.map +1 -0
- package/dist/tools/validate-screen-definition.d.ts +10 -0
- package/dist/tools/validate-screen-definition.d.ts.map +1 -0
- package/dist/tools/validate-screen-definition.js +559 -0
- package/dist/tools/validate-screen-definition.js.map +1 -0
- package/dist/tools/validate-screen.d.ts +13 -0
- package/dist/tools/validate-screen.d.ts.map +1 -0
- package/dist/tools/validate-screen.js +106 -0
- package/dist/tools/validate-screen.js.map +1 -0
- package/dist/tools/whoami.d.ts +17 -0
- package/dist/tools/whoami.d.ts.map +1 -0
- package/dist/tools/whoami.js +65 -0
- package/dist/tools/whoami.js.map +1 -0
- package/dist/utils/dependency-extractor.d.ts +13 -0
- package/dist/utils/dependency-extractor.d.ts.map +1 -0
- package/dist/utils/dependency-extractor.js +232 -0
- package/dist/utils/dependency-extractor.js.map +1 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +48 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-json-reader.d.ts +37 -0
- package/dist/utils/package-json-reader.d.ts.map +1 -0
- package/dist/utils/package-json-reader.js +108 -0
- package/dist/utils/package-json-reader.js.map +1 -0
- package/dist/utils/tailwind-config-reader.d.ts +23 -0
- package/dist/utils/tailwind-config-reader.d.ts.map +1 -0
- package/dist/utils/tailwind-config-reader.js +81 -0
- package/dist/utils/tailwind-config-reader.js.map +1 -0
- 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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"}
|