@makitt.io/mds-mcp-server 0.1.3 → 0.2.1

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 (55) hide show
  1. package/README.md +151 -34
  2. package/dist/catalog.d.ts +16 -0
  3. package/dist/catalog.d.ts.map +1 -0
  4. package/dist/catalog.js +383 -0
  5. package/dist/catalog.js.map +1 -0
  6. package/dist/data/catalog.json +41955 -4439
  7. package/dist/data/playbook/ai-fill.md +61 -48
  8. package/dist/data/playbook/anti-patterns.md +112 -110
  9. package/dist/data/playbook/array-input.md +94 -49
  10. package/dist/data/playbook/async-states.md +71 -61
  11. package/dist/data/playbook/data-grid.md +118 -101
  12. package/dist/data/playbook/feedback.md +103 -84
  13. package/dist/data/playbook/form.md +164 -134
  14. package/dist/data/playbook/overlay.md +97 -88
  15. package/dist/data/playbook/page-layout.md +95 -76
  16. package/dist/data/playbook/responsive-tokens.md +77 -58
  17. package/dist/data/recipes/admin-list-page.md +86 -0
  18. package/dist/data/recipes/async-state-section.md +60 -0
  19. package/dist/data/recipes/dashboard-overview.md +65 -0
  20. package/dist/data/recipes/detail-drawer.md +69 -0
  21. package/dist/data/recipes/modal-form.md +67 -0
  22. package/dist/data/recipes/settings-form-page.md +79 -0
  23. package/dist/index.d.ts +4 -23
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +31 -338
  26. package/dist/index.js.map +1 -1
  27. package/dist/loaders.d.ts +8 -0
  28. package/dist/loaders.d.ts.map +1 -0
  29. package/dist/loaders.js +120 -0
  30. package/dist/loaders.js.map +1 -0
  31. package/dist/recipes.d.ts +13 -0
  32. package/dist/recipes.d.ts.map +1 -0
  33. package/dist/recipes.js +82 -0
  34. package/dist/recipes.js.map +1 -0
  35. package/dist/responses.d.ts +8 -0
  36. package/dist/responses.d.ts.map +1 -0
  37. package/dist/responses.js +25 -0
  38. package/dist/responses.js.map +1 -0
  39. package/dist/text.d.ts +4 -0
  40. package/dist/text.d.ts.map +1 -0
  41. package/dist/text.js +20 -0
  42. package/dist/text.js.map +1 -0
  43. package/dist/tool-definitions.d.ts +3 -0
  44. package/dist/tool-definitions.d.ts.map +1 -0
  45. package/dist/tool-definitions.js +199 -0
  46. package/dist/tool-definitions.js.map +1 -0
  47. package/dist/tools.d.ts +4 -0
  48. package/dist/tools.d.ts.map +1 -0
  49. package/dist/tools.js +233 -0
  50. package/dist/tools.js.map +1 -0
  51. package/dist/types.d.ts +107 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +10 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +21 -16
@@ -2,43 +2,47 @@
2
2
 
3
3
  사용자에게 메시지 / 알림 / 결정 강제를 적용하는 약속.
4
4
 
5
- > 4 채널 명확 분리. **일시 vs 영속 / 인박스 vs 페이지 / 자유 vs 강제** 가 결정 기준.
5
+ > 4 채널 명확 분리. **일시 vs 영속 / 인박스 vs 페이지 / 자유 vs 강제** 가 결정
6
+ > 기준.
6
7
 
7
8
  ---
8
9
 
9
10
  ## 1. 4 채널 의도 분리
10
11
 
