@tekton-ui/mcp-server 0.3.0 → 0.3.2
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 +98 -51
- package/dist/auth/theme-access.d.ts +1 -1
- package/dist/auth/theme-access.d.ts.map +1 -1
- package/dist/auth/theme-access.js +7 -14
- package/dist/auth/theme-access.js.map +1 -1
- 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 +330 -0
- package/dist/cli/agent-md-templates.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 +197 -0
- package/dist/cli/guide-template.js.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- 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/index.js +39 -1
- package/dist/index.js.map +1 -1
- 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 +94 -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 +228 -0
- package/dist/prompts/screen-workflow.js.map +1 -0
- package/dist/schemas/mcp-schemas.d.ts +369 -369
- package/dist/schemas/mcp-schemas.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TEKTON-GUIDE.md 콘텐츠 템플릿
|
|
3
|
+
* 프레임워크별 맞춤 가이드 생성
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* TEKTON-GUIDE.md 콘텐츠 생성
|
|
7
|
+
*/
|
|
8
|
+
export function generateGuide(framework) {
|
|
9
|
+
const importExample = framework === 'nextjs'
|
|
10
|
+
? `// app/page.tsx
|
|
11
|
+
import { Button, Card, CardHeader, CardTitle, CardContent } from '@tekton-ui/ui';
|
|
12
|
+
|
|
13
|
+
export default function HomePage() {
|
|
14
|
+
return (
|
|
15
|
+
<Card>
|
|
16
|
+
<CardHeader>
|
|
17
|
+
<CardTitle>Welcome</CardTitle>
|
|
18
|
+
</CardHeader>
|
|
19
|
+
<CardContent>
|
|
20
|
+
<Button variant="default" size="lg">Get Started</Button>
|
|
21
|
+
</CardContent>
|
|
22
|
+
</Card>
|
|
23
|
+
);
|
|
24
|
+
}`
|
|
25
|
+
: `// src/App.tsx
|
|
26
|
+
import { Button, Card, CardHeader, CardTitle, CardContent } from '@tekton-ui/ui';
|
|
27
|
+
|
|
28
|
+
function App() {
|
|
29
|
+
return (
|
|
30
|
+
<Card>
|
|
31
|
+
<CardHeader>
|
|
32
|
+
<CardTitle>Welcome</CardTitle>
|
|
33
|
+
</CardHeader>
|
|
34
|
+
<CardContent>
|
|
35
|
+
<Button variant="default" size="lg">Get Started</Button>
|
|
36
|
+
</CardContent>
|
|
37
|
+
</Card>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default App;`;
|
|
42
|
+
return `# Tekton UI Guide
|
|
43
|
+
|
|
44
|
+
> AI-powered design system for building production-ready UIs.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Authentication
|
|
49
|
+
|
|
50
|
+
Before generating screens, authenticate with your Tekton account:
|
|
51
|
+
|
|
52
|
+
\`\`\`bash
|
|
53
|
+
tekton-mcp login
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
This opens your browser for OAuth authentication. Your credentials are stored in \`~/.tekton/credentials.json\`.
|
|
57
|
+
|
|
58
|
+
**Why authentication is required:**
|
|
59
|
+
- All 6 themes require valid licenses
|
|
60
|
+
- No free themes are available
|
|
61
|
+
- Authentication verifies your license status
|
|
62
|
+
|
|
63
|
+
**Check your authentication status:**
|
|
64
|
+
|
|
65
|
+
\`\`\`bash
|
|
66
|
+
tekton-mcp status
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Screen Generation Workflow
|
|
72
|
+
|
|
73
|
+
Tekton provides a **4-step workflow** for production-ready screen generation:
|
|
74
|
+
|
|
75
|
+
### Step 1/4: Get Context
|
|
76
|
+
|
|
77
|
+
Claude Code calls \`get-screen-generation-context\` with your screen description:
|
|
78
|
+
|
|
79
|
+
\`\`\`
|
|
80
|
+
"Create a user dashboard with profile card and recent activity"
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
Returns: Template matches, component suggestions, Screen Definition schema
|
|
84
|
+
|
|
85
|
+
### Step 2/4: Validate Definition
|
|
86
|
+
|
|
87
|
+
Claude Code generates a Screen Definition JSON and calls \`validate-screen-definition\`:
|
|
88
|
+
|
|
89
|
+
Returns: Validation results, errors (if any), improvement suggestions
|
|
90
|
+
|
|
91
|
+
### Step 3/4: Generate Code
|
|
92
|
+
|
|
93
|
+
Claude Code calls \`generate_screen\` with the validated definition:
|
|
94
|
+
|
|
95
|
+
Returns: Production React code, CSS variables, dependencies list
|
|
96
|
+
|
|
97
|
+
### Step 4/4: Validate Environment
|
|
98
|
+
|
|
99
|
+
Claude Code calls \`validate-environment\` to check your project:
|
|
100
|
+
|
|
101
|
+
Returns: Missing packages, install commands, Tailwind CSS config validation
|
|
102
|
+
|
|
103
|
+
**Important:** Always check the dependencies and Tailwind configuration before running generated code.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Quick Start
|
|
108
|
+
|
|
109
|
+
### Using Components
|
|
110
|
+
|
|
111
|
+
\`\`\`tsx
|
|
112
|
+
${importExample}
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
### AI Screen Generation
|
|
116
|
+
|
|
117
|
+
Claude Code에서 MCP 서버가 연결되어 있으면, 자연어로 화면을 생성할 수 있습니다:
|
|
118
|
+
|
|
119
|
+
\`\`\`
|
|
120
|
+
"로그인 화면 만들어줘"
|
|
121
|
+
"대시보드 페이지를 카드 레이아웃으로 만들어줘"
|
|
122
|
+
"사용자 프로필 페이지를 만들어줘"
|
|
123
|
+
\`\`\`
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Components (30+)
|
|
128
|
+
|
|
129
|
+
### Core
|
|
130
|
+
Button, Input, Label, Card, Badge, Avatar, Separator, Checkbox, RadioGroup, Switch, Textarea, Skeleton, ScrollArea, Select, Progress
|
|
131
|
+
|
|
132
|
+
### Complex
|
|
133
|
+
Dialog, DropdownMenu, Table, Tabs, Toast, Tooltip, Popover, Sheet, AlertDialog, NavigationMenu
|
|
134
|
+
|
|
135
|
+
### Advanced
|
|
136
|
+
Sidebar, Breadcrumb, Command, Calendar, Form
|
|
137
|
+
|
|
138
|
+
### Usage
|
|
139
|
+
|
|
140
|
+
\`\`\`tsx
|
|
141
|
+
import { Button, Dialog, DialogTrigger, DialogContent } from '@tekton-ui/ui';
|
|
142
|
+
\`\`\`
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Screen Templates (13)
|
|
147
|
+
|
|
148
|
+
프로덕션에서 바로 사용할 수 있는 완성된 화면 템플릿:
|
|
149
|
+
|
|
150
|
+
| Category | Templates |
|
|
151
|
+
|----------|-----------|
|
|
152
|
+
| Auth | Login, Signup, ForgotPassword, Verification |
|
|
153
|
+
| Core | Landing, Preferences, Profile |
|
|
154
|
+
| Feedback | Loading, Error, Empty, Confirmation, Success |
|
|
155
|
+
| Dashboard | Dashboard |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Themes (6)
|
|
160
|
+
|
|
161
|
+
| Theme ID | Description |
|
|
162
|
+
|----------|-------------|
|
|
163
|
+
| \`classic-magazine\` | Classic magazine style |
|
|
164
|
+
| \`equinox-fitness\` | Fitness & wellness |
|
|
165
|
+
| \`minimal-workspace\` | Minimal workspace |
|
|
166
|
+
| \`neutral-humanism\` | Neutral humanism |
|
|
167
|
+
| \`round-minimal\` | Round minimal |
|
|
168
|
+
| \`square-minimalism\` | Square minimalism |
|
|
169
|
+
|
|
170
|
+
### Applying a Theme
|
|
171
|
+
|
|
172
|
+
\`\`\`tsx
|
|
173
|
+
import { themeToCSS, injectThemeCSS } from '@tekton-ui/ui';
|
|
174
|
+
|
|
175
|
+
// Inject theme CSS at runtime
|
|
176
|
+
injectThemeCSS(themeData);
|
|
177
|
+
\`\`\`
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Utility: cn()
|
|
182
|
+
|
|
183
|
+
\`\`\`tsx
|
|
184
|
+
import { cn } from '@tekton-ui/ui';
|
|
185
|
+
|
|
186
|
+
<div className={cn('p-4 bg-white', isActive && 'bg-blue-500', className)} />
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Links
|
|
192
|
+
|
|
193
|
+
- [npm: @tekton-ui/ui](https://www.npmjs.com/package/@tekton-ui/ui)
|
|
194
|
+
- [npm: @tekton-ui/mcp-server](https://www.npmjs.com/package/@tekton-ui/mcp-server)
|
|
195
|
+
`;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=guide-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide-template.js","sourceRoot":"","sources":["../../src/cli/guide-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAoB;IAChD,MAAM,aAAa,GACjB,SAAS,KAAK,QAAQ;QACpB,CAAC,CAAC;;;;;;;;;;;;;;EAcN;QACI,CAAC,CAAC;;;;;;;;;;;;;;;;oBAgBY,CAAC;IAEnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEP,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFd,CAAC;AACF,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -26,6 +26,11 @@ switch (command) {
|
|
|
26
26
|
statusCommand();
|
|
27
27
|
break;
|
|
28
28
|
}
|
|
29
|
+
case 'init': {
|
|
30
|
+
const { initCommand } = await import('./init.js');
|
|
31
|
+
await initCommand();
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
29
34
|
default: {
|
|
30
35
|
// 서브커맨드 없음 → MCP stdio 서버 시작 (기존 동작 유지)
|
|
31
36
|
await import('../index.js');
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAIH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;QACR,wCAAwC;QACxC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM;IACR,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAIH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM;IACR,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;QACR,wCAAwC;QACxC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM;IACR,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2SH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkFjD"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tekton-mcp init 명령어
|
|
3
|
+
* 프로젝트에 Tekton UI 디자인 시스템을 한 줄로 설정
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import readline from 'node:readline';
|
|
9
|
+
import { generateGuide } from './guide-template.js';
|
|
10
|
+
import { generateClaudeMdSection, generateAgentsMdSection } from './agent-md-templates.js';
|
|
11
|
+
// ─── 상수 ──────────────────────────────────────────────
|
|
12
|
+
const TEKTON_UI_CONTENT_PATH = './node_modules/@tekton-ui/ui/dist/**/*.{js,mjs}';
|
|
13
|
+
const TEKTON_STYLE_IMPORT = "@import '@tekton-ui/ui/styles';";
|
|
14
|
+
const PACKAGES_TO_INSTALL = ['@tekton-ui/ui', 'tailwindcss-animate'];
|
|
15
|
+
// ─── 유틸리티 ──────────────────────────────────────────
|
|
16
|
+
function log(step, total, message) {
|
|
17
|
+
console.log(`\n[${step}/${total}] ${message}`);
|
|
18
|
+
}
|
|
19
|
+
function logDetail(message) {
|
|
20
|
+
console.log(` ${message}`);
|
|
21
|
+
}
|
|
22
|
+
function fileExists(filePath) {
|
|
23
|
+
return fs.existsSync(filePath);
|
|
24
|
+
}
|
|
25
|
+
function findFile(dir, candidates) {
|
|
26
|
+
return candidates.find(c => fileExists(path.join(dir, c)));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* stdin에서 사용자 선택을 받음
|
|
30
|
+
*/
|
|
31
|
+
async function askUser(question, options) {
|
|
32
|
+
const rl = readline.createInterface({
|
|
33
|
+
input: process.stdin,
|
|
34
|
+
output: process.stdout,
|
|
35
|
+
});
|
|
36
|
+
const prompt = options.map((opt, i) => ` ${i + 1}) ${opt}`).join('\n');
|
|
37
|
+
return new Promise(resolve => {
|
|
38
|
+
rl.question(`${question}\n${prompt}\n> `, answer => {
|
|
39
|
+
rl.close();
|
|
40
|
+
const index = parseInt(answer, 10) - 1;
|
|
41
|
+
const selected = options[index];
|
|
42
|
+
resolve(selected ?? options[0]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// ─── Step 1: 프로젝트 감지 ─────────────────────────────
|
|
47
|
+
function detectFramework(cwd) {
|
|
48
|
+
const nextConfigs = ['next.config.ts', 'next.config.js', 'next.config.mjs'];
|
|
49
|
+
const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];
|
|
50
|
+
if (findFile(cwd, nextConfigs)) {
|
|
51
|
+
return 'nextjs';
|
|
52
|
+
}
|
|
53
|
+
if (findFile(cwd, viteConfigs)) {
|
|
54
|
+
return 'vite';
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function detectPackageManager(cwd) {
|
|
59
|
+
if (fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {
|
|
60
|
+
return 'pnpm';
|
|
61
|
+
}
|
|
62
|
+
if (fileExists(path.join(cwd, 'yarn.lock'))) {
|
|
63
|
+
return 'yarn';
|
|
64
|
+
}
|
|
65
|
+
if (fileExists(path.join(cwd, 'bun.lock')) || fileExists(path.join(cwd, 'bun.lockb'))) {
|
|
66
|
+
return 'bun';
|
|
67
|
+
}
|
|
68
|
+
return 'npm';
|
|
69
|
+
}
|
|
70
|
+
function installPackages(cwd, pm) {
|
|
71
|
+
const cmd = `${pm} add ${PACKAGES_TO_INSTALL.join(' ')}`;
|
|
72
|
+
logDetail(cmd);
|
|
73
|
+
execSync(cmd, { cwd, stdio: 'inherit' });
|
|
74
|
+
}
|
|
75
|
+
// ─── Step 3: Tailwind CSS 설정 ──────────────────────────
|
|
76
|
+
const TAILWIND_CONFIG_CANDIDATES = [
|
|
77
|
+
'tailwind.config.ts',
|
|
78
|
+
'tailwind.config.js',
|
|
79
|
+
'tailwind.config.mjs',
|
|
80
|
+
'tailwind.config.cjs',
|
|
81
|
+
];
|
|
82
|
+
function setupTailwind(cwd) {
|
|
83
|
+
const configName = findFile(cwd, TAILWIND_CONFIG_CANDIDATES);
|
|
84
|
+
if (configName) {
|
|
85
|
+
// 기존 파일 수정
|
|
86
|
+
const configPath = path.join(cwd, configName);
|
|
87
|
+
let content = fs.readFileSync(configPath, 'utf-8');
|
|
88
|
+
// content 배열에 @tekton-ui/ui 경로 추가
|
|
89
|
+
if (!content.includes('@tekton-ui/ui')) {
|
|
90
|
+
content = content.replace(/(content\s*:\s*\[)/, `$1\n '${TEKTON_UI_CONTENT_PATH}',`);
|
|
91
|
+
}
|
|
92
|
+
// plugins에 tailwindcss-animate 추가
|
|
93
|
+
if (!content.includes('tailwindcss-animate')) {
|
|
94
|
+
// plugins 배열이 있는 경우
|
|
95
|
+
if (/plugins\s*:\s*\[/.test(content)) {
|
|
96
|
+
content = content.replace(/(plugins\s*:\s*\[)/, `$1\n require('tailwindcss-animate'),`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// plugins가 없으면 content 닫는 ] 뒤에 추가
|
|
100
|
+
content = content.replace(/(content\s*:\s*\[[\s\S]*?\]\s*,?)/, `$1\n plugins: [require('tailwindcss-animate')],`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
104
|
+
logDetail(`${configName} 업데이트 완료`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// 새 파일 생성
|
|
108
|
+
const template = `import type { Config } from 'tailwindcss';
|
|
109
|
+
|
|
110
|
+
const config: Config = {
|
|
111
|
+
content: [
|
|
112
|
+
'./app/**/*.{js,ts,jsx,tsx}',
|
|
113
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
114
|
+
'./components/**/*.{js,ts,jsx,tsx}',
|
|
115
|
+
'${TEKTON_UI_CONTENT_PATH}',
|
|
116
|
+
],
|
|
117
|
+
plugins: [require('tailwindcss-animate')],
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export default config;
|
|
121
|
+
`;
|
|
122
|
+
fs.writeFileSync(path.join(cwd, 'tailwind.config.ts'), template, 'utf-8');
|
|
123
|
+
logDetail('tailwind.config.ts 생성 완료');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ─── Step 4: CSS 임포트 추가 ────────────────────────────
|
|
127
|
+
function setupCSS(cwd, framework) {
|
|
128
|
+
const candidates = framework === 'nextjs'
|
|
129
|
+
? ['app/globals.css', 'src/app/globals.css', 'styles/globals.css']
|
|
130
|
+
: ['src/index.css', 'src/main.css', 'index.css'];
|
|
131
|
+
const cssFile = findFile(cwd, candidates);
|
|
132
|
+
if (!cssFile) {
|
|
133
|
+
logDetail('CSS 파일을 찾을 수 없습니다. 수동으로 추가해 주세요:');
|
|
134
|
+
logDetail(` ${TEKTON_STYLE_IMPORT}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const cssPath = path.join(cwd, cssFile);
|
|
138
|
+
const content = fs.readFileSync(cssPath, 'utf-8');
|
|
139
|
+
if (content.includes(TEKTON_STYLE_IMPORT)) {
|
|
140
|
+
logDetail(`${cssFile} (이미 설정됨, skip)`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// 파일 상단에 import 추가
|
|
144
|
+
fs.writeFileSync(cssPath, `${TEKTON_STYLE_IMPORT}\n\n${content}`, 'utf-8');
|
|
145
|
+
logDetail(`${cssFile} 업데이트 완료`);
|
|
146
|
+
}
|
|
147
|
+
function setupMCP(cwd) {
|
|
148
|
+
const mcpPath = path.join(cwd, '.mcp.json');
|
|
149
|
+
const tektonServer = {
|
|
150
|
+
type: 'stdio',
|
|
151
|
+
command: 'npx',
|
|
152
|
+
args: ['-y', '@tekton-ui/mcp-server'],
|
|
153
|
+
};
|
|
154
|
+
if (fileExists(mcpPath)) {
|
|
155
|
+
// 기존 파일에 tekton 서버 추가
|
|
156
|
+
const raw = fs.readFileSync(mcpPath, 'utf-8');
|
|
157
|
+
const config = JSON.parse(raw);
|
|
158
|
+
if (!config.mcpServers) {
|
|
159
|
+
config.mcpServers = {};
|
|
160
|
+
}
|
|
161
|
+
if ('tekton' in config.mcpServers) {
|
|
162
|
+
logDetail('.mcp.json (이미 설정됨, skip)');
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
config.mcpServers['tekton'] = tektonServer;
|
|
166
|
+
fs.writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
167
|
+
logDetail('.mcp.json 업데이트 완료');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// 새 파일 생성
|
|
171
|
+
const config = {
|
|
172
|
+
mcpServers: {
|
|
173
|
+
tekton: tektonServer,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
fs.writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
177
|
+
logDetail('.mcp.json 생성 완료');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// ─── Step 6: 가이드 문서 생성 ──────────────────────────
|
|
181
|
+
function setupGuide(cwd, framework) {
|
|
182
|
+
const guidePath = path.join(cwd, 'TEKTON-GUIDE.md');
|
|
183
|
+
if (fileExists(guidePath)) {
|
|
184
|
+
logDetail('TEKTON-GUIDE.md (이미 존재함, skip)');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const content = generateGuide(framework);
|
|
188
|
+
fs.writeFileSync(guidePath, content, 'utf-8');
|
|
189
|
+
logDetail('TEKTON-GUIDE.md 생성 완료');
|
|
190
|
+
}
|
|
191
|
+
// ─── Step 7: CLAUDE.md / AGENTS.md 설정 ────────────────
|
|
192
|
+
function setupAgentMd(cwd, framework) {
|
|
193
|
+
// CLAUDE.md 섹션 추가 (기존 파일이 있으면 append, 없으면 생성)
|
|
194
|
+
const claudeMdPath = path.join(cwd, 'CLAUDE.md');
|
|
195
|
+
const claudeSection = generateClaudeMdSection(framework);
|
|
196
|
+
if (fileExists(claudeMdPath)) {
|
|
197
|
+
const existingContent = fs.readFileSync(claudeMdPath, 'utf-8');
|
|
198
|
+
if (existingContent.includes('## Tekton UI Workflow')) {
|
|
199
|
+
logDetail('CLAUDE.md (이미 Tekton 섹션 존재, skip)');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
fs.appendFileSync(claudeMdPath, `\n${claudeSection}`, 'utf-8');
|
|
203
|
+
logDetail('CLAUDE.md에 Tekton 섹션 추가 완료');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
fs.writeFileSync(claudeMdPath, `# Project Instructions\n${claudeSection}`, 'utf-8');
|
|
208
|
+
logDetail('CLAUDE.md 생성 완료');
|
|
209
|
+
}
|
|
210
|
+
// AGENTS.md 섹션 추가 (기존 파일이 있으면 append, 없으면 생성)
|
|
211
|
+
const agentsMdPath = path.join(cwd, 'AGENTS.md');
|
|
212
|
+
const agentsSection = generateAgentsMdSection(framework);
|
|
213
|
+
if (fileExists(agentsMdPath)) {
|
|
214
|
+
const existingContent = fs.readFileSync(agentsMdPath, 'utf-8');
|
|
215
|
+
if (existingContent.includes('## Tekton UI Workflow')) {
|
|
216
|
+
logDetail('AGENTS.md (이미 Tekton 섹션 존재, skip)');
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
fs.appendFileSync(agentsMdPath, `\n${agentsSection}`, 'utf-8');
|
|
220
|
+
logDetail('AGENTS.md에 Tekton 섹션 추가 완료');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
fs.writeFileSync(agentsMdPath, `# AI Agent Instructions\n${agentsSection}`, 'utf-8');
|
|
225
|
+
logDetail('AGENTS.md 생성 완료');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ─── Step 8: 완료 메시지 (인증 안내 강화) ─────────────────
|
|
229
|
+
function printSuccess() {
|
|
230
|
+
console.log(`
|
|
231
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
232
|
+
|
|
233
|
+
Tekton UI 설정 완료!
|
|
234
|
+
|
|
235
|
+
다음 단계:
|
|
236
|
+
1. 먼저 인증하세요: tekton-mcp login
|
|
237
|
+
2. Claude Code를 재시작하세요
|
|
238
|
+
3. AI에게 요청하세요: "로그인 화면 만들어줘"
|
|
239
|
+
4. TEKTON-GUIDE.md에서 전체 가이드를 확인하세요
|
|
240
|
+
|
|
241
|
+
중요: 모든 6개 테마는 인증이 필요합니다
|
|
242
|
+
|
|
243
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
244
|
+
}
|
|
245
|
+
// ─── 메인 ──────────────────────────────────────────────
|
|
246
|
+
export async function initCommand() {
|
|
247
|
+
const cwd = process.cwd();
|
|
248
|
+
const totalSteps = 8;
|
|
249
|
+
console.log('\n@tekton-ui/mcp-server init\n');
|
|
250
|
+
// package.json 확인
|
|
251
|
+
if (!fileExists(path.join(cwd, 'package.json'))) {
|
|
252
|
+
console.error('package.json을 찾을 수 없습니다. 프로젝트 루트에서 실행해 주세요.');
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
// Step 1: 프로젝트 감지
|
|
256
|
+
log(1, totalSteps, '프로젝트 감지 중...');
|
|
257
|
+
let framework = detectFramework(cwd);
|
|
258
|
+
if (!framework) {
|
|
259
|
+
const answer = await askUser('프로젝트 유형을 감지할 수 없습니다. 프레임워크를 선택해 주세요:', ['Next.js', 'Vite']);
|
|
260
|
+
framework = answer === 'Vite' ? 'vite' : 'nextjs';
|
|
261
|
+
}
|
|
262
|
+
const frameworkLabel = framework === 'nextjs' ? 'Next.js' : 'Vite';
|
|
263
|
+
logDetail(`${frameworkLabel} 프로젝트`);
|
|
264
|
+
// Step 2: 패키지 설치
|
|
265
|
+
log(2, totalSteps, '패키지 설치 중...');
|
|
266
|
+
const pm = detectPackageManager(cwd);
|
|
267
|
+
try {
|
|
268
|
+
installPackages(cwd, pm);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
console.error('패키지 설치에 실패했습니다. 수동으로 설치해 주세요:');
|
|
272
|
+
console.error(` ${pm} add ${PACKAGES_TO_INSTALL.join(' ')}`);
|
|
273
|
+
}
|
|
274
|
+
// Step 3: Tailwind CSS 설정
|
|
275
|
+
log(3, totalSteps, 'Tailwind CSS 설정 중...');
|
|
276
|
+
try {
|
|
277
|
+
setupTailwind(cwd);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
console.error('Tailwind CSS 설정에 실패했습니다. 수동으로 설정해 주세요.');
|
|
281
|
+
}
|
|
282
|
+
// Step 4: CSS 토큰 임포트
|
|
283
|
+
log(4, totalSteps, 'CSS 토큰 임포트 추가 중...');
|
|
284
|
+
try {
|
|
285
|
+
setupCSS(cwd, framework);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
console.error('CSS 설정에 실패했습니다. 수동으로 추가해 주세요:');
|
|
289
|
+
console.error(` ${TEKTON_STYLE_IMPORT}`);
|
|
290
|
+
}
|
|
291
|
+
// Step 5: MCP 설정
|
|
292
|
+
log(5, totalSteps, 'Claude Code MCP 설정 중...');
|
|
293
|
+
try {
|
|
294
|
+
setupMCP(cwd);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
console.error('MCP 설정에 실패했습니다. 수동으로 .mcp.json을 생성해 주세요.');
|
|
298
|
+
}
|
|
299
|
+
// Step 6: 가이드 문서 생성
|
|
300
|
+
log(6, totalSteps, '가이드 문서 생성 중...');
|
|
301
|
+
try {
|
|
302
|
+
setupGuide(cwd, framework);
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
console.error('가이드 문서 생성에 실패했습니다.');
|
|
306
|
+
}
|
|
307
|
+
// Step 7: CLAUDE.md / AGENTS.md 설정
|
|
308
|
+
log(7, totalSteps, 'AI 에이전트 가이드 설정 중...');
|
|
309
|
+
try {
|
|
310
|
+
setupAgentMd(cwd, framework);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
console.error('AI 에이전트 가이드 설정에 실패했습니다.');
|
|
314
|
+
}
|
|
315
|
+
// Step 8: 완료 메시지
|
|
316
|
+
log(8, totalSteps, '설정 완료');
|
|
317
|
+
printSuccess();
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { info, error as logError } from './utils/logger.js';
|
|
6
6
|
import { verifyApiKey } from './auth/verify.js';
|
|
7
7
|
import { setAuthData } from './auth/state.js';
|
|
@@ -23,6 +23,8 @@ import { previewScreenTemplateTool } from './tools/preview-screen-template.js';
|
|
|
23
23
|
import { getScreenGenerationContextTool } from './tools/get-screen-generation-context.js';
|
|
24
24
|
import { validateScreenDefinitionTool } from './tools/validate-screen-definition.js';
|
|
25
25
|
import { validateEnvironmentTool } from './tools/validate-environment.js';
|
|
26
|
+
import { getGettingStartedPrompt } from './prompts/getting-started.js';
|
|
27
|
+
import { getScreenWorkflowPrompt } from './prompts/screen-workflow.js';
|
|
26
28
|
import { GenerateBlueprintInputSchema, PreviewThemeInputSchema, ListThemesInputSchema, ExportScreenInputSchema, GenerateScreenInputSchema, ValidateScreenInputSchema, ListTokensInputSchema, ListIconLibrariesInputSchema, PreviewIconLibraryInputSchema, ListComponentsInputSchema, PreviewComponentInputSchema, ListScreenTemplatesInputSchema, PreviewScreenTemplateInputSchema, GetScreenGenerationContextInputSchema, ValidateScreenDefinitionInputSchema, ValidateEnvironmentInputSchema, } from './schemas/mcp-schemas.js';
|
|
27
29
|
const server = new Server({
|
|
28
30
|
name: 'tekton-mcp-server',
|
|
@@ -30,9 +32,45 @@ const server = new Server({
|
|
|
30
32
|
}, {
|
|
31
33
|
capabilities: {
|
|
32
34
|
tools: {},
|
|
35
|
+
prompts: {},
|
|
33
36
|
},
|
|
34
37
|
});
|
|
35
38
|
// ============================================================================
|
|
39
|
+
// MCP Prompts: ListPromptsRequestSchema Handler
|
|
40
|
+
// ============================================================================
|
|
41
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
42
|
+
info('ListPrompts request received');
|
|
43
|
+
return {
|
|
44
|
+
prompts: [
|
|
45
|
+
{
|
|
46
|
+
name: 'getting-started',
|
|
47
|
+
description: 'Complete getting started guide for Tekton UI including authentication, theme exploration, and screen generation workflow',
|
|
48
|
+
arguments: [],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'screen-workflow',
|
|
52
|
+
description: 'Detailed 4-step screen generation workflow: get-screen-generation-context → validate-screen-definition → generate_screen → validate-environment',
|
|
53
|
+
arguments: [],
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// MCP Prompts: GetPromptRequestSchema Handler
|
|
60
|
+
// ============================================================================
|
|
61
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
62
|
+
const { name } = request.params;
|
|
63
|
+
info(`GetPrompt request: ${name}`);
|
|
64
|
+
switch (name) {
|
|
65
|
+
case 'getting-started':
|
|
66
|
+
return getGettingStartedPrompt();
|
|
67
|
+
case 'screen-workflow':
|
|
68
|
+
return getScreenWorkflowPrompt();
|
|
69
|
+
default:
|
|
70
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// ============================================================================
|
|
36
74
|
// Task #9: ListToolsRequestSchema Handler
|
|
37
75
|
// ============================================================================
|
|
38
76
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|