@axboot-mcp/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CLAUDE.md +119 -0
  2. package/MCP_TOOL_PLAN.md +710 -0
  3. package/MCP_USAGE.md +914 -0
  4. package/README.md +168 -0
  5. package/REPOSITORY_CONVENTIONS.md +250 -0
  6. package/SEARCH_PARAMS_MCP_TOOL_COMPLETE_PLAN.md +646 -0
  7. package/SEARCH_PARAMS_PLAN.md +2570 -0
  8. package/STORE_PATTERNS.md +1178 -0
  9. package/debug-dto.js +72 -0
  10. package/generate-banner-store.js +62 -0
  11. package/generation-plan.json +2176 -0
  12. package/generation-results.json +1817 -0
  13. package/package.json +45 -0
  14. package/scripts/batch-generate-all.js +159 -0
  15. package/scripts/batch-generate-mcp.js +329 -0
  16. package/scripts/batch-generate-stores-v2.js +272 -0
  17. package/scripts/batch-generate-stores.js +179 -0
  18. package/scripts/batch-plan.json +3810 -0
  19. package/scripts/batch-process.py +90 -0
  20. package/scripts/batch-regenerate.js +356 -0
  21. package/scripts/direct-generate.js +227 -0
  22. package/scripts/execute-batches.js +1911 -0
  23. package/scripts/generate-all-stores.js +144 -0
  24. package/scripts/generate-stores-mcp.js +161 -0
  25. package/scripts/generate-stores-v2.js +450 -0
  26. package/scripts/generate-stores-v3.js +412 -0
  27. package/scripts/generate-stores-v4.js +521 -0
  28. package/scripts/generate-stores.js +382 -0
  29. package/scripts/repos-to-process.json +1899 -0
  30. package/src/config/nh-layout-patterns.ts +166 -0
  31. package/src/docs/HOOK_GENERATION_PLAN.md +2226 -0
  32. package/src/docs/NH_STORE_PATTERNS.md +297 -0
  33. package/src/docs/README.md +216 -0
  34. package/src/docs/index.ts +28 -0
  35. package/src/docs/loader.ts +568 -0
  36. package/src/docs/patterns.json +419 -0
  37. package/src/docs/practical-examples.md +732 -0
  38. package/src/docs/quick-start.md +257 -0
  39. package/src/docs/requirements-analysis-guide.md +364 -0
  40. package/src/docs/rules.json +321 -0
  41. package/src/docs/store-pattern-analysis.md +664 -0
  42. package/src/docs/store-patterns-rules.md +1168 -0
  43. package/src/docs/store-patterns-usage-guide.md +1835 -0
  44. package/src/docs/troubleshooting.md +544 -0
  45. package/src/docs/type-selection-guide.md +572 -0
  46. package/src/docs//354/202/254/354/232/251/353/262/225/AntD-/354/273/264/355/217/254/353/204/214/355/212/270-/354/202/254/354/232/251/353/262/225.md +1515 -0
  47. package/src/docs//354/202/254/354/232/251/353/262/225/DataGrid-/354/202/254/354/232/251/353/262/225.md +866 -0
  48. package/src/docs//354/202/254/354/232/251/353/262/225/FormItem-/354/202/254/354/232/251/353/262/225.md +903 -0
  49. package/src/docs//354/202/254/354/232/251/353/262/225/FormModal-/354/202/254/354/232/251/353/262/225.md +1155 -0
  50. package/src/docs//354/202/254/354/232/251/353/262/225/MCP-/353/260/224/354/235/264/353/270/214/354/275/224/353/224/251-/352/260/200/354/235/264/353/223/234.md +1133 -0
  51. package/src/docs//354/202/254/354/232/251/353/262/225/MSW-Mock-/353/215/260/354/235/264/355/204/260-/354/202/254/354/232/251/353/262/225.md +579 -0
  52. package/src/docs//354/202/254/354/232/251/353/262/225/Search-/354/273/264/355/217/254/353/204/214/355/212/270-/354/202/254/354/232/251/353/262/225.md +738 -0
  53. package/src/docs//354/202/254/354/232/251/353/262/225/Store-/355/214/250/355/204/264-/354/202/254/354/232/251/353/262/225.md +1135 -0
  54. package/src/docs//354/202/254/354/232/251/353/262/225//355/231/224/353/251/264/352/265/254/354/204/261-/355/203/200/354/236/205/353/263/204-/352/260/234/353/260/234/354/210/234/354/204/234.md +1805 -0
  55. package/src/docs//354/202/254/354/232/251/353/262/225//355/231/224/353/251/264/355/203/200/354/236/205/353/263/204-/352/260/234/353/260/234-/355/224/204/353/241/254/355/224/204/355/212/270-/352/260/200/354/235/264/353/223/234.md +946 -0
  56. package/src/docs//354/202/254/354/232/251/353/262/225//355/231/225/354/236/245/355/231/224/353/251/264/355/203/200/354/236/205/353/263/204-/354/203/201/354/204/270-/355/224/204/353/241/254/355/224/204/355/212/270/352/260/200/354/235/264/353/223/234.md +2422 -0
  57. package/src/features/store-features.ts +232 -0
  58. package/src/handlers/analyze-requirements.ts +403 -0
  59. package/src/handlers/analyze.ts +1373 -0
  60. package/src/handlers/generate-from-requirements.ts +250 -0
  61. package/src/handlers/generate-hook.ts +950 -0
  62. package/src/handlers/generate-interactive.ts +840 -0
  63. package/src/handlers/generate-listdatagrid.ts +521 -0
  64. package/src/handlers/generate-multi-stores.ts +577 -0
  65. package/src/handlers/generate-requirements-from-layout.ts +160 -0
  66. package/src/handlers/generate-search-params.ts +717 -0
  67. package/src/handlers/generate.ts +911 -0
  68. package/src/handlers/list-templates.ts +104 -0
  69. package/src/handlers/scan-metadata.ts +485 -0
  70. package/src/handlers/suggest-layout.ts +326 -0
  71. package/src/index.ts +959 -0
  72. package/src/prompts/search-params.md +793 -0
  73. package/src/templates/index.ts +107 -0
  74. package/src/templates/unified.ts +462 -0
  75. package/store-generation-error-patterns.md +225 -0
  76. package/test/useAgentStore.ts +136 -0
  77. package/test-server.js +78 -0
  78. package/tsconfig.json +20 -0