11
- | 채널 | 의도 | 사용자 액션 | mental model | 컴포넌트 |
12
- |---|---|---|---|---|
13
- | **Toast** | **일시적 알림** (1회 표시 후 사라짐) | 무시 가능 | 화면 corner 의 작은 알림 (자동 dismiss 4~6s) | `toast.success/error/info/warning(message, {description})` |
14
- | **Notification** (영속) | **놓치면 안 되는 경고** (사용자가 명시적 닫을 때까지 유지) | 명시 닫기 또는 action | 화면 상단/사이드의 banner (Inbox 같은 느낌) | `<Notification tone="warning" persistent>` — TBD (mds 추가 예정) |
15
- | **Banner** (inline) | **페이지 내 inline 안내** (해당 페이지의 상태) | 무시 가능 또는 dismiss | 페이지 내 box (정보/경고/에러) | `<Banner tone="info" variant="soft">` |
16
- | **Modal Dialog** | **결정 강제** (사용자 응답 받아야 진행) | confirm / cancel 필수 | 작업 중단 + 짧은 결정 | `Modal.confirm / alert / prompt` (overlay.md §5) |
12
+ | 채널 | 의도 | 사용자 액션 | mental model | 컴포넌트 |
13
+ | ----------------------- | ---------------------------------------------------------- | ---------------------- | -------------------------------------------- | ---------------------------------------------------------------- |
14
+ | **Toast** | **일시적 알림** (1회 표시 후 사라짐) | 무시 가능 | 화면 corner 의 작은 알림 (자동 dismiss 4~6s) | `toast.success/error/info/warning(message, {description})` |
15
+ | **Notification** (영속) | **놓치면 안 되는 경고** (사용자가 명시적 닫을 때까지 유지) | 명시 닫기 또는 action | 화면 상단/사이드의 banner (Inbox 같은 느낌) | `<Notification tone="warning" persistent>` — TBD (mds 추가 예정) |
16
+ | **Banner** (inline) | **페이지 내 inline 안내** (해당 페이지의 상태) | 무시 가능 또는 dismiss | 페이지 내 box (정보/경고/에러) | `<Banner tone="info" variant="soft">` |
17
+ | **Modal Dialog** | **결정 강제** (사용자 응답 받아야 진행) | confirm / cancel 필수 | 작업 중단 + 짧은 결정 | `Modal.confirm / alert / prompt` (overlay.md §5) |
17
18
 
18
19
  ### 핵심 차이
19
20
 
20
- - **시간** — Toast (일시 4-6s) / Banner (페이지 동안) / Notification (영속) / Dialog (응답까지)
21
- - **위치** — Toast (corner) / Banner (페이지 inline) / Notification (상단/사이드 inbox) / Dialog (centered overlay)
22
- - **간섭** — Toast (무시 가능) / Banner (무시 가능) / Notification (명시 닫기) / Dialog (응답 필수)
21
+ - **시간** — Toast (일시 4-6s) / Banner (페이지 동안) / Notification (영속) /
22
+ Dialog (응답까지)
23
+ - **위치** — Toast (corner) / Banner (페이지 inline) / Notification (상단/사이드
24
+ inbox) / Dialog (centered overlay)
25
+ - **간섭** — Toast (무시 가능) / Banner (무시 가능) / Notification (명시 닫기) /
26
+ Dialog (응답 필수)
23
27
 
24
28
  ---
25
29
 
26
30
  ## 2. 결정 표 (lookup)
27
31
 
