mcp-dndgrid 0.1.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/PROJECT_SUMMARY.md +482 -0
- package/QUICKSTART.md +223 -0
- package/README.md +365 -0
- package/STATUS.md +315 -0
- package/USAGE_GUIDE.md +547 -0
- package/dist/chunk-CMGEAPA5.js +157 -0
- package/dist/chunk-CMGEAPA5.js.map +1 -0
- package/dist/chunk-QZHBI6ZI.js +5281 -0
- package/dist/chunk-QZHBI6ZI.js.map +1 -0
- package/dist/chunk-SEGVTWSK.js +44 -0
- package/dist/chunk-SEGVTWSK.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +248012 -0
- package/dist/index.js.map +1 -0
- package/dist/stdio-FWYJXSU7.js +101 -0
- package/dist/stdio-FWYJXSU7.js.map +1 -0
- package/dist/template-JDMAVVX7.js +9 -0
- package/dist/template-JDMAVVX7.js.map +1 -0
- package/examples/claude_desktop_config.example.json +12 -0
- package/examples/example-complex-editor.tsx +107 -0
- package/examples/example-dashboard.tsx +65 -0
- package/examples/example-ide-layout.tsx +53 -0
- package/examples/test-generator.ts +37 -0
- package/examples/test-parser.ts +121 -0
- package/examples/test-scenarios.md +496 -0
- package/package.json +42 -0
- package/src/index.ts +16 -0
- package/src/server.ts +314 -0
- package/src/tools/analyze-layout.ts +193 -0
- package/src/tools/apply-template.ts +125 -0
- package/src/tools/generate-layout.ts +235 -0
- package/src/tools/interactive-builder.ts +100 -0
- package/src/tools/validate-layout.ts +113 -0
- package/src/types/layout.ts +48 -0
- package/src/types/template.ts +181 -0
- package/src/utils/ast-parser.ts +264 -0
- package/src/utils/code-generator.ts +123 -0
- package/src/utils/layout-analyzer.ts +105 -0
- package/src/utils/layout-builder.ts +127 -0
- package/src/utils/validator.ts +263 -0
- package/stderr.log +1 -0
- package/stdout.log +0 -0
- package/test-mcp.js +27 -0
- package/tsconfig.json +29 -0
- package/tsup.config.ts +16 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
# DndGrid MCP Server - 테스트 시나리오
|
|
2
|
+
|
|
3
|
+
이 문서는 MCP 서버 기능을 검증하기 위한 포괄적인 테스트 시나리오를 포함합니다.
|
|
4
|
+
|
|
5
|
+
## 설정
|
|
6
|
+
|
|
7
|
+
1. MCP 서버 빌드:
|
|
8
|
+
```bash
|
|
9
|
+
cd mcp
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. 예제 설정으로 Claude Desktop 구성
|
|
15
|
+
3. Claude Desktop 재시작
|
|
16
|
+
|
|
17
|
+
## 테스트 시나리오
|
|
18
|
+
|
|
19
|
+
### 시나리오 1: 사용 가능한 템플릿 목록
|
|
20
|
+
|
|
21
|
+
**목표**: interactive-builder가 모든 템플릿을 나열할 수 있는지 확인
|
|
22
|
+
|
|
23
|
+
**단계**:
|
|
24
|
+
1. Claude Desktop 열기
|
|
25
|
+
2. 질문: "사용 가능한 DndGrid 템플릿 보여줘"
|
|
26
|
+
|
|
27
|
+
**예상 결과**:
|
|
28
|
+
- Claude가 `action: "list-templates"`로 `interactive-builder` 사용
|
|
29
|
+
- 응답에 4개 템플릿 모두 포함:
|
|
30
|
+
- IDE Layout
|
|
31
|
+
- Dashboard 2x2
|
|
32
|
+
- Three Column
|
|
33
|
+
- Split View
|
|
34
|
+
- 각 템플릿에 다음이 표시됨:
|
|
35
|
+
- ASCII 아트 미리보기
|
|
36
|
+
- 필요한 슬롯
|
|
37
|
+
- 설명
|
|
38
|
+
|
|
39
|
+
**통과 기준**: 완전한 정보와 함께 4개 템플릿 모두 표시됨
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
### 시나리오 2: IDE Layout 템플릿 적용
|
|
44
|
+
|
|
45
|
+
**목표**: 템플릿 적용이 올바른 코드를 생성하는지 확인
|
|
46
|
+
|
|
47
|
+
**단계**:
|
|
48
|
+
1. 질문: "FileExplorer, CodeEditor, Terminal 컴포넌트로 IDE 레이아웃 템플릿 적용해줘"
|
|
49
|
+
|
|
50
|
+
**예상 결과**:
|
|
51
|
+
- Claude가 다음과 같이 `apply-template` 사용:
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"templateName": "ide-layout",
|
|
55
|
+
"components": {
|
|
56
|
+
"sidebar": "FileExplorer",
|
|
57
|
+
"editor": "CodeEditor",
|
|
58
|
+
"terminal": "Terminal"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
- 생성된 코드에 포함:
|
|
63
|
+
- `"use client";` 지시어 (Next.js App Router용)
|
|
64
|
+
- 올바른 imports
|
|
65
|
+
- 적절히 중첩된 DndGridSplit 컴포넌트
|
|
66
|
+
- 올바른 비율 (0.2 vertical, 0.7 horizontal)
|
|
67
|
+
- 세 컴포넌트 모두 올바르게 배치됨
|
|
68
|
+
|
|
69
|
+
**통과 기준**: 코드가 컴파일되고 템플릿 구조와 일치함
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### 시나리오 3: 자연어로부터 레이아웃 생성
|
|
74
|
+
|
|
75
|
+
**목표**: 자연어 패턴 인식 확인
|
|
76
|
+
|
|
77
|
+
**단계**:
|
|
78
|
+
1. 질문: "UserStats, RevenueChart, ActivityLog, QuickActions로 2x2 대시보드 레이아웃 생성해줘"
|
|
79
|
+
|
|
80
|
+
**예상 결과**:
|
|
81
|
+
- Claude가 다음과 같이 `generate-layout` 사용:
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"description": "2x2 dashboard layout...",
|
|
85
|
+
"components": ["UserStats", "RevenueChart", "ActivityLog", "QuickActions"]
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
- 감지된 패턴: `dashboard` (2x2 그리드)
|
|
89
|
+
- 생성된 코드가 적절한 2x2 그리드 구조 생성
|
|
90
|
+
- 4개 컴포넌트 모두 올바르게 배치됨
|
|
91
|
+
|
|
92
|
+
**통과 기준**: Dashboard 패턴이 인식되고 코드가 올바르게 생성됨
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### 시나리오 4: 유효한 코드 검증
|
|
97
|
+
|
|
98
|
+
**목표**: 올바른 코드에 대해 검증이 통과하는지 확인
|
|
99
|
+
|
|
100
|
+
**단계**:
|
|
101
|
+
1. Claude에게 검증 요청:
|
|
102
|
+
```typescript
|
|
103
|
+
"use client";
|
|
104
|
+
|
|
105
|
+
import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
|
|
106
|
+
|
|
107
|
+
export default function Layout() {
|
|
108
|
+
return (
|
|
109
|
+
<DndGridContainer width={1200} height={800}>
|
|
110
|
+
<DndGridSplit direction="vertical" ratio={0.3}>
|
|
111
|
+
<DndGridItem>
|
|
112
|
+
<Sidebar />
|
|
113
|
+
</DndGridItem>
|
|
114
|
+
<DndGridItem>
|
|
115
|
+
<MainContent />
|
|
116
|
+
</DndGridItem>
|
|
117
|
+
</DndGridSplit>
|
|
118
|
+
</DndGridContainer>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**예상 결과**:
|
|
124
|
+
- Claude가 `validate-layout` 사용
|
|
125
|
+
- 결과 표시:
|
|
126
|
+
- ✅ 오류 없음
|
|
127
|
+
- ✅ 유효한 구조
|
|
128
|
+
- ✅ 적절한 "use client" 지시어
|
|
129
|
+
- ✅ 올바른 imports
|
|
130
|
+
- 비율이 권장 범위 내에 있다는 경고 가능
|
|
131
|
+
|
|
132
|
+
**통과 기준**: 오류 없이 검증 통과
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### 시나리오 5: 잘못된 코드 검증 ("use client" 누락)
|
|
137
|
+
|
|
138
|
+
**목표**: 검증이 누락된 Next.js 지시어를 감지하는지 확인
|
|
139
|
+
|
|
140
|
+
**단계**:
|
|
141
|
+
1. Claude에게 검증 요청:
|
|
142
|
+
```typescript
|
|
143
|
+
import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
|
|
144
|
+
|
|
145
|
+
export default function Layout() {
|
|
146
|
+
return (
|
|
147
|
+
<DndGridContainer width={1200} height={800}>
|
|
148
|
+
<DndGridSplit direction="vertical" ratio={0.5}>
|
|
149
|
+
<DndGridItem>
|
|
150
|
+
<Panel1 />
|
|
151
|
+
</DndGridItem>
|
|
152
|
+
<DndGridItem>
|
|
153
|
+
<Panel2 />
|
|
154
|
+
</DndGridItem>
|
|
155
|
+
</DndGridSplit>
|
|
156
|
+
</DndGridContainer>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**예상 결과**:
|
|
162
|
+
- 검증 경고: "use client" 지시어 누락
|
|
163
|
+
|
|
164
|
+
**통과 기준**: 경고가 누락된 지시어를 올바르게 식별함
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
### 시나리오 6: 잘못된 코드 검증 (극단적 비율)
|
|
169
|
+
|
|
170
|
+
**목표**: 검증이 나쁜 UX 비율을 감지하는지 확인
|
|
171
|
+
|
|
172
|
+
**단계**:
|
|
173
|
+
1. strict 모드로 Claude에게 검증 요청:
|
|
174
|
+
```typescript
|
|
175
|
+
"use client";
|
|
176
|
+
|
|
177
|
+
import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
|
|
178
|
+
|
|
179
|
+
export default function Layout() {
|
|
180
|
+
return (
|
|
181
|
+
<DndGridContainer width={1200} height={800}>
|
|
182
|
+
<DndGridSplit direction="vertical" ratio={0.05}>
|
|
183
|
+
<DndGridItem>
|
|
184
|
+
<TinyPanel />
|
|
185
|
+
</DndGridItem>
|
|
186
|
+
<DndGridItem>
|
|
187
|
+
<MainContent />
|
|
188
|
+
</DndGridItem>
|
|
189
|
+
</DndGridSplit>
|
|
190
|
+
</DndGridContainer>
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**예상 결과**:
|
|
196
|
+
- 경고: Split ratio 0.05가 너무 작음 (< 0.2)
|
|
197
|
+
- 제안: 더 나은 UX를 위해 0.2-0.8 범위 사용
|
|
198
|
+
|
|
199
|
+
**통과 기준**: 비율 경고가 올바르게 식별됨
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### 시나리오 7: 레이아웃 성능 분석
|
|
204
|
+
|
|
205
|
+
**목표**: 분석이 올바른 메트릭을 제공하는지 확인
|
|
206
|
+
|
|
207
|
+
**단계**:
|
|
208
|
+
1. Claude에게 분석 요청:
|
|
209
|
+
```typescript
|
|
210
|
+
"use client";
|
|
211
|
+
|
|
212
|
+
import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
|
|
213
|
+
|
|
214
|
+
export default function ComplexLayout() {
|
|
215
|
+
return (
|
|
216
|
+
<DndGridContainer width={1920} height={1080}>
|
|
217
|
+
<DndGridSplit direction="vertical" ratio={0.2}>
|
|
218
|
+
<DndGridItem><Nav /></DndGridItem>
|
|
219
|
+
<DndGridSplit direction="horizontal" ratio={0.7}>
|
|
220
|
+
<DndGridSplit direction="vertical" ratio={0.6}>
|
|
221
|
+
<DndGridItem><Editor /></DndGridItem>
|
|
222
|
+
<DndGridItem><Preview /></DndGridItem>
|
|
223
|
+
</DndGridSplit>
|
|
224
|
+
<DndGridSplit direction="horizontal" ratio={0.5}>
|
|
225
|
+
<DndGridItem><Console /></DndGridItem>
|
|
226
|
+
<DndGridItem><Terminal /></DndGridItem>
|
|
227
|
+
</DndGridSplit>
|
|
228
|
+
</DndGridSplit>
|
|
229
|
+
</DndGridSplit>
|
|
230
|
+
</DndGridContainer>
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**예상 결과**:
|
|
236
|
+
- 메트릭:
|
|
237
|
+
- Items: 5
|
|
238
|
+
- Splits: 4
|
|
239
|
+
- Max Depth: 3
|
|
240
|
+
- Performance: Good
|
|
241
|
+
- 모범 사례 확인:
|
|
242
|
+
- ✅ "use client" 존재
|
|
243
|
+
- ✅ 올바른 imports
|
|
244
|
+
- ✅ Container 크기 지정됨
|
|
245
|
+
- ✅ 권장 제한 내에 있음
|
|
246
|
+
|
|
247
|
+
**통과 기준**: 올바른 메트릭 계산됨
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### 시나리오 8: Three-Column 레이아웃 생성
|
|
252
|
+
|
|
253
|
+
**목표**: three-column 패턴 인식 확인
|
|
254
|
+
|
|
255
|
+
**단계**:
|
|
256
|
+
1. 질문: "LeftSidebar, MainEditor, RightPanel로 three-column 레이아웃 생성해줘"
|
|
257
|
+
|
|
258
|
+
**예상 결과**:
|
|
259
|
+
- 감지된 패턴: `three-column`
|
|
260
|
+
- 코드가 적절한 비율로 vertical split 사용
|
|
261
|
+
- 컴포넌트가 왼쪽에서 오른쪽으로 배치됨
|
|
262
|
+
|
|
263
|
+
**통과 기준**: Three-column 구조가 올바르게 생성됨
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
### 시나리오 9: 커스텀 레이아웃 생성 (Fallback)
|
|
268
|
+
|
|
269
|
+
**목표**: 알 수 없는 레이아웃에 대한 커스텀 패턴 fallback 확인
|
|
270
|
+
|
|
271
|
+
**단계**:
|
|
272
|
+
1. 질문: "A, B, C, D, E 5개 컴포넌트를 수직으로 쌓은 레이아웃 생성해줘"
|
|
273
|
+
|
|
274
|
+
**예상 결과**:
|
|
275
|
+
- 패턴: `custom`
|
|
276
|
+
- 중첩된 vertical split 사용
|
|
277
|
+
- 5개 컴포넌트 모두 적절히 쌓임
|
|
278
|
+
|
|
279
|
+
**통과 기준**: Fallback 패턴이 올바르게 작동함
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
### 시나리오 10: Architecture Resource 접근
|
|
284
|
+
|
|
285
|
+
**목표**: resource 접근이 작동하는지 확인
|
|
286
|
+
|
|
287
|
+
**단계**:
|
|
288
|
+
1. 질문: "DndGrid 아키텍처 문서 보여줘"
|
|
289
|
+
|
|
290
|
+
**예상 결과**:
|
|
291
|
+
- Claude가 `dndgrid://docs/architecture` resource 읽기
|
|
292
|
+
- 응답에 포함:
|
|
293
|
+
- 핵심 컴포넌트 설명
|
|
294
|
+
- Flat rendering 패턴
|
|
295
|
+
- Binary tree 구조
|
|
296
|
+
- Next.js 호환성 노트
|
|
297
|
+
- 성능 가이드라인
|
|
298
|
+
|
|
299
|
+
**통과 기준**: 완전한 아키텍처 문서 표시됨
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
### 시나리오 11: Templates Resource 접근
|
|
304
|
+
|
|
305
|
+
**목표**: templates resource가 JSON 카탈로그를 제공하는지 확인
|
|
306
|
+
|
|
307
|
+
**단계**:
|
|
308
|
+
1. 질문: "템플릿 카탈로그를 JSON으로 보여줘"
|
|
309
|
+
|
|
310
|
+
**예상 결과**:
|
|
311
|
+
- Claude가 `dndgrid://templates/list` resource 읽기
|
|
312
|
+
- 4개 템플릿 모두 포함된 JSON 반환
|
|
313
|
+
- 각 템플릿에 포함:
|
|
314
|
+
- name
|
|
315
|
+
- description
|
|
316
|
+
- preview
|
|
317
|
+
- slots
|
|
318
|
+
- defaultRatios
|
|
319
|
+
- tree 구조
|
|
320
|
+
|
|
321
|
+
**통과 기준**: 완전한 템플릿 데이터가 포함된 유효한 JSON 반환됨
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### 시나리오 12: Best Practices Resource 접근
|
|
326
|
+
|
|
327
|
+
**목표**: best practices 문서 확인
|
|
328
|
+
|
|
329
|
+
**단계**:
|
|
330
|
+
1. 질문: "DndGrid 성능 모범 사례가 뭐야?"
|
|
331
|
+
|
|
332
|
+
**예상 결과**:
|
|
333
|
+
- Claude가 `dndgrid://docs/best-practices` resource 읽기
|
|
334
|
+
- 정보 포함:
|
|
335
|
+
- 성능 제한 (아이템, 깊이, 비율)
|
|
336
|
+
- Next.js 통합 가이드
|
|
337
|
+
- 일반적인 패턴
|
|
338
|
+
- 문제 해결 팁
|
|
339
|
+
|
|
340
|
+
**통과 기준**: 완전한 모범 사례 가이드 표시됨
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
### 시나리오 13: End-to-End 워크플로우
|
|
345
|
+
|
|
346
|
+
**목표**: 템플릿 선택부터 검증까지 완전한 워크플로우 테스트
|
|
347
|
+
|
|
348
|
+
**단계**:
|
|
349
|
+
1. "사용 가능한 템플릿 보여줘"
|
|
350
|
+
2. "MetricsCard, ChartWidget, TableWidget, ActivityWidget로 dashboard-2x2 템플릿 적용해줘"
|
|
351
|
+
3. "strict 모드로 생성된 코드 검증해줘"
|
|
352
|
+
|
|
353
|
+
**예상 결과**:
|
|
354
|
+
- 세 단계 모두 성공적으로 실행됨
|
|
355
|
+
- 템플릿이 올바르게 적용됨
|
|
356
|
+
- 오류 없이 검증 통과
|
|
357
|
+
|
|
358
|
+
**통과 기준**: 완전한 워크플로우가 원활하게 작동함
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
### 시나리오 14: 오류 처리 - 잘못된 템플릿 이름
|
|
363
|
+
|
|
364
|
+
**목표**: 적절한 오류 처리 확인
|
|
365
|
+
|
|
366
|
+
**단계**:
|
|
367
|
+
1. 질문: "'invalid-template' 템플릿 적용해줘"
|
|
368
|
+
|
|
369
|
+
**예상 결과**:
|
|
370
|
+
- 오류 메시지: Template "invalid-template" not found
|
|
371
|
+
- 사용 가능한 템플릿 목록 표시
|
|
372
|
+
|
|
373
|
+
**통과 기준**: 유용한 정보가 포함된 명확한 오류 메시지
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
### 시나리오 15: 오류 처리 - 누락된 템플릿 슬롯
|
|
378
|
+
|
|
379
|
+
**목표**: 슬롯 검증 확인
|
|
380
|
+
|
|
381
|
+
**단계**:
|
|
382
|
+
1. 질문: "FileExplorer 컴포넌트만으로 IDE 레이아웃 템플릿 적용해줘"
|
|
383
|
+
|
|
384
|
+
**예상 결과**:
|
|
385
|
+
- 오류: Missing component mappings for slots: editor, terminal
|
|
386
|
+
- 필요한 슬롯 표시
|
|
387
|
+
|
|
388
|
+
**통과 기준**: 슬롯 검증이 올바르게 작동함
|
|
389
|
+
|
|
390
|
+
## 성능 테스트
|
|
391
|
+
|
|
392
|
+
### 테스트 1: 대규모 레이아웃 생성
|
|
393
|
+
|
|
394
|
+
**목표**: 복잡한 레이아웃에서의 성능 확인
|
|
395
|
+
|
|
396
|
+
**단계**:
|
|
397
|
+
1. 15개 컴포넌트로 레이아웃 생성
|
|
398
|
+
2. 성능 메트릭 분석
|
|
399
|
+
3. 높은 아이템 개수에 대한 경고 확인
|
|
400
|
+
|
|
401
|
+
**예상 결과**:
|
|
402
|
+
- 코드가 성공적으로 생성됨
|
|
403
|
+
- 경고: 권장 제한(20 아이템)에 근접
|
|
404
|
+
- 구조 단순화 제안
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
### 테스트 2: 깊은 중첩 검증
|
|
409
|
+
|
|
410
|
+
**목표**: 깊이 제한 경고 확인
|
|
411
|
+
|
|
412
|
+
**단계**:
|
|
413
|
+
1. 5 깊이 레벨로 수동으로 중첩된 레이아웃 생성
|
|
414
|
+
2. strict 모드로 검증
|
|
415
|
+
|
|
416
|
+
**예상 결과**:
|
|
417
|
+
- 경고: Max depth 5가 제한(6)에 근접
|
|
418
|
+
- 중첩 줄이기 제안
|
|
419
|
+
|
|
420
|
+
## 통합 테스트
|
|
421
|
+
|
|
422
|
+
### 테스트 1: Next.js App Router 통합
|
|
423
|
+
|
|
424
|
+
**목표**: 생성된 코드가 Next.js App Router에서 작동하는지 확인
|
|
425
|
+
|
|
426
|
+
**단계**:
|
|
427
|
+
1. IDE 레이아웃 생성
|
|
428
|
+
2. Next.js app 디렉토리에 복사
|
|
429
|
+
3. Next.js dev 서버 실행
|
|
430
|
+
4. 오류 없음 확인
|
|
431
|
+
|
|
432
|
+
**예상 결과**:
|
|
433
|
+
- 오류 없이 코드 컴파일됨
|
|
434
|
+
- "use client" 지시어 작동
|
|
435
|
+
- 레이아웃이 올바르게 렌더링됨
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
### 테스트 2: Framework 파라미터
|
|
440
|
+
|
|
441
|
+
**목표**: framework 파라미터가 출력에 영향을 주는지 확인
|
|
442
|
+
|
|
443
|
+
**단계**:
|
|
444
|
+
1. `framework: "nextjs-pages"`로 레이아웃 생성
|
|
445
|
+
2. "use client" 지시어 없음 확인
|
|
446
|
+
|
|
447
|
+
**예상 결과**:
|
|
448
|
+
- Pages Router 버전에는 "use client" 없음
|
|
449
|
+
- App Router 버전(기본값)에는 "use client" 있음
|
|
450
|
+
|
|
451
|
+
## 회귀 테스트
|
|
452
|
+
|
|
453
|
+
코드 변경 후, 다음을 확인하기 위해 위의 모든 시나리오를 실행하세요:
|
|
454
|
+
- 중단 변경 없음
|
|
455
|
+
- 모든 tool이 여전히 작동
|
|
456
|
+
- 모든 resource 접근 가능
|
|
457
|
+
- 오류 처리 변경 없음
|
|
458
|
+
- 성능 메트릭 정확
|
|
459
|
+
|
|
460
|
+
## 테스트 자동화
|
|
461
|
+
|
|
462
|
+
다음에 대한 자동화 테스트 구현 고려:
|
|
463
|
+
- Input schema 검증 (Zod)
|
|
464
|
+
- Tool 출력 형식 일관성
|
|
465
|
+
- Resource 가용성
|
|
466
|
+
- 패턴 인식 정확도
|
|
467
|
+
- 코드 생성 정확성
|
|
468
|
+
|
|
469
|
+
## 수동 테스트 체크리스트
|
|
470
|
+
|
|
471
|
+
- [ ] 5개 tool 모두 독립적으로 작동
|
|
472
|
+
- [ ] 3개 resource 모두 접근 가능
|
|
473
|
+
- [ ] 템플릿 적용 정확
|
|
474
|
+
- [ ] 자연어 생성 정확
|
|
475
|
+
- [ ] 검증이 오류 감지
|
|
476
|
+
- [ ] 분석이 올바른 메트릭 제공
|
|
477
|
+
- [ ] Interactive builder 유용
|
|
478
|
+
- [ ] 오류 메시지 명확
|
|
479
|
+
- [ ] 성능이 제한 내에 있음
|
|
480
|
+
- [ ] Next.js 호환성 확인됨
|
|
481
|
+
|
|
482
|
+
## 알려진 제한사항
|
|
483
|
+
|
|
484
|
+
1. 패턴 인식은 휴리스틱 기반 (ML 아님)
|
|
485
|
+
2. 자연어 이해가 사전 정의된 패턴으로 제한됨
|
|
486
|
+
3. 런타임 레이아웃 수정 지원 안 됨
|
|
487
|
+
4. 정적 코드 생성만 가능
|
|
488
|
+
5. Binary tree 구조로 제한됨
|
|
489
|
+
|
|
490
|
+
## 향후 테스트 시나리오
|
|
491
|
+
|
|
492
|
+
- 멀티 프레임워크 지원 (React, Vue 등)
|
|
493
|
+
- 커스텀 템플릿 생성
|
|
494
|
+
- 레이아웃 마이그레이션 도구
|
|
495
|
+
- 실시간 레이아웃 미리보기
|
|
496
|
+
- Drag-and-drop 비주얼 빌더 통합
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-dndgrid",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for DndGrid layout generation and analysis",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"dndgrid-mcp": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"dev": "tsup --watch",
|
|
14
|
+
"type-check": "tsc --noEmit",
|
|
15
|
+
"test": "vitest"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"dnd-grid",
|
|
20
|
+
"layout",
|
|
21
|
+
"code-generation",
|
|
22
|
+
"ai-tools"
|
|
23
|
+
],
|
|
24
|
+
"author": "zerojin",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.0.1",
|
|
28
|
+
"zod": "^3.23.8",
|
|
29
|
+
"zod-to-json-schema": "^3.25.1"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.11.0",
|
|
33
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
34
|
+
"@typescript-eslint/typescript-estree": "^8.0.0",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^5.9.3",
|
|
37
|
+
"vitest": "^2.1.8"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DndGridMCPServer } from './server.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Main entry point for DndGrid MCP Server
|
|
5
|
+
*/
|
|
6
|
+
async function main() {
|
|
7
|
+
try {
|
|
8
|
+
const server = new DndGridMCPServer();
|
|
9
|
+
await server.start();
|
|
10
|
+
} catch (error) {
|
|
11
|
+
console.error('Failed to start DndGrid MCP Server:', error);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
main();
|