@@ -0,0 +1,710 @@
1
+ # MCP 3대 핵심 툴 생성 계획
2
+
3
+ ## 개요
4
+
5
+ NH-FE-B 프로젝트 패턴 기반의 대화형 코드 생성 툴 3종을 개발합니다.
6
+
7
+ ```
8
+ Repository 분석 → 패턴 추천 → 사용자 선택 → 코드 생성
9
+ ```
10
+
11
+ ---
12
+
13
+ ## 1. generate_search_params_interactive
14
+
15
+ 검색 폼(SearchParams)을 대화형으로 생성합니다.
16
+
17
+ ### 입력
18
+ - `repositoryPath`: Repository 파일 경로 (절대 경로)
19
+ - `dtoPath`: DTO 파일 경로 (선택, 없으면 자동 검색)
20
+
21
+ ### 처리 흐름
22
+ ```
23
+ 1. Repository의 List API 메서드 찾기
24
+ 2. Request 타입 분석 → 필드 목록 추출
25
+ 3. 필드별로 패턴 선택 (대화형)
26
+ 4. SearchParams JSX 코드 생성
27
+ ```
28
+
29
+ ### 대화형 예시
30
+
31
+ #### 일반 필드
32
+ ```
33
+ [MCP] usrNm (회원명) 필드를 발견했습니다.
34
+ 어떤 검색 컴포넌트를 사용할까요?
35
+
36
+ ┌─────────────────────────────────────────────┐
37
+ │ 1. 📝 일반 텍스트 입력 (INPUT) │
38
+ ├─────────────────────────────────────────────┤
39
+ │ 2. 🔍 검색구분 + 텍스트 (SEARCH_TYPE) │
40
+ └─────────────────────────────────────────────┘
41
+
42
+ 번호를 입력하세요:
43
+ ```
44
+
45
+ #### 코드/SELECT 필드
46
+ ```
47
+ [MCP] statusCd (상태코드) 필드입니다.
48
+ 어떤 방식으로 옵션을 제공할까요?
49
+
50
+ ┌─────────────────────────────────────────────┐
51
+ │ 1. 📦 Code Store 사용 (codeVar) │
52
+ │ → USE_YN, STATUS_CD 등 │
53
+ ├─────────────────────────────────────────────┤
54
+ │ 2. ✏️ 직접 옵션 입력 (options 배열) │
55
+ │ → [{ label: '이름', value: 'name' }] │
56
+ └─────────────────────────────────────────────┘
57
+
58
+ 번호를 입력하세요:
59
+ ```
60
+
61
+ **1번 선택 시 (Code Store)**
62
+ ```
63
+ [MCP] "코드 변수명을 입력하세요:"
64
+ 사용자: "STATUS_CD"
65
+
66
+ [MCP] "자동 추론: STATUS_CD (확인되었습니다)"
67
+ ```
68
+
69
+ **2번 선택 시 (직접 옵션)**
70
+ ```
71
+ [MCP] "옵션을 입력하세요.
72
+ 형식: label,value (줄바리로 구분)"
73
+
74
+ 사용자:
75
+ 활성,active
76
+ 비활성,inactive
77
+ 대기,pending
78
+
79
+ [MCP] "다음과 같이 변환됩니다:
80
+ [
81
+ { label: '활성', value: 'active' },
82
+ { label: '비활성', value: 'inactive' },
83
+ { label: '대기', value: 'pending' },
84
+ ]
85
+
86
+ 확인되나요? (y/n)"
87
+ ```
88
+
89
+ #### 그룹핑 설정
90
+ ```
91
+ [MCP] "필드들을 그룹으로 묶을까요?
92
+ 같은 줄에 표시할 필드들을 지정할 수 있습니다."
93
+
94
+ 사용자:
95
+ - 그룹 1: usrNm, usrEmailAddr (한 줄)
96
+ - 그룹 2: useYn, statusCd (한 줄)
97
+ - joinDt (독립 줄)
98
+
99
+ [MCP] "다음과 같이 그룹핑합니다:
100
+
101
+ <SearchParams.Group>
102
+ <SearchParams.Input name='usrNm' />
103
+ <SearchParams.Input name='usrEmailAddr' />
104
+ </SearchParams.Group>
105
+
106
+ <SearchParams.Group>
107
+ <SearchParams.Select name='useYn' />
108
+ <SearchParams.Select name='statusCd' />
109
+ </SearchParams.Group>
110
+
111
+ <SearchParams.DatePicker name='joinDt' />
112
+
113
+ 확인되나요? (y/n)"
114
+ ```
115
+
116
+ #### 줄바꿈 설정
117
+ ```
118
+ [MCP] "각 필드 뒤에 줄바꿈을 추가할까요?
119
+
120
+ ┌─────────────────────────────────────────────┐
121
+ │ 1. ✅ 줄바꿈 추가 │
122
+ ├─────────────────────────────────────────────┤
123
+ │ 2. ❌ 줄바꿈 없음 (한 줄에 표시) │
124
+ └─────────────────────────────────────────────┘
125
+
126
+ 번호를 입력하세요:"
127
+ ```
128
+
129
+ ### SearchParams 그룹핑 방식
130
+
131
+ | 방식 | 설명 | 코드 예시 |
132
+ |------|------|---------|
133
+ | 한 줄 | 기본, 한 줄에 표시 | `<Params.Input />` |
134
+ | 그룹 | 여러 필드를 같은 줄 | `<Params.Group>...</Params.Group>` |
135
+ | 독립 줄 | 그룹 없이 독립 | `lineBreak: true` |
136
+
137
+ ### 대화형 흐름 (그룹핑 포함)
138
+
139
+ ```
140
+ [MCP] "필드 그룹핑을 설정합니다.
141
+
142
+ 형식 1 (줄바꿈):
143
+ - 필드명 (독립 줄)
144
+
145
+ 형식 2 (그룹):
146
+ - 그룹명: 필드1, 필드2 (한 줄)
147
+
148
+ 예시:
149
+ - usrNm, usrEmailAddr
150
+ - useYn, statusCd
151
+ - joinDt (줄바꿈)"
152
+ ```
153
+
154
+ ### 생성 코드 예시 (그룹핑)
155
+
156
+ ```tsx
157
+ <SearchParams
158
+ form={searchForm}
159
+ params={[
160
+ // 그룹 1: 한 줄에 2개
161
+ { label: '이름', name: 'usrNm', type: SearchParamType.INPUT },
162
+ { label: '이메일', name: 'usrEmailAddr', type: SearchParamType.INPUT },
163
+
164
+ // 줄바꿈
165
+ null,
166
+
167
+ // 그룹 2: 한 줄에 2개
168
+ { label: '사용여부', name: 'useYn', type: SearchParamType.SELECT, codeVar: 'USE_YN' },
169
+ { label: '상태', name: 'statusCd', type: SearchParamType.SELECT, codeVar: 'STATUS_CD' },
170
+
171
+ // 줄바꿈
172
+ null,
173
+
174
+ // 독립 필드
175
+ { label: '가입일', name: 'joinDt', type: SearchParamType.DATE_PICKER },
176
+ ]}
177
+ paramsValue={listRequestValue}
178
+ onChangeParamsValue={setListRequestValue}
179
+ onSearch={handleSearch}
180
+ spinning={listSpinning}
181
+ />
182
+ ```
183
+
184
+ ### 줄바꿈 방식
185
+
186
+ | 방식 | 설명 | 코드 |
187
+ |------|------|------|
188
+ | `null` | 줄바꿈 | params 배열에 `null` 추가 |
189
+ | `lineBreak: true` | 명시적 줄바꿈 | params 옵션에 설정 |
190
+
191
+ ---
192
+
193
+ ## 2. generate_listdatagrid_interactive
194
+
195
+ 데이터 그리드(ListDataGrid)를 대화형으로 생성합니다.
196
+
197
+ ### 입력
198
+ - `repositoryPath`: Repository 파일 경로 (절대 경로)
199
+ - `dtoPath`: DTO 파일 경로 (선택, 없으면 자동 검색)
200
+
201
+ ### 처리 흐름
202
+ ```
203
+ 1. Repository의 List API 메서드 찾기
204
+ 2. Response 타입 분석 → 컬럼 목록 추출
205
+ 3. 컬럼별로 패턴 선택 (대화형)
206
+ 4. ListDataGrid.tsx 코드 생성
207
+ ```
208
+
209
+ ### 대화형 예시
210
+ ```
211
+ [MCP] bassExpsrYn (노출여부) 컬럼입니다.
212
+ 어떻게 표시할까요?
213
+
214
+ ┌─────────────────────────────────────────────┐
215
+ │ 1. 🏷️ 태그 (초록색: 사용, 빨간색: 사용안함) │
216
+ ├─────────────────────────────────────────────┤
217
+ │ 2. ✓ 체크박스 │
218
+ ├─────────────────────────────────────────────┤
219
+ │ 3. ● 라디오 버튼 (사용/사용안함) │
220
+ ├─────────────────────────────────────────────┤
221
+ │ 4. 📝 텍스트 (Y/N) │
222
+ └─────────────────────────────────────────────┘
223
+
224
+ 번호를 입력하세요:
225
+ ```
226
+
227
+ ---
228
+
229
+ ## 3. generate_form_modal_interactive
230
+
231
+ 폼 모달(FormModal)을 대화형으로 생성합니다.
232
+
233
+ ### 입력
234
+ - `repositoryPath`: Repository 파일 경로 (절대 경로)
235
+ - `dtoPath`: DTO 파일 경로 (선택, 없으면 자동 검색)
236
+
237
+ ### 처리 흐름
238
+ ```
239
+ 1. Repository의 Save API 메서드 찾기
240
+ 2. Request 타입 분석 → 필드 목록 추출
241
+ 3. 필드별로 컴포넌트 선택 (대화형)
242
+ 4. FormModal.tsx 코드 생성
243
+ ```
244
+
245
+ ### 대화형 예시
246
+ ```
247
+ [MCP] useYn (사용여부) 필드입니다.
248
+ 어떤 컴포넌트를 사용할까요?
249
+
250
+ ┌─────────────────────────────────────────────┐
251
+ │ 1. ● 라디오 그룹 (Radio.Group) │
252
+ ├─────────────────────────────────────────────┤
253
+ │ 2. 🔽 드롭다운 (Select) │
254
+ ├─────────────────────────────────────────────┤
255
+ │ 3. ✓ 스위치 (Switch) │
256
+ ├─────────────────────────────────────────────┤
257
+ │ 4. 📝 텍스트 (Input) │
258
+ └─────────────────────────────────────────────┘
259
+
260
+ 번호를 입력하세요:
261
+ ```
262
+
263
+ ---
264
+
265
+ ## 패턴 카탈로그 구조
266
+
267
+ ### SearchParams 컴포넌트 패턴
268
+
269
+ | 필드 패턴 | 컴포넌트 | 옵션 |
270
+ |-----------|----------|------|
271
+ | 일반 텍스트 | INPUT | - |
272
+ | 검색어 | SEARCH_TYPE | 검색구분 포함 |
273
+ | 날짜 | DATE_PICKER | 단일 날짜 |
274
+ | 날짜 범위 | DATE_RANGE | 기간 선택 |
275
+ | 코드 | SELECT | 코드 변수명 |
276
+ | Y/N | SELECT | USE_YN |
277
+
278
+ ### GridList 컬럼 패턴
279
+
280
+ | 필드 패턴 | 타입 | 미리보기 |
281
+ |-----------|------|---------|
282
+ | ~No, ~Num | rowNo | 1, 2, 3... |
283
+ | ~Nm, ~Name | title | 텍스트 (왼쪽 정렬) |
284
+ | 금액 | money | 1,000,000 |
285
+ | 날짜 | date | 2024-01-15 |
286
+ | 날짜시간 | dateTime | 2024-01-15 14:30 |
287
+ | Y/N | Tag | 🏷️ 사용/사용안함 |
288
+ | 코드 | 코드명 | 활성 (code → name) |
289
+ | 비율 | percent | 50% |
290
+
291
+ ### FormModal 컴포넌트 패턴
292
+
293
+ | 필드 패턴 | 컴포넌트 | 미리보기 |
294
+ |-----------|----------|---------|
295
+ | 일반 텍스트 | Input | `[ ]` |
296
+ | 긴 텍스트 | TextArea | `[ ]` |
297
+ | 긴 내용 | Editor | 리치 에디터 |
298
+ | Y/N | Radio.Group | ○ 사용 ○ 사용안함 |
299
+ | 코드 | Select | 🔽 드롭다운 |
300
+ | 날짜 | DatePicker | 📅 날짜 선택 |
301
+ | 날짜 범위 | RangePicker | 📅 ~ 📅 |
302
+ | 숫자 | InputNumber | [ 123 ] |
303
+ | 주소 | 주소검색 | [주소] [검색] |
304
+ | 파일 | ImageUpload | 📤 업로드 |
305
+
306
+ ### 특수 패턴 (FormModal 전용)
307
+
308
+ | 패턴 | 설명 |
309
+ |------|------|
310
+ | 행 추가/삭제 | Form.List 기반 동적 목록 |
311
+ | 행 정렬 | ReactSortable 기반 드래그 |
312
+ | 주소 검색 | openDeliveryOriginModal |
313
+ | 파일 업로드 | ImageUpload, FileUpload |
314
+ | 중복 확인 | 중복 체크 API 호출 |
315
+
316
+ ---
317
+
318
+ ## 연동 선택박스 설정 (Cascading Select)
319
+
320
+ 여러 필드가 계층적으로 연동되는 경우를 처리합니다.
321
+
322
+ ### 연동 그룹 종류
323
+
324
+ | 구분 | 설명 | 예시 |
325
+ |------|------|------|
326
+ | 2단계 연동 | 부모 → 자식 | 배송사 → 배송비 방식 |
327
+ | 3단계 연동 | 부모 → 자식 → 손자 | 대분류 → 중분류 → 소분류 |
328
+
329
+ ### 연동 그룹 설정 프롬프트
330
+
331
+ 사용자는 다음 형식으로 연동을 제시합니다:
332
+
333
+ ```
334
+ 연동 그룹 1:
335
+ - 단계: 2단계
336
+ - 필드: dlvyClTpcd → dlcstMthdCd
337
+ - 훅: useCodeStore
338
+ - 코드: DLCMPY_TPCD
339
+ - 필터: uprDtlCd
340
+
341
+ 연동 그룹 2:
342
+ - 단계: 3단계
343
+ - 필드: lrgClCd → mdmClCd → smlClCd
344
+ - 훅: useCodeStore
345
+ - 코드: CATEGORY_CD
346
+ - 필터: uprDtlCd
347
+ ```
348
+
349
+ ### 대화형 흐름
350
+
351
+ #### 1단계: 연동 설정 질문
352
+ ```
353
+ [MCP] 모든 필드 설정이 완료되었습니다.
354
+ 연동된 선택박스가 있나요?
355
+
356
+ ┌─────────────────────────────────────────────┐
357
+ │ 1. 🔗 연동 설정이 있다 │
358
+ ├─────────────────────────────────────────────┤
359
+ │ 2. ✅ 연동 없음, 다음 단계로 │
360
+ └─────────────────────────────────────────────┘
361
+ ```
362
+
363
+ #### 2단계: 연동 그룹 입력
364
+ ```
365
+ [MCP] "연동 그룹을 입력해주세요.
366
+ 형식:
367
+
368
+ 연동 그룹 N:
369
+ - 단계: 2단계 또는 3단계
370
+ - 필드: 부모 → 자식 (→ 손자)
371
+ - 훅: useCodeStore
372
+ - 코드: CODE_NAME
373
+ - 필터: 필터링 필드명
374
+
375
+ 여러 그룹은 줄바꿈으로 구분:"
376
+
377
+ 사용자:
378
+ 연동 그룹 1:
379
+ - 단계: 2단계
380
+ - 필드: dlvyClTpcd → dlcstMthdCd
381
+ - 훅: useCodeStore
382
+ - 코드: DLCMPY_TPCD
383
+ - 필터: uprDtlCd
384
+
385
+ 연동 그룹 2:
386
+ - 단계: 3단계
387
+ - 필드: lrgClCd → mdmClCd → smlClCd
388
+ - 훅: useCodeStore
389
+ - 코드: CATEGORY_CD
390
+ - 필터: uprDtlCd
391
+ ```
392
+
393
+ #### 3단계: 코드 미리보기
394
+ ```
395
+ [MCP] "다음과 같이 연동 코드를 생성합니다:
396
+
397
+ // 연동 그룹 1: 2단계
398
+ const DLCMPY_TPCD = useCodeStore((s) => s.DLCMPY_TPCD);
399
+
400
+ const DLCMPY_TPCD_OPTS = useMemo(() => {
401
+ const selected = form.getFieldValue('dlvyClTpcd');
402
+ return DLCMPY_TPCD?.options.filter(
403
+ (o) => o.uprDtlCd === selected
404
+ );
405
+ }, [form.getFieldValue('dlvyClTpcd')]);
406
+
407
+ // 연동 그룹 2: 3단계
408
+ const CATEGORY_CD = useCodeStore((s) => s.CATEGORY_CD);
409
+
410
+ const LRG_OPTS = CATEGORY_CD?.options || [];
411
+
412
+ const MDM_OPTS = useMemo(() => {
413
+ const selected = form.getFieldValue('lrgClCd');
414
+ return CATEGORY_CD?.options.filter(
415
+ (o) => o.uprDtlCd === selected
416
+ );
417
+ }, [form.getFieldValue('lrgClCd')]);
418
+
419
+ const SML_OPTS = useMemo(() => {
420
+ const selected = form.getFieldValue('mdmClCd');
421
+ return CATEGORY_CD?.options.filter(
422
+ (o) => o.uprDtlCd === selected
423
+ );
424
+ }, [form.getFieldValue('mdmClCd')]);
425
+
426
+ 확인되나요? (y/n)"
427
+ ```
428
+
429
+ ### 여러 연동 그룹 예시
430
+
431
+ ```
432
+ 검색 폼에 2개의 독립적인 연동 그룹이 있는 경우:
433
+
434
+ ┌─────────────────┬─────────────────┐
435
+ │ 연동 그룹 1 │ 연동 그룹 2 │
436
+ │ (지역별) │ (카테고리별) │
437
+ ├─────────────────┼─────────────────┤
438
+ │ 시/도 → 시/군/구 │ 대분류 → 중분류 │
439
+ │ 2단계 │ 2단계 │
440
+ │ REGION_CD │ CATEGORY_CD │
441
+ └─────────────────┴─────────────────┘
442
+
443
+ 두 연동은 서로 독립적으로 동작합니다.
444
+ ```
445
+
446
+ ### 연동 필드 매핑
447
+
448
+ | 부모 필드 | 자식 필드 | 손자 필드 | 코드 변수 | 필터링 |
449
+ |-----------|-----------|-----------|-----------|---------|
450
+ | dlvyClTpcd | dlcstMthdCd | - | DLCMPY_TPCD | uprDtlCd |
451
+ | lrgClCd | mdmClCd | smlClCd | CATEGORY_CD | uprDtlCd |
452
+ | areaCd | cityCd | - | REGION_CD | uprAreaCd |
453
+
454
+ ---
455
+
456
+ ## 기본값 처리
457
+
458
+ 필드의 초기값 설정을 처리합니다.
459
+
460
+ ### 기본값 설정 방식
461
+
462
+ | 방식 | 설명 | 예시 |
463
+ |------|------|------|
464
+ | 고정값 | 항상 같은 값 | `useYn: 'Y'` |
465
+ | 동적값 | 실행 시 계산 | `joinDt: new Date()` |
466
+ | 코드 첫번째 | 코드 옵션의 첫 값 | `statusCd: CODE.options[0]?.value` |
467
+ | 빈값 | 초기에 비워둠 | `searchText: ''` |
468
+
469
+ ### 대화형 흐름
470
+
471
+ ```
472
+ [MCP] "각 필드의 기본값을 설정합니다.
473
+ 기본값이 필요한 필드를 말씀해주세요:"
474
+
475
+ 사용자:
476
+ - useYn: 'Y'
477
+ - joinDt: 오늘 날짜
478
+ - statusCd: 첫번째 코드
479
+
480
+ [MCP] "다음과 같이 설정합니다:
481
+
482
+ const initialSearchValues = {
483
+ useYn: 'Y',
484
+ joinDt: dayjs(),
485
+ statusCd: STATUS_CD?.options[0]?.value,
486
+ };
487
+
488
+ 확인되나요? (y/n)"
489
+ ```
490
+
491
+ ### 기본값 입력 형식
492
+
493
+ ```
494
+ 필드명: 값
495
+
496
+ 예시:
497
+ - useYn: 'Y' // 문자열
498
+ - pageNumber: 1 // 숫자
499
+ - joinDt: 오늘날짜 // 동적 값
500
+ - statusCd: 첫번째코드 // 코드 첫 값
501
+ - searchText: '' // 빈값 (명시)
502
+ ```
503
+
504
+ ---
505
+
506
+ ## 필수 값 검증
507
+
508
+ 필수 필드의 유효성 검증을 설정합니다.
509
+
510
+ ### 검증 방식
511
+
512
+ | 방식 | 설명 | 예시 |
513
+ |------|------|------|
514
+ | required | 필수 입력 | `rules: [{ required: true }]` |
515
+ | custom | 커스텀 검증 | 이메일 형식, 전화번호 등 |
516
+ | dependent | 다른 필드 의존 | A 선택 시 B 필수 |
517
+
518
+ ### 대화형 흐름 (FormModal)
519
+
520
+ ```
521
+ [MCP] "필수 입력 필드를 설정합니다.
522
+ 필수로 처리할 필드를 말씀해주세요:"
523
+
524
+ 사용자:
525
+ - usrNm (회원명) - 필수
526
+ - usrEmailAddr (이메일) - 필수, 이메일 형식
527
+ - usrHpNo (휴대폰) - 선택
528
+
529
+ [MCP] "다음과 같이 검증을 설정합니다:
530
+
531
+ <Form.Item
532
+ name='usrNm'
533
+ label='회원명'
534
+ rules={[{ required: true, message: '회원명은 필수입니다.' }]}
535
+ >
536
+
537
+ <Form.Item
538
+ name='usrEmailAddr'
539
+ label='이메일'
540
+ rules={[
541
+ { required: true, message: '이메일은 필수입니다.' },
542
+ { type: 'email', message: '이메일 형식이 아닙니다.' }
543
+ ]}
544
+ >
545
+
546
+ 확인되나요? (y/n)"
547
+ ```
548
+
549
+ ### 필수 검증 입력 형식
550
+
551
+ ```
552
+ 필드명: 조건
553
+
554
+ 예시:
555
+ - usrNm: 필수
556
+ - usrEmailAddr: 필수, 이메일형식
557
+ - usrHpNo: 선택
558
+ - age: 필수, 숫자, 18이상
559
+ ```
560
+
561
+ ### 검증 타입
562
+
563
+ | 타입 | 설명 | 키워드 |
564
+ |------|------|--------|
565
+ | 필수 | 반드시 입력 | 필수, required |
566
+ | 이메일 | 이메일 형식 | 이메일, email |
567
+ | 전화번호 | 전화번호 형식 | 전화번호, phone |
568
+ | 숫자 | 숫자만 | 숫자, number |
569
+ | 날짜 | 날짜 형식 | 날짜, date |
570
+ | URL | URL 형식 | url, 링크 |
571
+ | 최소/최대 | 범위 제한 | N이상, N이하 |
572
+
573
+ ---
574
+
575
+ ## 대화형 생성 절차 (수정)
576
+
577
+ ### 1단계: 필드 분석
578
+ ```
579
+ [MCP] "N개의 필드를 발견했습니다.
580
+ 하나씩 어떻게 처리할지 물어볼게요."
581
+ ```
582
+
583
+ ### 2단계: 필드별 선택
584
+ ```
585
+ [MCP] "fieldName (한글명) 필드입니다.
586
+ 다음 중 선택해주세요:"
587
+
588
+ [패턴 카탈로그 표시]
589
+
590
+ 사용자: "1"
591
+ ```
592
+
593
+ ### 3단계: 추가 질문 (필요시)
594
+ ```
595
+ [MCP] "코드 변수명이 필요합니다.
596
+ USE_YN, STATUS_CD 등:"
597
+ ```
598
+
599
+ ### 4단계: 기본값 설정
600
+ ```
601
+ [MCP] "기본값이 필요한 필드가 있나요?
602
+ 형식: 필드명: 값
603
+
604
+ 예: useYn: 'Y', joinDt: 오늘날짜"
605
+ ```
606
+
607
+ ### 5단계: 필수 검증 설정 (FormModal)
608
+ ```
609
+ [MCP] "필수 입력 필드가 있나요?
610
+ 형식: 필드명: 조건
611
+
612
+ 예: usrNm: 필수, email: 필수,이메일형식"
613
+ ```
614
+
615
+ ### 6단계: 연동 설정
616
+ ```
617
+ [MCP] "연동된 선택박스가 있나요?
618
+ 연동 그룹을 입력해주세요."
619
+ ```
620
+
621
+ ### 7단계: 확인 및 생성
622
+ ```
623
+ [MCP] "모든 설정 완료!
624
+ 다음과 같이 생성합니다:"
625
+
626
+ [요약 표시]
627
+
628
+ 생성할까요? (y/n)
629
+ ```
630
+
631
+ ---
632
+
633
+ ## 출력 파일 구조
634
+
635
+ ### SearchParams
636
+ ```tsx
637
+ // App.tsx에 추가할 SearchParams JSX
638
+ <SearchParams
639
+ form={searchForm}
640
+ params={[...]}
641
+ paramsValue={listRequestValue}
642
+ onChangeParamsValue={setListRequestValue}
643
+ onSearch={handleSearch}
644
+ spinning={listSpinning}
645
+ />
646
+ ```
647
+
648
+ ### ListDataGrid
649
+ ```tsx
650
+ // ListDataGrid.tsx 전체 파일
651
+ import { DataGrid } from "@core/components/DataGrid";
652
+ // ... imports
653
+
654
+ const { columns } = useDataGridColumns<DtoItem>([
655
+ // 컬럼 정의
656
+ ], ...);
657
+
658
+ export function ListDataGrid() {
659
+ // ... 구현
660
+ }
661
+ ```
662
+
663
+ ### FormModal
664
+ ```tsx
665
+ // FormModal.tsx 전체 파일
666
+ import { Form } from "antd";
667
+ // ... imports
668
+
669
+ export function FormModal() {
670
+ // Form.Item들
671
+ return (
672
+ <AXModal>
673
+ <FormModal.Header />
674
+ <FormModal.Body>
675
+ {/* Form.Items */}
676
+ </FormModal.Body>
677
+ <FormModal.Footer />
678
+ </AXModal>
679
+ );
680
+ }
681
+ ```
682
+
683
+ ---
684
+
685
+ ## 파일 명명 규칙
686
+
687
+ | 툴 | 출력 파일명 | 위치 |
688
+ |-----|------------|------|
689
+ | SearchParams | (App.tsx에 삽입) | 해당 페이지 폴더 |
690
+ | ListDataGrid | ListDataGrid.tsx | 해당 페이지 폴더 |
691
+ | FormModal | FormModal.tsx | 해당 페이지 폴더 또는 modal/ 하위 |
692
+
693
+ ---
694
+
695
+ ## 개발 순서
696
+
697
+ 1. **패턴 카탈로그 데이터 구축**
698
+ - NH 프로젝트에서 실제 패턴 수집
699
+ - JSON/TS로 정의
700
+
701
+ 2. **핸들러 구현**
702
+ - `generate-search-params-interactive.ts`
703
+ - `generate-listdatagrid-interactive.ts`
704
+ - `generate-form-modal-interactive.ts`
705
+
706
+ 3. **MCP 툴 등록**
707
+ - `index.ts`에 3개 툴 등록
708
+
709
+ 4. **테스트**
710
+ - 실제 Repository로 테스트