28
- | 케이스 | 답 |
29
- |---|---|
30
- | "저장됐어요" | `toast.success("저장됨")` |
31
- | "서버 500 에러" | `toast.error("저장 실패", { description: getErrorDisplayMessage(error) })` |
32
- | "백그라운드 동기화 중" | `toast.info("동기화 중")` 또는 silent (Step 4.7 async-states) |
33
- | "비밀번호 강도 약함" (input 안 hint) | `Field.Hint` (form.md §3) |
34
- | "form 422 검증 에러 요약" (상단) | `<Banner tone="danger">` |
35
- | "라이선스 만료 7일 남음" (영속) | `<Notification tone="warning" persistent>` (mds 추가 예정) |
36
- | "결제 카드 만료" (매번 페이지 진입 시) | `<Notification persistent>` 또는 dashboard 의 `<Banner>` |
37
- | "이 페이지는 베타입니다" (페이지 inline) | `<Banner tone="info" variant="soft">` |
38
- | "정말 삭제할까요?" | `Modal.confirm` (Dialog) |
39
- | "환불 사유 입력해주세요" | `Modal.prompt` (Dialog with input) |
40
- | "주문 완료" 페이지 진입 시 일회성 | `toast.success` (즉시 사라짐) |
41
- | "주문 완료" 페이지에 항상 표시 | `<Banner tone="success">` (페이지 안 inline) |
32
+ | 케이스 | 답 |
33
+ | ---------------------------------------- | -------------------------------------------------------------------------- |
34
+ | "저장됐어요" | `toast.success("저장됨")` |
35
+ | "서버 500 에러" | `toast.error("저장 실패", { description: getErrorDisplayMessage(error) })` |
36
+ | "백그라운드 동기화 중" | `toast.info("동기화 중")` 또는 silent (Step 4.7 async-states) |
37
+ | "비밀번호 강도 약함" (input 안 hint) | `Field.Hint` (form.md §3) |
38
+ | "form 422 검증 에러 요약" (상단) | `<Banner tone="danger">` |
39
+ | "라이선스 만료 7일 남음" (영속) | `<Notification tone="warning" persistent>` (mds 추가 예정) |
40
+ | "결제 카드 만료" (매번 페이지 진입 시) | `<Notification persistent>` 또는 dashboard 의 `<Banner>` |
41
+ | "이 페이지는 베타입니다" (페이지 inline) | `<Banner tone="info" variant="soft">` |
42
+ | "정말 삭제할까요?" | `Modal.confirm` (Dialog) |
43
+ | "환불 사유 입력해주세요" | `Modal.prompt` (Dialog with input) |
44
+ | "주문 완료" 페이지 진입 시 일회성 | `toast.success` (즉시 사라짐) |
45
+ | "주문 완료" 페이지에 항상 표시 | `<Banner tone="success">` (페이지 안 inline) |
42
46
 
43
47
  ---
44
48
 
@@ -46,12 +50,12 @@
46
50
 
47
51
  ### Toast tone
48
52
 
49
- | Tone | 사용 | 색 |
50
- |---|---|---|
51
- | success | 저장 / 완료 / 성공 | green |
52
- | error | 실패 / 5xx / network | red |
53
- | warning | 주의 / 약한 에러 / 부분 성공 | amber |
54
- | info | 정보 / 진행 / 백그라운드 알림 | blue |
53
+ | Tone | 사용 | 색 |
54
+ | ------- | ----------------------------- | ----- |
55
+ | success | 저장 / 완료 / 성공 | green |
56
+ | error | 실패 / 5xx / network | red |
57
+ | warning | 주의 / 약한 에러 / 부분 성공 | amber |
58
+ | info | 정보 / 진행 / 백그라운드 알림 | blue |
55
59
 
56
60
  ### Toast 패턴
57
61
 
