@tekton-ui/mcp-server 0.3.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/LICENSE +21 -0
- package/README.md +980 -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 +13 -0
- package/dist/auth/guard.d.ts.map +1 -0
- package/dist/auth/guard.js +21 -0
- package/dist/auth/guard.js.map +1 -0
- package/dist/auth/state.d.ts +32 -0
- package/dist/auth/state.d.ts.map +1 -0
- package/dist/auth/state.js +72 -0
- package/dist/auth/state.js.map +1 -0
- package/dist/auth/theme-access.d.ts +10 -0
- package/dist/auth/theme-access.d.ts.map +1 -0
- package/dist/auth/theme-access.js +24 -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/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/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +36 -0
- package/dist/cli/index.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 +120 -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-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 +818 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/mcp-schemas.d.ts +4132 -0
- package/dist/schemas/mcp-schemas.d.ts.map +1 -0
- package/dist/schemas/mcp-schemas.js +946 -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 +316 -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 +63 -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 +178 -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 +101 -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 +71 -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 +463 -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/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 +72 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Screen MCP Tool
|
|
3
|
+
* SPEC-MCP-002: E-003 Screen Export Request
|
|
4
|
+
* SPEC-COMPONENT-001-D: Hybrid Export System
|
|
5
|
+
* SPEC-MCP-004 Phase 4: Theme Recipes Auto-Application
|
|
6
|
+
*/
|
|
7
|
+
import { render, loadTheme } from '@tekton-ui/core';
|
|
8
|
+
import { createErrorResponse, extractErrorMessage } from '../utils/error-handler.js';
|
|
9
|
+
import { isTier1Component, resolveFromTier1, resolveFromTier2, generateCSS, TIER1_COMPONENTS, } from '../generators/index.js';
|
|
10
|
+
import { applyRecipesToBlueprint } from '../data/recipe-resolver.js';
|
|
11
|
+
/**
|
|
12
|
+
* Convert JSX code to TSX format with TypeScript annotations
|
|
13
|
+
* SPEC: S-004 Export Format Compatibility - TSX format
|
|
14
|
+
*/
|
|
15
|
+
function convertToTSX(jsxCode) {
|
|
16
|
+
// Add React import and type annotation to function signature
|
|
17
|
+
const lines = jsxCode.split('\n');
|
|
18
|
+
const result = [];
|
|
19
|
+
// Add React import at the beginning
|
|
20
|
+
result.push("import React from 'react';");
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
// Convert function signature to include React.ReactElement return type
|
|
23
|
+
if (line.match(/^export default function \w+\(\)/)) {
|
|
24
|
+
result.push(line.replace('()', '(): React.ReactElement'));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
result.push(line);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result.join('\n');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert JSX code to Vue 3 SFC format
|
|
34
|
+
* SPEC: S-004 Export Format Compatibility - Vue format
|
|
35
|
+
*/
|
|
36
|
+
function convertToVue(jsxCode, componentName) {
|
|
37
|
+
// Extract the JSX content from the return statement
|
|
38
|
+
const returnMatch = jsxCode.match(/return \(([\s\S]*?)\);/);
|
|
39
|
+
if (!returnMatch || !returnMatch[1]) {
|
|
40
|
+
return jsxCode; // Fallback to original if pattern doesn't match
|
|
41
|
+
}
|
|
42
|
+
const jsxContent = returnMatch[1].trim();
|
|
43
|
+
// Convert React-style JSX to Vue template syntax
|
|
44
|
+
const vueTemplate = jsxContent.replace(/className=/g, 'class=').replace(/{([^}]+)}/g, '{{ $1 }}'); // Convert interpolation
|
|
45
|
+
return `<template>
|
|
46
|
+
${vueTemplate
|
|
47
|
+
.split('\n')
|
|
48
|
+
.map(line => ' ' + line)
|
|
49
|
+
.join('\n')}
|
|
50
|
+
</template>
|
|
51
|
+
|
|
52
|
+
<script setup lang="ts">
|
|
53
|
+
// ${componentName} component
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
<style scoped>
|
|
57
|
+
/* Component styles */
|
|
58
|
+
</style>
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extract component name from blueprint name or use default
|
|
63
|
+
*/
|
|
64
|
+
function extractComponentName(blueprintName) {
|
|
65
|
+
// Convert to PascalCase and remove special characters
|
|
66
|
+
const cleaned = blueprintName
|
|
67
|
+
.replace(/[^a-zA-Z0-9\s]/g, '')
|
|
68
|
+
.split(/\s+/)
|
|
69
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
70
|
+
.join('');
|
|
71
|
+
return cleaned || 'GeneratedComponent';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Export screen MCP tool implementation
|
|
75
|
+
* SPEC: E-003 Screen Export Request
|
|
76
|
+
* SPEC-MCP-004 Phase 4: Apply theme recipes before rendering
|
|
77
|
+
*
|
|
78
|
+
* @param input - Blueprint object and export format
|
|
79
|
+
* @returns Generated code (MCP JSON-RPC format - no file write, no filePath)
|
|
80
|
+
*/
|
|
81
|
+
export async function exportScreenTool(input) {
|
|
82
|
+
try {
|
|
83
|
+
// MCP JSON-RPC format: Accept blueprint object directly (no storage lookup)
|
|
84
|
+
let blueprint = input.blueprint;
|
|
85
|
+
if (!blueprint) {
|
|
86
|
+
return createErrorResponse('Blueprint object is required');
|
|
87
|
+
}
|
|
88
|
+
// SPEC-MCP-004 Phase 4: Apply theme recipes if themeId exists
|
|
89
|
+
if (blueprint.themeId && blueprint.components) {
|
|
90
|
+
const componentsWithRecipes = applyRecipesToBlueprint(blueprint.components, blueprint.themeId);
|
|
91
|
+
blueprint = {
|
|
92
|
+
...blueprint,
|
|
93
|
+
components: componentsWithRecipes,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// SPEC: U-003 @tekton-ui/core Integration - Use render from @tekton-ui/core
|
|
97
|
+
// Note: render() returns complete JSX component code with imports and function wrapper
|
|
98
|
+
const renderResult = render(blueprint);
|
|
99
|
+
if (!renderResult.success) {
|
|
100
|
+
return createErrorResponse(`Render failed: ${renderResult.error || 'Unknown error'}`);
|
|
101
|
+
}
|
|
102
|
+
const jsxCode = renderResult.code || '';
|
|
103
|
+
// SPEC: S-004 Export Format Compatibility - Convert JSX to requested format
|
|
104
|
+
let finalCode;
|
|
105
|
+
switch (input.format) {
|
|
106
|
+
case 'jsx':
|
|
107
|
+
// render() already returns JSX format
|
|
108
|
+
finalCode = jsxCode;
|
|
109
|
+
break;
|
|
110
|
+
case 'tsx':
|
|
111
|
+
// Convert JSX imports to TypeScript format
|
|
112
|
+
finalCode = jsxCode ? convertToTSX(jsxCode) : '';
|
|
113
|
+
break;
|
|
114
|
+
case 'vue':
|
|
115
|
+
// Convert JSX to Vue SFC format
|
|
116
|
+
finalCode = convertToVue(jsxCode, extractComponentName(blueprint.name || 'Component'));
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
return createErrorResponse(`Unsupported format: ${input.format}`);
|
|
120
|
+
}
|
|
121
|
+
// MCP JSON-RPC format: Return code only (no file write, no filePath)
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
code: finalCode,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
error: extractErrorMessage(error),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ============================================================================
|
|
135
|
+
// Hybrid Export System (SPEC-COMPONENT-001-D)
|
|
136
|
+
// ============================================================================
|
|
137
|
+
/**
|
|
138
|
+
* 컴포넌트 해결 - Tier 1 또는 Tier 2 자동 선택
|
|
139
|
+
*
|
|
140
|
+
* @param componentName - 컴포넌트 이름
|
|
141
|
+
* @param tier - 선호하는 tier (auto, tier1, tier2)
|
|
142
|
+
* @param description - 컴포넌트 설명 (tier2용)
|
|
143
|
+
* @returns 해결 결과
|
|
144
|
+
*/
|
|
145
|
+
async function resolveComponent(componentName, tier = 'auto', description) {
|
|
146
|
+
// Tier 1 강제
|
|
147
|
+
if (tier === 'tier1') {
|
|
148
|
+
if (!isTier1Component(componentName)) {
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
error: `Component "${componentName}" is not available in Tier 1. Available: ${TIER1_COMPONENTS.join(', ')}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const result = resolveFromTier1(componentName);
|
|
155
|
+
return {
|
|
156
|
+
success: result.success,
|
|
157
|
+
code: result.code,
|
|
158
|
+
source: result.source,
|
|
159
|
+
error: result.error,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Tier 2 강제
|
|
163
|
+
if (tier === 'tier2') {
|
|
164
|
+
const result = await resolveFromTier2(componentName, description);
|
|
165
|
+
return {
|
|
166
|
+
success: result.success,
|
|
167
|
+
code: result.code,
|
|
168
|
+
source: result.success
|
|
169
|
+
? process.env.ANTHROPIC_API_KEY
|
|
170
|
+
? 'tier2-llm'
|
|
171
|
+
: 'tier2-mock'
|
|
172
|
+
: undefined,
|
|
173
|
+
error: result.error,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Auto: Tier 1 먼저 시도, 없으면 Tier 2
|
|
177
|
+
if (isTier1Component(componentName)) {
|
|
178
|
+
const result = resolveFromTier1(componentName);
|
|
179
|
+
if (result.success) {
|
|
180
|
+
return {
|
|
181
|
+
success: true,
|
|
182
|
+
code: result.code,
|
|
183
|
+
source: result.source,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Fallback to Tier 2
|
|
188
|
+
const tier2Result = await resolveFromTier2(componentName, description);
|
|
189
|
+
return {
|
|
190
|
+
success: tier2Result.success,
|
|
191
|
+
code: tier2Result.code,
|
|
192
|
+
source: tier2Result.success
|
|
193
|
+
? process.env.ANTHROPIC_API_KEY
|
|
194
|
+
? 'tier2-llm'
|
|
195
|
+
: 'tier2-mock'
|
|
196
|
+
: undefined,
|
|
197
|
+
error: tier2Result.error,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Blueprint에서 사용된 컴포넌트 타입 추출
|
|
202
|
+
*/
|
|
203
|
+
function extractComponentTypes(blueprint) {
|
|
204
|
+
const types = new Set();
|
|
205
|
+
function traverse(node) {
|
|
206
|
+
if (node.type) {
|
|
207
|
+
types.add(node.type);
|
|
208
|
+
}
|
|
209
|
+
if (Array.isArray(node.children)) {
|
|
210
|
+
for (const child of node.children) {
|
|
211
|
+
if (typeof child === 'object' && child !== null) {
|
|
212
|
+
traverse(child);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
for (const component of blueprint.components || []) {
|
|
218
|
+
traverse(component);
|
|
219
|
+
}
|
|
220
|
+
return Array.from(types);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Hybrid Export MCP Tool
|
|
224
|
+
* SPEC-COMPONENT-001-D: Hybrid Export System
|
|
225
|
+
*
|
|
226
|
+
* 기능:
|
|
227
|
+
* - Tier 1/2 자동 라우팅
|
|
228
|
+
* - CSS Variables 생성
|
|
229
|
+
* - 컴포넌트 코드 + CSS 통합 출력
|
|
230
|
+
*
|
|
231
|
+
* @param input - Hybrid export 입력
|
|
232
|
+
* @returns Hybrid export 결과
|
|
233
|
+
*/
|
|
234
|
+
export async function hybridExportTool(input) {
|
|
235
|
+
try {
|
|
236
|
+
const { blueprint, componentName, componentDescription, format, includeCSS = false, tier = 'auto', themeId, } = input;
|
|
237
|
+
// 결과 객체
|
|
238
|
+
const result = {
|
|
239
|
+
success: true,
|
|
240
|
+
components: [],
|
|
241
|
+
};
|
|
242
|
+
// CSS 생성 (요청된 경우)
|
|
243
|
+
if (includeCSS && themeId) {
|
|
244
|
+
try {
|
|
245
|
+
const theme = loadTheme(themeId);
|
|
246
|
+
if (theme) {
|
|
247
|
+
const cssResult = generateCSS(theme);
|
|
248
|
+
if (cssResult.success && cssResult.css) {
|
|
249
|
+
result.css = cssResult.css;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (cssError) {
|
|
254
|
+
// CSS 생성 실패는 경고만 (전체 실패 아님)
|
|
255
|
+
console.warn(`[Hybrid Export] CSS generation failed for theme ${themeId}:`, cssError);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// 단일 컴포넌트 요청
|
|
259
|
+
if (componentName && !blueprint) {
|
|
260
|
+
const resolution = await resolveComponent(componentName, tier, componentDescription);
|
|
261
|
+
if (!resolution.success) {
|
|
262
|
+
return {
|
|
263
|
+
success: false,
|
|
264
|
+
error: resolution.error || `Failed to resolve component: ${componentName}`,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
let finalCode = resolution.code || '';
|
|
268
|
+
// 포맷 변환
|
|
269
|
+
if (format === 'tsx' && finalCode) {
|
|
270
|
+
finalCode = convertToTSX(finalCode);
|
|
271
|
+
}
|
|
272
|
+
else if (format === 'vue' && finalCode) {
|
|
273
|
+
finalCode = convertToVue(finalCode, componentName);
|
|
274
|
+
}
|
|
275
|
+
result.code = finalCode;
|
|
276
|
+
result.tierUsed = isTier1Component(componentName) && tier !== 'tier2' ? 'tier1' : 'tier2';
|
|
277
|
+
result.components = [
|
|
278
|
+
{
|
|
279
|
+
componentName,
|
|
280
|
+
code: resolution.code || '',
|
|
281
|
+
source: resolution.source || 'tier1-example',
|
|
282
|
+
},
|
|
283
|
+
];
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
// Blueprint 기반 export
|
|
287
|
+
if (blueprint) {
|
|
288
|
+
let bp = blueprint;
|
|
289
|
+
// SPEC-MCP-004 Phase 4: Apply theme recipes if themeId exists
|
|
290
|
+
if ((bp.themeId || themeId) && bp.components) {
|
|
291
|
+
const targetThemeId = bp.themeId || themeId;
|
|
292
|
+
const componentsWithRecipes = applyRecipesToBlueprint(bp.components, targetThemeId);
|
|
293
|
+
bp = {
|
|
294
|
+
...bp,
|
|
295
|
+
components: componentsWithRecipes,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// 기존 exportScreenTool 로직 사용
|
|
299
|
+
const renderResult = render(bp);
|
|
300
|
+
if (!renderResult.success) {
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
error: `Render failed: ${renderResult.error || 'Unknown error'}`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
let finalCode = renderResult.code || '';
|
|
307
|
+
// 포맷 변환
|
|
308
|
+
if (format === 'tsx' && finalCode) {
|
|
309
|
+
finalCode = convertToTSX(finalCode);
|
|
310
|
+
}
|
|
311
|
+
else if (format === 'vue' && finalCode) {
|
|
312
|
+
finalCode = convertToVue(finalCode, extractComponentName(bp.name || 'Component'));
|
|
313
|
+
}
|
|
314
|
+
result.code = finalCode;
|
|
315
|
+
result.tierUsed = 'tier1'; // Blueprint render는 Tier 1
|
|
316
|
+
// Blueprint에서 사용된 컴포넌트 정보 추가
|
|
317
|
+
const componentTypes = extractComponentTypes(bp);
|
|
318
|
+
result.components = componentTypes.map(type => ({
|
|
319
|
+
componentName: type,
|
|
320
|
+
code: '', // Blueprint render는 통합된 코드 반환
|
|
321
|
+
source: 'tier1-example',
|
|
322
|
+
}));
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
// 입력 없음
|
|
326
|
+
return {
|
|
327
|
+
success: false,
|
|
328
|
+
error: 'Either blueprint or componentName is required',
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
return {
|
|
333
|
+
success: false,
|
|
334
|
+
error: extractErrorMessage(error),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* 사용 가능한 Tier 1 컴포넌트 목록 조회
|
|
340
|
+
*/
|
|
341
|
+
export function getAvailableTier1Components() {
|
|
342
|
+
return TIER1_COMPONENTS;
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=export-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-screen.js","sourceRoot":"","sources":["../../src/tools/export-screen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Blueprint MCP Tool
|
|
3
|
+
* SPEC-MCP-002: E-001 Blueprint Generation Request
|
|
4
|
+
* SPEC-MCP-004 Phase 3: Enhanced with Template Matching
|
|
5
|
+
*/
|
|
6
|
+
import type { GenerateBlueprintInput, GenerateBlueprintOutput } from '../schemas/mcp-schemas.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate blueprint MCP tool implementation
|
|
9
|
+
* SPEC: E-001 Blueprint Generation Request
|
|
10
|
+
*
|
|
11
|
+
* @param input - Blueprint generation parameters
|
|
12
|
+
* @returns Generated blueprint (MCP JSON-RPC format - no preview URL)
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateBlueprintTool(input: GenerateBlueprintInput): Promise<GenerateBlueprintOutput>;
|
|
15
|
+
//# sourceMappingURL=generate-blueprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-blueprint.d.ts","sourceRoot":"","sources":["../../src/tools/generate-blueprint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EAExB,MAAM,2BAA2B,CAAC;AA6FnC;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAsFlC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Blueprint MCP Tool
|
|
3
|
+
* SPEC-MCP-002: E-001 Blueprint Generation Request
|
|
4
|
+
* SPEC-MCP-004 Phase 3: Enhanced with Template Matching
|
|
5
|
+
*/
|
|
6
|
+
import { createBlueprint, validateBlueprint, loadTheme, listThemes, COMPONENT_CATALOG, iconLibraryExists, listIconLibraries, } from '@tekton-ui/core';
|
|
7
|
+
import { getDefaultStorage } from '../storage/blueprint-storage.js';
|
|
8
|
+
import { createThemeNotFoundError, createValidationError, extractErrorMessage, } from '../utils/error-handler.js';
|
|
9
|
+
import { matchTemplates } from '../data/template-matcher.js';
|
|
10
|
+
/**
|
|
11
|
+
* Parse natural language description to extract component hints
|
|
12
|
+
* Initial implementation: Simple keyword extraction
|
|
13
|
+
* TODO: Enhance with LLM-based parsing in future iterations
|
|
14
|
+
*/
|
|
15
|
+
function parseDescriptionToComponents(description, componentHints) {
|
|
16
|
+
const lowerDesc = description.toLowerCase();
|
|
17
|
+
const components = [];
|
|
18
|
+
// If component hints provided, use them first
|
|
19
|
+
if (componentHints && componentHints.length > 0) {
|
|
20
|
+
for (const hint of componentHints) {
|
|
21
|
+
if (COMPONENT_CATALOG.includes(hint)) {
|
|
22
|
+
components.push({
|
|
23
|
+
type: hint,
|
|
24
|
+
slot: 'main',
|
|
25
|
+
children: [],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Keyword-based component detection (fallback)
|
|
31
|
+
if (components.length === 0) {
|
|
32
|
+
const componentKeywords = {
|
|
33
|
+
Card: ['card', 'panel', 'container'],
|
|
34
|
+
Button: ['button', 'cta', 'action'],
|
|
35
|
+
Avatar: ['avatar', 'profile picture', 'user icon'],
|
|
36
|
+
Text: ['text', 'paragraph', 'description', 'bio'],
|
|
37
|
+
Heading: ['title', 'heading', 'header'],
|
|
38
|
+
Input: ['input', 'field', 'textbox'],
|
|
39
|
+
Form: ['form', 'signup', 'login'],
|
|
40
|
+
Image: ['image', 'photo', 'picture'],
|
|
41
|
+
Link: ['link', 'anchor'],
|
|
42
|
+
List: ['list', 'items'],
|
|
43
|
+
Table: ['table', 'grid', 'data'],
|
|
44
|
+
Modal: ['modal', 'dialog', 'popup'],
|
|
45
|
+
Tabs: ['tabs', 'tabbed'],
|
|
46
|
+
Badge: ['badge', 'tag', 'label'],
|
|
47
|
+
Dropdown: ['dropdown', 'select', 'menu'],
|
|
48
|
+
};
|
|
49
|
+
for (const [componentType, keywords] of Object.entries(componentKeywords)) {
|
|
50
|
+
if (keywords.some(kw => lowerDesc.includes(kw))) {
|
|
51
|
+
components.push({
|
|
52
|
+
type: componentType,
|
|
53
|
+
slot: 'main',
|
|
54
|
+
children: [],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Default: Add at least one Card if no components detected
|
|
60
|
+
if (components.length === 0) {
|
|
61
|
+
components.push({
|
|
62
|
+
type: 'Card',
|
|
63
|
+
slot: 'main',
|
|
64
|
+
children: [
|
|
65
|
+
{
|
|
66
|
+
type: 'Text',
|
|
67
|
+
children: ['Generated content'],
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return components;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract screen name from description
|
|
76
|
+
*/
|
|
77
|
+
function extractNameFromDescription(description) {
|
|
78
|
+
// Simple implementation: Use first 50 chars or first sentence
|
|
79
|
+
const firstSentence = description.split(/[.!?]/)[0];
|
|
80
|
+
return firstSentence?.substring(0, 50) || 'Generated Screen';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate blueprint MCP tool implementation
|
|
84
|
+
* SPEC: E-001 Blueprint Generation Request
|
|
85
|
+
*
|
|
86
|
+
* @param input - Blueprint generation parameters
|
|
87
|
+
* @returns Generated blueprint (MCP JSON-RPC format - no preview URL)
|
|
88
|
+
*/
|
|
89
|
+
export async function generateBlueprintTool(input) {
|
|
90
|
+
try {
|
|
91
|
+
// SPEC: U-005 Theme Validation - Validate theme ID exists
|
|
92
|
+
const theme = loadTheme(input.themeId);
|
|
93
|
+
if (!theme) {
|
|
94
|
+
const availableThemes = listThemes().map((t) => t.id);
|
|
95
|
+
return createThemeNotFoundError(input.themeId, availableThemes);
|
|
96
|
+
}
|
|
97
|
+
// SPEC-ICON-001: Validate icon library exists (if provided)
|
|
98
|
+
if (input.iconLibrary && !iconLibraryExists(input.iconLibrary)) {
|
|
99
|
+
const availableLibraries = listIconLibraries().map((lib) => lib.id);
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
error: `Icon library "${input.iconLibrary}" not found. Available libraries: ${availableLibraries.join(', ')}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Parse description to generate components
|
|
106
|
+
const components = parseDescriptionToComponents(input.description, input.componentHints);
|
|
107
|
+
// Extract name from description
|
|
108
|
+
const name = extractNameFromDescription(input.description);
|
|
109
|
+
// Generate timestamp for blueprint ID
|
|
110
|
+
const timestamp = Date.now();
|
|
111
|
+
// SPEC: U-003 @tekton-ui/core Integration - Use createBlueprint from @tekton-ui/core
|
|
112
|
+
const blueprint = createBlueprint({
|
|
113
|
+
name,
|
|
114
|
+
themeId: input.themeId,
|
|
115
|
+
layout: input.layout,
|
|
116
|
+
components,
|
|
117
|
+
});
|
|
118
|
+
// Add timestamp to blueprint
|
|
119
|
+
const blueprintWithTimestamp = {
|
|
120
|
+
...blueprint,
|
|
121
|
+
timestamp,
|
|
122
|
+
};
|
|
123
|
+
// SPEC: U-003 @tekton-ui/core Integration - Use validateBlueprint from @tekton-ui/core
|
|
124
|
+
const validation = validateBlueprint(blueprint);
|
|
125
|
+
// SPEC: S-003 Blueprint Validation Result - Return errors without saving if invalid
|
|
126
|
+
if (!validation.valid) {
|
|
127
|
+
return createValidationError(validation.errors);
|
|
128
|
+
}
|
|
129
|
+
// SPEC: S-003 Blueprint Validation Result - Save blueprint if valid
|
|
130
|
+
const storage = getDefaultStorage();
|
|
131
|
+
const blueprintId = await storage.saveBlueprint(blueprintWithTimestamp);
|
|
132
|
+
// SPEC-MCP-004 Phase 3: Match templates based on description
|
|
133
|
+
const templateMatches = matchTemplates(input.description, 3);
|
|
134
|
+
const templateRecommendations = templateMatches.map(match => ({
|
|
135
|
+
templateId: match.templateId,
|
|
136
|
+
templateName: match.templateName,
|
|
137
|
+
category: match.category,
|
|
138
|
+
confidence: match.confidence,
|
|
139
|
+
matchedKeywords: match.matchedKeywords,
|
|
140
|
+
layoutRecommendation: match.layoutRecommendation,
|
|
141
|
+
}));
|
|
142
|
+
// MCP JSON-RPC format: Return blueprint data with template recommendations
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
blueprint: {
|
|
146
|
+
id: blueprintId,
|
|
147
|
+
name: blueprint.name,
|
|
148
|
+
themeId: blueprint.themeId,
|
|
149
|
+
iconLibrary: input.iconLibrary || 'lucide', // Default to lucide
|
|
150
|
+
layout: blueprint.layout,
|
|
151
|
+
components: blueprint.components,
|
|
152
|
+
timestamp,
|
|
153
|
+
},
|
|
154
|
+
// SPEC-MCP-004: Include template recommendations for LLM guidance
|
|
155
|
+
templateRecommendations: templateRecommendations.length > 0 ? templateRecommendations : undefined,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
error: extractErrorMessage(error),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=generate-blueprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-blueprint.js","sourceRoot":"","sources":["../../src/tools/generate-blueprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Screen MCP Tool
|
|
3
|
+
* SPEC-LAYOUT-002 Phase 4: Generate production code from JSON screen definition
|
|
4
|
+
*/
|
|
5
|
+
import type { GenerateScreenInput, GenerateScreenOutput } from '../schemas/mcp-schemas.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate production-ready code from JSON screen definition
|
|
8
|
+
*
|
|
9
|
+
* @param input - Screen definition and generation options
|
|
10
|
+
* @returns Generated code with CSS variables and validation errors
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateScreenTool(input: GenerateScreenInput): Promise<GenerateScreenOutput>;
|
|
13
|
+
//# sourceMappingURL=generate-screen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-screen.d.ts","sourceRoot":"","sources":["../../src/tools/generate-screen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAI3F;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAkF/B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Screen MCP Tool
|
|
3
|
+
* SPEC-LAYOUT-002 Phase 4: Generate production code from JSON screen definition
|
|
4
|
+
*/
|
|
5
|
+
import { extractErrorMessage } from '../utils/error-handler.js';
|
|
6
|
+
import { extractDependencies } from '../utils/dependency-extractor.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate production-ready code from JSON screen definition
|
|
9
|
+
*
|
|
10
|
+
* @param input - Screen definition and generation options
|
|
11
|
+
* @returns Generated code with CSS variables and validation errors
|
|
12
|
+
*/
|
|
13
|
+
export async function generateScreenTool(input) {
|
|
14
|
+
try {
|
|
15
|
+
const { screenDefinition, outputFormat, options } = input;
|
|
16
|
+
// Step 1: Validate screen definition
|
|
17
|
+
const { validateScreenDefinition } = await import('@tekton-ui/core');
|
|
18
|
+
const validation = validateScreenDefinition(screenDefinition);
|
|
19
|
+
if (!validation.valid) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
errors: validation.errors || ['Invalid screen definition'],
|
|
23
|
+
error: 'Screen definition validation failed',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Step 2: Resolve screen with layout and components
|
|
27
|
+
const { resolveScreen } = await import('@tekton-ui/core');
|
|
28
|
+
const resolvedScreen = await resolveScreen(screenDefinition);
|
|
29
|
+
// Step 3: Prepare generator options
|
|
30
|
+
const generatorOptions = {
|
|
31
|
+
format: (options?.typescript !== false ? 'typescript' : 'javascript'),
|
|
32
|
+
prettier: options?.prettier ?? false,
|
|
33
|
+
};
|
|
34
|
+
// Step 4: Generate code based on output format
|
|
35
|
+
let code;
|
|
36
|
+
const cssVariables = undefined;
|
|
37
|
+
switch (outputFormat) {
|
|
38
|
+
case 'css-in-js': {
|
|
39
|
+
const { generateStyledComponents } = await import('@tekton-ui/core');
|
|
40
|
+
const cssFramework = options?.cssFramework || 'styled-components';
|
|
41
|
+
const result = generateStyledComponents(resolvedScreen, cssFramework, generatorOptions);
|
|
42
|
+
code = result.code;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'tailwind': {
|
|
46
|
+
const { generateTailwindClasses } = await import('@tekton-ui/core');
|
|
47
|
+
const result = generateTailwindClasses(resolvedScreen, generatorOptions);
|
|
48
|
+
code = result.code;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'react': {
|
|
52
|
+
const { generateReactComponent } = await import('@tekton-ui/core');
|
|
53
|
+
const result = generateReactComponent(resolvedScreen, generatorOptions);
|
|
54
|
+
code = result.code;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
default:
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: `Unsupported output format: ${outputFormat}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Note: CSS variables generation is optional and depends on theme resolution
|
|
64
|
+
// For now, we return the generated code without separate CSS variables
|
|
65
|
+
// Future enhancement: Extract CSS variables from resolved screen
|
|
66
|
+
// Extract dependencies from generated code
|
|
67
|
+
const dependencies = extractDependencies(code);
|
|
68
|
+
return {
|
|
69
|
+
success: true,
|
|
70
|
+
code,
|
|
71
|
+
cssVariables,
|
|
72
|
+
dependencies,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: extractErrorMessage(error),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=generate-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-screen.js","sourceRoot":"","sources":["../../src/tools/generate-screen.ts"],"names":[],"mappings":"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"}
|