@@ -81,7 +85,8 @@ toast.promise(saveOrder(), {
81
85
  ### Toast 위치
82
86
 
83
87
  - mds 의 `<Toaster position="top-right">` (root layout 에 mount)
84
- - position 변경 — `Toaster` prop (top-left / top-right / top-center / bottom-* / etc.)
88
+ - position 변경 — `Toaster` prop (top-left / top-right / top-center / bottom-\*
89
+ / etc.)
85
90
  - mobile = top-center 권장 (TBD)
86
91
 
87
92
  ---
@@ -110,20 +115,21 @@ import { Banner } from '@makitt/mds';
110
115
 
111
116
  ### Banner tone + variant
112
117
 
113
- | Tone | variant | 의도 |
114
- |---|---|---|
115
- | info | soft (default) | 일반 정보 안내 |
116
- | success | soft | 페이지 단위 성공 (예: "주문 완료") |
117
- | warning | soft | 주의 / 만료 임박 |
118
- | danger | soft | 페이지 에러 / 결제 만료 |
119
- | (각 tone) | solid | 강조 — 큰 announcement (시스템 점검 등) |
120
- | (각 tone) | outline | 약한 정보 |
118
+ | Tone | variant | 의도 |
119
+ | --------- | -------------- | --------------------------------------- |
120
+ | info | soft (default) | 일반 정보 안내 |
121
+ | success | soft | 페이지 단위 성공 (예: "주문 완료") |
122
+ | warning | soft | 주의 / 만료 임박 |
123
+ | danger | soft | 페이지 에러 / 결제 만료 |
124
+ | (각 tone) | solid | 강조 — 큰 announcement (시스템 점검 등) |
125
+ | (각 tone) | outline | 약한 정보 |
121
126
 
122
127
  ---
123
128
 
124
129
  ## 5. Notification (영속) — `overlays/Notification/` (Step 14 완료)
125
130
 
126
- 영속 알림 inbox + Compound API. `notificationStore` (sessionStorage persist) + `useNotification()` hook.
131
+ 영속 알림 inbox + Compound API. `notificationStore` (sessionStorage persist) +
132
+ `useNotification()` hook.
127
133
 
128
134
  ### Compound API
129
135
 
@@ -134,12 +140,15 @@ import { Notification, useNotification } from '@makitt/mds';
134
140
  <Drawer.Root>
135
141
  <Drawer.Trigger>알림</Drawer.Trigger>
136
142
  <Drawer.Content side="right">
137
- <Drawer.Header><Drawer.Title>알림</Drawer.Title><Drawer.Close /></Drawer.Header>
143
+ <Drawer.Header>
144
+ <Drawer.Title>알림</Drawer.Title>
145
+ <Drawer.Close />
146
+ </Drawer.Header>
138
147
  <Drawer.Body>
139
- <Notification.Root /> {/* store-bound list 자동 render */}
148
+ <Notification.Root /> {/* store-bound list 자동 render */}
140
149
  </Drawer.Body>
141
150
  </Drawer.Content>
142
- </Drawer.Root>
151
+ </Drawer.Root>;
143
152
 
144
153
  // (B) imperative API — 알림 추가
145
154
  const { push, markRead, dismiss, clear } = useNotification();
@@ -154,11 +163,16 @@ push({
154
163
 
155
164
  ### 핵심
156
165
 
157
- - **`overlays/Notification/`** layer — 알림 센터 는 Drawer / Popover overlay 안 mount (caller 위치 결정, mds 강요 X)
158
- - **`notificationStore`** — sessionStorage persist ( session 자동 clear, 동일 session 의 dismiss state 유지)
159
- - **`useNotification()`** hook items / unreadCount / push / markRead / markAllRead / dismiss / clear
160
- - **Compound parts** `Notification.Root` (store-bound list + header + auto empty state)
161
- - **4 level**info / success / warning / danger (axe-pass: `role="alert"` for warning/danger, `role="status"` for info/success)
166
+ - **`overlays/Notification/`** layer — 알림 센터 는 Drawer / Popover overlay 안
167
+ mount (caller 위치 결정, mds 강요 X)
168
+ - **`notificationStore`** — sessionStorage persist (새 session 자동 clear,
169
+ 동일 session dismiss state 유지)
170
+ - **`useNotification()`** hookitems / unreadCount / push / markRead /
171
+ markAllRead / dismiss / clear
172
+ - **Compound parts** — `Notification.Root` (store-bound list + header + auto
173
+ empty state)
174
+ - **4 level** — info / success / warning / danger (axe-pass: `role="alert"` for
175
+ warning/danger, `role="status"` for info/success)
162
176
 
163
177
  ### Banner 와 차이
164
178
 
@@ -169,24 +183,25 @@ push({
169
183
  ### TBD (별도 cycle)
170
184
 
171
185
  - Server-side dismiss persistence (현재 = sessionStorage client only)
172
- - Sub-component 분리 export (`Notification.Header`, `Notification.Item`, `Notification.EmptyState`)
186
+ - Sub-component 분리 export (`Notification.Header`, `Notification.Item`,
187
+ `Notification.EmptyState`)
173
188
 
174
189
  ---
175
190
 
176
191
  ## 6. Modal Dialog — 결정 강제 (overlay.md §5 참조)
177
192
 
178
- | Dialog | 사용 |
179
- |---|---|
193
+ | Dialog | 사용 |
194
+ | --------------- | -------------------------------------- |
180
195
  | `Modal.confirm` | 위험 액션 ("정말 삭제?"), 영향 큰 결정 |
181
- | `Modal.alert` | 정보 알림 (응답 필수 — 그러나 OK 만) |
182
- | `Modal.prompt` | 단일 input + 응답 |
196
+ | `Modal.alert` | 정보 알림 (응답 필수 — 그러나 OK 만) |
197
+ | `Modal.prompt` | 단일 input + 응답 |
183
198
 
184
199
  ### Dialog vs Toast
185
200
 
186
- | 의도 | 채널 |
187
- |---|---|
188
- | 사용자 결정 받아야 진행 | **Dialog** |
189
- | 알림만 (사용자 응답 필요 X) | **Toast** |
201
+ | 의도 | 채널 |
202
+ | --------------------------- | ---------- |
203
+ | 사용자 결정 받아야 진행 | **Dialog** |
204
+ | 알림만 (사용자 응답 필요 X) | **Toast** |
190
205
 
191
206
  → Toast 로 "OK" 응답 받지 말 것. Dialog 가 정답.
192
207
 
@@ -194,18 +209,19 @@ push({
194
209
 
195
210
  ## 7. Mobile 변형
196
211
 
197
- | 채널 | Mobile 변형 |
198
- |---|---|
199
- | Toast | position = top-center (default top-right 대신) |
200
- | Banner | full-width, padding 줄임 |
201
- | Notification | top of viewport (sidebar inbox X) |
202
- | Dialog | 그대로 또는 bottom Sheet (Step 4.4 overlay) |
212
+ | 채널 | Mobile 변형 |
213
+ | ------------ | ---------------------------------------------- |
214
+ | Toast | position = top-center (default top-right 대신) |
215
+ | Banner | full-width, padding 줄임 |
216
+ | Notification | top of viewport (sidebar inbox X) |
217
+ | Dialog | 그대로 또는 bottom Sheet (Step 4.4 overlay) |
203
218
 
204
219
  ---
205
220
 
206
221
  ## 8. 안티 패턴
207
222
 
208
- - ❌ **Toast 로 "정말 삭제?"** — Toast 는 dismissible. 응답 못 받음. **Dialog 가 정답**
223
+ - ❌ **Toast 로 "정말 삭제?"** — Toast 는 dismissible. 응답 못 받음. **Dialog 가
224
+ 정답**
209
225
  - ❌ **Notification 으로 "저장됨"** — 영속 의도 아님. **Toast 가 정답**
210
226
  - ❌ **Banner 와 Toast 동일 메시지 동시** — 한 곳만
211
227
  - ❌ **Toast 5+ 동시** — 사용자 인지 한계. mds 의 stacking 제한 활용
@@ -217,16 +233,16 @@ push({
217
233
 
218
234
  ## 9. 일시 vs 영속 의사결정 매트릭스
219
235
 
220
- | 시나리오 | 일시 (Toast) | 영속 (Banner / Notification) |
221
- |---|---|---|
222
- | 저장 success | ✓ | — |
223
- | 서버 에러 (한번 발생) | ✓ | — |
224
- | 백그라운드 동기화 | ✓ | — |
225
- | 라이선스 만료 (전체 영향) | — | ✓ (Notification) |
226
- | 결제 카드 만료 (모든 페이지) | — | ✓ (Notification) |
227
- | 이 페이지 특정 상태 (예: 베타) | — | ✓ (Banner) |
228
- | 페이지 안 form 의 422 에러 요약 | — | ✓ (Banner) |
229
- | 시스템 점검 announce | — | ✓ (Banner solid) |
236
+ | 시나리오 | 일시 (Toast) | 영속 (Banner / Notification) |
237
+ | ------------------------------- | ------------ | ---------------------------- |
238
+ | 저장 success | ✓ | — |
239
+ | 서버 에러 (한번 발생) | ✓ | — |
240
+ | 백그라운드 동기화 | ✓ | — |
241
+ | 라이선스 만료 (전체 영향) | — | ✓ (Notification) |
242
+ | 결제 카드 만료 (모든 페이지) | — | ✓ (Notification) |
243
+ | 이 페이지 특정 상태 (예: 베타) | — | ✓ (Banner) |
244
+ | 페이지 안 form 의 422 에러 요약 | — | ✓ (Banner) |
245
+ | 시스템 점검 announce | — | ✓ (Banner solid) |
230
246
 
231
247
  > 핵심 — **놓치면 안 되는가** 가 영속 결정. Toast 는 놓쳐도 OK.
232
248
 
@@ -234,22 +250,24 @@ push({
234
250
 
235
251
  ## 10. Cross-cutting
236
252
 
237
- | Axis | 적용 |
238
- |---|---|
239
- | **Responsive** | Toast position 모바일 변환 / Banner full-width |
240
- | **A11y** | `role="status"` (success/info) / `role="alert"` (error/warning) / `aria-live="polite"` (info) / `assertive` (error) |
241
- | **Telemetry** | error toast / banner click 추적 (Step 7) |
242
- | **i18n** | 모든 메시지 `t()` 통과 |
243
- | **AI fill** | AI 가 form 채운 후 `<FormFillApprovalBanner>` (Banner 형태) — Step 4.8 |
253
+ | Axis | 적용 |
254
+ | -------------- | ------------------------------------------------------------------------------------------------------------------- |
255
+ | **Responsive** | Toast position 모바일 변환 / Banner full-width |
256
+ | **A11y** | `role="status"` (success/info) / `role="alert"` (error/warning) / `aria-live="polite"` (info) / `assertive` (error) |
257
+ | **Telemetry** | error toast / banner click 추적 (Step 7) |
258
+ | **i18n** | 모든 메시지 `t()` 통과 |
259
+ | **AI fill** | AI 가 form 채운 후 `<FormFillApprovalBanner>` (Banner 형태) — Step 4.8 |
244
260
 
245
261
  ---
246
262
 
247
263
  ## 11. TBD
248
264
 
249
- 1. **Notification 영속 컴포넌트 mds 추가** — design + mount 위치 + persistence (sessionStorage / 서버)
265
+ 1. **Notification 영속 컴포넌트 mds 추가** — design + mount 위치 + persistence
266
+ (sessionStorage / 서버)
250
267
  2. **Toast position mobile** — top-center default 자동 변환
251
268
  3. **Toast stacking 최대** — 현재 5 권장? 정확 결정
252
- 4. **Dialog 외 영구 alert** (예: 시스템 maintenance) — `<Banner solid>` 또는 별도
269
+ 4. **Dialog 외 영구 alert** (예: 시스템 maintenance) — `<Banner solid>` 또는
270
+ 별도
253
271
  5. **Notification 의 read/unread 상태** — inbox 패턴 (Slack 처럼) 필요 여부
254
272
 
255
273
  ---
@@ -258,5 +276,6 @@ push({
258
276
 
259
277
  - [form.md](./form.md) — Form 의 검증 에러 (Banner + Field.Error) (Step 4.1)
260
278
  - [overlay.md](./overlay.md) — Modal.confirm / alert / prompt (Step 4.4)
261
- - [async-states.md](./async-states.md) — Background loading 의 toast vs silent (Step 4.7)
279
+ - [async-states.md](./async-states.md) — Background loading 의 toast vs silent
280
+ (Step 4.7)
262
281
  - [ai-fill.md](./ai-fill.md) — FormFillApprovalBanner (Step 4.8)