@ncds/ui-admin-mcp 1.0.0-alpha.20 → 1.0.0-alpha.21

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.
@@ -895,13 +895,7 @@
895
895
  "수직 테이블",
896
896
  "form-vertical-table"
897
897
  ],
898
- "bemClassesExtra": [
899
- "ncua-table--in-data-grid",
900
- "ncua-table__required",
901
- "ncua-table__cell--with-tooltip",
902
- "ncua-table__cell-inner",
903
- "ncua-table__cell-label"
904
- ],
898
+ "bemClassesExtra": ["ncua-table--in-data-grid", "ncua-table__required"],
905
899
  "allowedChildren": {
906
900
  "Table": ["Table.Header", "Table.Body", "Table.Footer", "Table.ColGroup", "Table.Empty"],
907
901
  "Table.Header": ["Table.Row"],
@@ -1049,7 +1043,7 @@
1049
1043
  }
1050
1044
  },
1051
1045
  "vertical-form-label-with-required": {
1052
- "description": "P7/P12: Vertical Table 필수 라벨 표기 표준. ⚠️ ncua-table__required 는 NCDS Table SCSS 에서 font-size: var(--font-size-sm) (14px) 로 정의되는데 라벨 텍스트는 var(--font-size-xs) (13px) baseline 어긋남. 정렬 보정을 위해 페이지 prefix wrapper inline-flex + align-items: center 적용 권장. wrapper 클래스명은 페이지 prefix 통일 (예: 'page-vlabel') — 페이지 SCSS 에 .page-vlabel { display: inline-flex; align-items: center; gap: 4px; } .page-vlabel .ncua-table__required { line-height: 1; } 정의. component descriptor 트리로는 wrapper + raw span 을 한 번에 표현 불가 → render_to_html 출력 후 페이지 코드에서 wrapper 추가하거나, 라벨 텍스트 자체에 markup 포함 string 으로 전달. P16: 안내 Tooltip 이 필요하면 본 시나리오 대신 'vertical-form-label-with-tooltip' 사용하거나, 시나리오의 라벨 Cell `tooltip: TooltipProps` prop 을 추가하면 된다 (Cell 내부 ncua-table__cell-inner / ncua-table__cell-label 로 자동 wrapping — 별도 페이지 wrapper 불필요).",
1046
+ "description": "P7/P12: Vertical Table 필수 라벨 표기 표준. ncua-table__required 는 라벨 텍스트 앞에 `<span class='ncua-table__required'>*</span>` 형태로 prepend. 라벨 (Table.Cell with isHeader=true) children 자식이 raw markup string, 번째가 라벨 텍스트. ⚠️ component descriptor 트리로 페이지 prefix wrapper(예: page-vlabel) + raw span 을 한 번에 표현 불가 → render_to_html 출력 후 페이지 코드에서 추가하거나, 시나리오처럼 markup children string 으로 전달. P16: 안내 Tooltip 이 필요하면 'vertical-form-label-with-tooltip' 시나리오 사용 Table.Cell tooltip prop 을 받지 않으며 라벨 셀의 children 합성한다.",
1053
1047
  "props": {
1054
1048
  "type": "vertical",
1055
1049
  "children": [
@@ -1112,7 +1106,7 @@
1112
1106
  }
1113
1107
  },
1114
1108
  "vertical-form-label-with-tooltip": {
1115
- "description": "P16/P23: Vertical Table 라벨 + 안내 Tooltip 표준. 라벨 안내 아이콘은 Table.Cell.tooltip prop 으로 전달 Cell 내부에 ncua-table__cell-inner / ncua-table__cell-label / .ncua-tooltip 구조로 자동 wrapping (ncua-table__cell--with-tooltip modifier 적용). 페이지 prefix wrapper(예: page-vlabel, sgr-tooltip-wrapper) 또는 라벨 외부에 별도 Tooltip 컴포넌트 배치 금지 정렬 어긋남 + 발명 클래스 hallucination 주원인. tooltip 값은 NCDS Tooltip React props 그대로 (type='short'/'long', tooltipType='black'/'white', content/title 등). ⚠️ P23: 출력 BEM 반드시 `<th scope='row' class='ncua-table__cell ncua-table__cell--with-tooltip'>` — `<th class='ncua-required'>` 같은 발명 클래스 사용 금지 (NCDS 미제공). 필수 마크는 `<span class='ncua-table__required'>*</span>` 을 라벨 텍스트 앞에 prepend. ⚠️ CDN HTML 모드에서는 tooltip 영역이 placeholder + script — CDN JS 마운트 후 anchor span 에 `<div data-tooltip-seq data-tooltip-initialized>` wrapper + `<span class='ncua-tooltip__icon'>` SVG wrapper + inline style 자동 부착. 결과 DOM 보고 '정적 출력 = NCDS 표준' 으로 오인해 페이지에서 직접 작성하지 말 것.",
1109
+ "description": "P16/P23: Vertical Table 라벨 + 안내 Tooltip 표준 합성 패턴. Table.Cell 의 children 에 div wrapper 한 단계를 두고 그 안에 [필수 마크 span(필요 시), 라벨 텍스트, Tooltip 컴포넌트] 순으로 합성한다. NCDS Table SCSS vertical 모드 룰이 Tooltip 앵커 span 을 자식으로 가진 div(셀렉터: `th:first-child > div:has(> .ncua-tooltip)`)에 한해 inline-flex 정렬을 자동 적용하므로 라벨과 합성 자식이 같은 선상에 배치된다. Tooltip 앵커 박스와 CDN JS 마운트 후 자동 생성되는 icon wrapper span(`.ncua-tooltip__icon`) 모두 SVG 크기(14px) 수축되어 React 출력과 CDN HTML 출력 양쪽에서 동일한 박스 메트릭으로 정렬된다. spacing 은 자식별 margin 으로 관리(Required: margin-right 4px, Tooltip: margin-left 4px) wrapper flex gap 미사용. ⚠️ 사용 금지: (a) Table.Cell tooltip prop 전달(시그니처에 없음). (b) ncua-table__cell--with-tooltip 모디파이어(NCDS 미정의). (c) ncua-table__cell-inner / ncua-table__cell-label 자동 wrapper(생성 안 됨). (d) 페이지 prefix wrapper(page-vlabel, sgr-tooltip-wrapper 등) 외부 배치 — 정렬 어긋남 + hallucination 주원인. ⚠️ 출력 BEM 표준은 라벨 셀이 모디파이어 없는 `<th scope='row' class='ncua-table__cell'><div>...<span class='ncua-tooltip ...'>...</span></div></th>` — th 추가 클래스 없음, div wrapper 정렬 책임. ⚠️ CDN HTML 모드의 tooltip 영역은 정적 placeholder + script — CDN JS 마운트 후 anchor span 에 `<div data-tooltip-seq data-tooltip-initialized>` wrapper + `<span class='ncua-tooltip__icon'>` SVG wrapper + inline style 자동 부착. 정적 출력을 그대로 페이지 코드로 작성하지 말고 render_to_html 출력 + CDN 스크립트 마운트 흐름을 따를 것. Tooltip 의 props 는 render_to_html 의 tooltip 컴포넌트 spec 그대로 사용(type 'short'|'long', tooltipType 'black'|'white', title, content, position 등).",
1116
1110
  "props": {
1117
1111
  "type": "vertical",
1118
1112
  "children": [
@@ -1121,19 +1115,16 @@
1121
1115
  "children": [
1122
1116
  {
1123
1117
  "component": "table.row",
1124
- "_note": "필수 + 안내 tooltip 라벨. children 자식은 ncua-table__required span raw markup, 번째는 라벨 텍스트. tooltip props.tooltip 으로 전달Cell 내부에서 라벨과 함께 inline-flex wrapping.",
1118
+ "_note": "필수 + 안내 tooltip 라벨. Table.Cell 의 children 트리는 div wrapper 한 단계 안에 [필수 마크 span raw markup, 라벨 텍스트, Tooltip 컴포넌트] 순으로 합성. tree 표현 한계로 div 와 Tooltip 자식을 한 markup string 으로 묶고 anchor 만 placeholder 로 표시 render_to_html 출력이 사용 환경에 맞춰 실제 Tooltip 마크업으로 채운다.",
1125
1119
  "children": [
1126
1120
  {
1127
1121
  "component": "table.cell",
1128
1122
  "props": {
1129
- "isHeader": true,
1130
- "tooltip": {
1131
- "type": "short",
1132
- "tooltipType": "black",
1133
- "content": "외부에 노출되는 상품명입니다. 50자 이내로 입력하세요."
1134
- }
1123
+ "isHeader": true
1135
1124
  },
1136
- "children": ["<span class=\"ncua-table__required\">*</span>", "상품명"]
1125
+ "children": [
1126
+ "<div><span class=\"ncua-table__required\">*</span>상품명<span class=\"ncua-tooltip ncua-tooltip--sm ncua-tooltip--short ncua-tooltip--stroke\"></span></div>"
1127
+ ]
1137
1128
  },
1138
1129
  {
1139
1130
  "component": "table.cell",
@@ -1143,20 +1134,16 @@
1143
1134
  },
1144
1135
  {
1145
1136
  "component": "table.row",
1146
- "_note": "비필수 + 안내 tooltip. required span 없이 텍스트 + tooltip prop.",
1137
+ "_note": "비필수 + 안내 tooltip. 필수 마크 span 없이 div wrapper 안에 [라벨 텍스트, Tooltip 컴포넌트] 합성. children 트리는 위 row 와 동일 구조에서 Required span 만 빠진 형태.",
1147
1138
  "children": [
1148
1139
  {
1149
1140
  "component": "table.cell",
1150
1141
  "props": {
1151
- "isHeader": true,
1152
- "tooltip": {
1153
- "type": "long",
1154
- "tooltipType": "white",
1155
- "title": "카테고리 안내",
1156
- "content": "상품을 분류하는 최상위 카테고리입니다. 변경 시 검색·노출 영역에 영향."
1157
- }
1142
+ "isHeader": true
1158
1143
  },
1159
- "children": ["카테고리"]
1144
+ "children": [
1145
+ "<div>카테고리<span class=\"ncua-tooltip ncua-tooltip--sm ncua-tooltip--long ncua-tooltip--stroke\"></span></div>"
1146
+ ]
1160
1147
  },
1161
1148
  {
1162
1149
  "component": "table.cell",
@@ -2414,21 +2401,7 @@
2414
2401
  "notification": {
2415
2402
  "_note": "P20/P22: Notification 은 비차단 알림 컴포넌트. type ∈ {floating, full-width, message} × color ∈ {neutral, error, warning, success, info} 매트릭스 (단, floating 은 info 색상 미지원). props 기반 — subComponents 없음. ⚠️⚠️ BEM prefix 는 type 별로 분리: type='floating' → `ncua-floating-notification__*`, type='full-width' → `ncua-full-width-notification__*`, type='message' → `ncua-message-notification__*`. **generic 한 `ncua-notification__*` prefix 는 존재하지 않음** — godomall5 페이지에서 발견된 가짜 BEM. floating 은 페이지 우측 영역 자동 노출(autoClose 지원), full-width 는 화면 상단 가로 배너, message 는 인라인 메시지 박스. onHidePermanently 는 message / full-width 에서만 동작. React 컴포넌트 + CDN CSS 완비 — 반드시 render_to_html('notification', {...}) 호출해 정확한 type-prefix BEM 출력을 받아 그대로 사용.",
2416
2403
  "descriptionExtra": "[중요] 비차단 알림 컴포넌트. type 으로 표현 형태(floating/full-width/message) 결정, color 로 상태(neutral/error/warning/success/info) 결정. ⚠️ BEM prefix 가 type 별로 다름: floating→ncua-floating-notification__*, full-width→ncua-full-width-notification__*, message→ncua-message-notification__*. generic ncua-notification__* prefix 는 존재하지 않으니 절대 직접 작성 금지 — render_to_html 출력 그대로 사용. type='floating' 은 color='info' 미지원. autoClose 는 floating 전용 (밀리초). onHidePermanently 는 message / full-width 전용. 페이지 prefix wrapper(toast-wrapper, alert-banner 등) 우회 금지.",
2417
- "bemClassesExtra": [
2418
- "ncua-floating-notification",
2419
- "ncua-floating-notification__container",
2420
- "ncua-floating-notification__content",
2421
- "ncua-floating-notification__title",
2422
- "ncua-floating-notification__icon",
2423
- "ncua-full-width-notification",
2424
- "ncua-full-width-notification__container",
2425
- "ncua-full-width-notification__content",
2426
- "ncua-full-width-notification__title",
2427
- "ncua-message-notification",
2428
- "ncua-message-notification__container",
2429
- "ncua-message-notification__content",
2430
- "ncua-message-notification__title"
2431
- ],
2404
+ "bemClassesExtra": ["ncua-floating-notification__icon"],
2432
2405
  "aliasesExtra": [
2433
2406
  "알림",
2434
2407
  "알림창",
@@ -0,0 +1,54 @@
1
+ /**
2
+ * list_sidecar_overrides tool — composition.json sidecar 적용 현황 요약
3
+ *
4
+ * 신규 프로젝트에서 NCDS MCP 와 연결한 뒤, 어느 컴포넌트에 어떤 sidecar 보강이
5
+ * 들어가 있는지 표 형태(컴포넌트별 row)로 한 번에 확인하는 용도. 응답이 크지 않도록
6
+ * 시나리오 키 목록 + 카운트 위주로 구성하고, 상세는 get_component_props 로 유도.
7
+ *
8
+ * 순수 함수 — server.ts 부팅 시 1회 buildListSidecarOverridesResponse() 로 사전 직렬화.
9
+ */
10
+ import type { ComponentData } from '../types.js';
11
+ import type { CompositionEntry } from '../utils/dataLoader.js';
12
+ import { type McpToolResponse } from '../utils/response.js';
13
+ export interface SidecarOverrideSummary {
14
+ /** 컴포넌트 이름 (kebab-case) */
15
+ component: string;
16
+ /** canonicalExamples 시나리오 key 목록 — 비어있으면 [] */
17
+ canonicalExamples: string[];
18
+ /** legacy 단일 시나리오 canonicalExample 존재 여부 */
19
+ hasCanonicalExample: boolean;
20
+ /** bemClassesExtra 항목 수 */
21
+ bemClassesExtra: number;
22
+ /** allowedChildren 정의된 부모 키 목록 (예: ["Table", "Table.Header", ...]) */
23
+ allowedChildrenKeys: string[];
24
+ /** allowedParents 정의된 자식 키 목록 */
25
+ allowedParentsKeys: string[];
26
+ /** descriptionExtra 존재 여부 */
27
+ descriptionExtra: boolean;
28
+ /** aliasesExtra 항목 수 */
29
+ aliasesExtra: number;
30
+ /** AI 의 UI 작성 정확도 추정 점수 (0.0 ~ 1.0). 시나리오 + compound 제약 + validate 정확도 + 자연어 보강의 가중 합. */
31
+ coverageScore: number;
32
+ /** 컴포넌트 구조상 의미 있게 달성 가능한 최대 점수. compound 컴포넌트(subComponents 보유): 1.0, 그 외: 0.8. */
33
+ maxAchievable: number;
34
+ /** coverageScore / maxAchievable — 컴포넌트별 천장 대비 충족율 (0.0 ~ 1.0). 절대 점수가 낮아도 비율이 1.0 이면 더 보강할 게 없다. */
35
+ coverageRatio: number;
36
+ /** coverageScore 한 줄 해석 — high/medium/low 와 강점 영역 요약 */
37
+ coverageNote: string;
38
+ }
39
+ export interface ListSidecarOverridesResult {
40
+ /** sidecar 적용 컴포넌트 수 */
41
+ total: number;
42
+ /** 각 척도가 무엇을 의미하고 AI 의 UI 작성 정확도에 어떻게 영향을 주는지 (AI 가 본 응답을 바로 해석하도록 동봉) */
43
+ metrics: Record<string, string>;
44
+ /** coverageScore 산식 (가중치 명시) */
45
+ coverageScoreFormula: string;
46
+ /** 컴포넌트별 요약 row 배열 — coverageScore 내림차순, 동률은 컴포넌트 이름 알파벳 */
47
+ overrides: SidecarOverrideSummary[];
48
+ }
49
+ /** sidecar map → 요약 결과 (순수 함수). coverageRatio 내림차순 + 동률은 coverageScore + 이름 알파벳 */
50
+ export declare const buildSidecarOverridesSummary: (sidecar: Record<string, CompositionEntry>, componentMap: Map<string, ComponentData>) => ListSidecarOverridesResult;
51
+ /** server.ts 부팅 시 1회 호출 — 응답 사전 직렬화 */
52
+ export declare const buildListSidecarOverridesResponse: (sidecar: Record<string, CompositionEntry>, componentMap: Map<string, ComponentData>) => McpToolResponse;
53
+ /** list_sidecar_overrides tool — 사전 직렬화된 응답을 그대로 반환 */
54
+ export declare const listSidecarOverrides: (prebuilt: McpToolResponse) => McpToolResponse;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listSidecarOverrides = exports.buildListSidecarOverridesResponse = exports.buildSidecarOverridesSummary = void 0;
4
+ const response_js_1 = require("../utils/response.js");
5
+ /** AI 가 UI 를 얼마나 정확히 그릴 수 있는지 추정 — 각 sidecar 보강이 다른 정확도 영역을 커버한다 */
6
+ const METRIC_DESCRIPTIONS = {
7
+ canonicalExamples: 'AI 가 시나리오별로 분기 가능한 정답 트리 수 (form / data-grid / with-tooltip 등). 가장 강한 정확도 신호 — 0 이면 AI 가 prop 조합을 추측해야 한다.',
8
+ hasCanonicalExample: 'legacy 단일 시나리오 존재 여부 — 진입용 표준 트리 1건. canonicalExamples 가 비어있는 컴포넌트의 fallback.',
9
+ bemClassesExtra: 'extract 가 못 잡은 BEM 클래스 화이트리스트 수. validate_html 이 합법/위법을 정확히 판정 — 발명 클래스 사용 차단력.',
10
+ allowedChildrenKeys: 'compound 부모-자식 제약 노드 수. 잘못된 자식 끼우기 / 컨텍스트 위반 (Table.Pagination in DataGrid 등) 차단력.',
11
+ allowedParentsKeys: '역방향 제약 노드 수 — 자식이 어느 부모 안에만 허용되는지 명시.',
12
+ descriptionExtra: 'list_components 응답에 자연어 용도/모드 명시 여부. 같은 컴포넌트가 다른 모드(horizontal/vertical) 로 쓰일 때 AI 가 모드를 인지하는 정확도.',
13
+ aliasesExtra: 'search_component 한국어/유사 키워드 매칭 별칭 수. AI 가 "폼 레이아웃", "세로 테이블" 같은 비공식 용어로 검색해도 정답 컴포넌트에 도달.',
14
+ maxAchievable: '구조상 의미 있게 도달 가능한 최대 점수. compound 컴포넌트(subComponents 보유): 1.0, 그 외(prop 배열로 항목 받는 컴포넌트 — menus/groups/optionItems 등): 0.8. allowedChildren 가중치(+0.20) 가 compound 가 아닌 컴포넌트에는 적용 불가하기 때문.',
15
+ coverageRatio: 'coverageScore / maxAchievable. 절대 점수보다 더 정확한 "보강 충족율" — 1.0 이면 해당 컴포넌트는 더 채울 영역이 없다. 0.8 미만이면 의미 있는 보강 여지 있음.',
16
+ };
17
+ const COVERAGE_FORMULA = 'canonicalExamples>=2: +0.50 (>=1 또는 hasCanonicalExample: +0.25) · allowedChildrenKeys>=2: +0.20 (>=1: +0.10) · bemClassesExtra>=1: +0.10 · descriptionExtra: +0.10 · aliasesExtra>=1: +0.10 · max 1.0. 임계값: high>=0.70, medium>=0.40, 그 외 low. 시나리오 가중치가 가장 큼 — AI hallucination 의 가장 강한 차단 신호이기 때문.';
18
+ const computeCoverageScore = (s) => {
19
+ let score = 0;
20
+ if (s.canonicalExamples.length >= 2)
21
+ score += 0.5;
22
+ else if (s.canonicalExamples.length >= 1 || s.hasCanonicalExample)
23
+ score += 0.25;
24
+ if (s.allowedChildrenKeys.length >= 2)
25
+ score += 0.2;
26
+ else if (s.allowedChildrenKeys.length >= 1)
27
+ score += 0.1;
28
+ if (s.bemClassesExtra >= 1)
29
+ score += 0.1;
30
+ if (s.descriptionExtra)
31
+ score += 0.1;
32
+ if (s.aliasesExtra >= 1)
33
+ score += 0.1;
34
+ return Math.min(1, Math.round(score * 100) / 100);
35
+ };
36
+ /** 컴포넌트 구조상 의미 있게 도달 가능한 최대 점수.
37
+ * compound (subComponents 보유): canonicalExamples 0.5 + allowedChildren 0.2 + bem 0.1 + desc 0.1 + alias 0.1 = 1.0.
38
+ * non-compound: allowedChildren 항목이 의미 없음 → 0.8 cap. */
39
+ const computeMaxAchievable = (isCompound) => (isCompound ? 1.0 : 0.8);
40
+ const noteFor = (s, score) => {
41
+ const strengths = [];
42
+ if (s.canonicalExamples.length >= 2)
43
+ strengths.push(`시나리오 ${s.canonicalExamples.length}`);
44
+ else if (s.canonicalExamples.length >= 1 || s.hasCanonicalExample)
45
+ strengths.push('시나리오 1');
46
+ if (s.allowedChildrenKeys.length >= 1)
47
+ strengths.push(`compound 제약 ${s.allowedChildrenKeys.length}`);
48
+ if (s.bemClassesExtra >= 1)
49
+ strengths.push(`BEM 화이트리스트 ${s.bemClassesExtra}`);
50
+ if (s.descriptionExtra)
51
+ strengths.push('모드 인지 보강');
52
+ if (s.aliasesExtra >= 1)
53
+ strengths.push(`검색 별칭 ${s.aliasesExtra}`);
54
+ const tier = score >= 0.7 ? 'high' : score >= 0.4 ? 'medium' : 'low';
55
+ return strengths.length > 0 ? `${tier} · ${strengths.join(' + ')}` : `${tier} · 보강 거의 없음 — 직접 작성 hallucination 위험`;
56
+ };
57
+ /** 단일 entry 를 row 로 변환 — componentMap 으로 compound 여부 결정해 maxAchievable 계산 */
58
+ const toSummary = (component, entry, componentMap) => {
59
+ const base = {
60
+ component,
61
+ canonicalExamples: Object.keys(entry.canonicalExamples ?? {}).filter((k) => !k.startsWith('_')),
62
+ hasCanonicalExample: !!entry.canonicalExample,
63
+ bemClassesExtra: (entry.bemClassesExtra ?? []).length,
64
+ allowedChildrenKeys: Object.keys(entry.allowedChildren ?? {}),
65
+ allowedParentsKeys: Object.keys(entry.allowedParents ?? {}),
66
+ descriptionExtra: !!entry.descriptionExtra,
67
+ aliasesExtra: (entry.aliasesExtra ?? []).length,
68
+ };
69
+ const coverageScore = computeCoverageScore(base);
70
+ const subComponentCount = Object.keys(componentMap.get(component)?.subComponents ?? {}).length;
71
+ const isCompound = subComponentCount > 0;
72
+ const maxAchievable = computeMaxAchievable(isCompound);
73
+ const coverageRatio = Math.round((coverageScore / maxAchievable) * 100) / 100;
74
+ return { ...base, coverageScore, maxAchievable, coverageRatio, coverageNote: noteFor(base, coverageScore) };
75
+ };
76
+ /** sidecar map → 요약 결과 (순수 함수). coverageRatio 내림차순 + 동률은 coverageScore + 이름 알파벳 */
77
+ const buildSidecarOverridesSummary = (sidecar, componentMap) => {
78
+ const overrides = Object.entries(sidecar)
79
+ .map(([component, entry]) => toSummary(component, entry, componentMap))
80
+ .sort((a, b) => b.coverageRatio - a.coverageRatio ||
81
+ b.coverageScore - a.coverageScore ||
82
+ a.component.localeCompare(b.component));
83
+ return {
84
+ total: overrides.length,
85
+ metrics: METRIC_DESCRIPTIONS,
86
+ coverageScoreFormula: COVERAGE_FORMULA,
87
+ overrides,
88
+ };
89
+ };
90
+ exports.buildSidecarOverridesSummary = buildSidecarOverridesSummary;
91
+ /** server.ts 부팅 시 1회 호출 — 응답 사전 직렬화 */
92
+ const buildListSidecarOverridesResponse = (sidecar, componentMap) => (0, response_js_1.successResponse)((0, exports.buildSidecarOverridesSummary)(sidecar, componentMap));
93
+ exports.buildListSidecarOverridesResponse = buildListSidecarOverridesResponse;
94
+ /** list_sidecar_overrides tool — 사전 직렬화된 응답을 그대로 반환 */
95
+ const listSidecarOverrides = (prebuilt) => prebuilt;
96
+ exports.listSidecarOverrides = listSidecarOverrides;
package/bin/version.d.ts CHANGED
@@ -3,4 +3,4 @@
3
3
  * scripts/generate-version-ts.ts 가 ui-admin/package.json 의 version 으로부터 자동 생성한다.
4
4
  * 수동 편집 금지 — 빌드(`pnpm generate:version-ts` 또는 `pnpm build`) 시 덮어쓰여진다.
5
5
  */
6
- export declare const VERSION = "1.8.7";
6
+ export declare const VERSION = "1.8.8";
package/bin/version.js CHANGED
@@ -6,4 +6,4 @@ exports.VERSION = void 0;
6
6
  * scripts/generate-version-ts.ts 가 ui-admin/package.json 의 version 으로부터 자동 생성한다.
7
7
  * 수동 편집 금지 — 빌드(`pnpm generate:version-ts` 또는 `pnpm build`) 시 덮어쓰여진다.
8
8
  */
9
- exports.VERSION = '1.8.7';
9
+ exports.VERSION = '1.8.8';
@@ -59,7 +59,7 @@
59
59
  "groupIcon": {
60
60
  "type": "object",
61
61
  "required": false,
62
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
62
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
63
63
  "properties": {
64
64
  "type": {
65
65
  "type": "string",
@@ -134,7 +134,7 @@
134
134
  "leadingIcon": {
135
135
  "type": "object",
136
136
  "required": false,
137
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
137
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
138
138
  "properties": {
139
139
  "type": {
140
140
  "type": "string",
@@ -211,7 +211,7 @@
211
211
  "trailingIcon": {
212
212
  "type": "object",
213
213
  "required": false,
214
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
214
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
215
215
  "properties": {
216
216
  "type": {
217
217
  "type": "string",
package/data/badge.json CHANGED
@@ -81,7 +81,7 @@
81
81
  "leadingIcon": {
82
82
  "type": "object",
83
83
  "required": false,
84
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
84
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
85
85
  "properties": {
86
86
  "type": {
87
87
  "type": "string",
@@ -154,7 +154,7 @@
154
154
  "trailingIcon": {
155
155
  "type": "object",
156
156
  "required": false,
157
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
157
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
158
158
  "properties": {
159
159
  "type": {
160
160
  "type": "string",
@@ -57,7 +57,7 @@
57
57
  "items": {
58
58
  "type": "object",
59
59
  "required": true,
60
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/navigation/bread-crumb/BreadCrumb\").BreadcrumbItemProps[]",
60
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/navigation/bread-crumb/BreadCrumb\").BreadcrumbItemProps[]",
61
61
  "properties": {
62
62
  "href": {
63
63
  "type": "string",
package/data/button.json CHANGED
@@ -77,7 +77,7 @@
77
77
  "leadingIcon": {
78
78
  "type": "object",
79
79
  "required": false,
80
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
80
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
81
81
  "properties": {
82
82
  "type": {
83
83
  "type": "string",
@@ -158,7 +158,7 @@
158
158
  "trailingIcon": {
159
159
  "type": "object",
160
160
  "required": false,
161
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
161
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
162
162
  "properties": {
163
163
  "type": {
164
164
  "type": "string",
@@ -88,6 +88,10 @@
88
88
  "type": "function",
89
89
  "required": false
90
90
  },
91
+ "onComplete": {
92
+ "type": "function",
93
+ "required": false
94
+ },
91
95
  "onEdit": {
92
96
  "type": "function",
93
97
  "required": false
@@ -99,7 +103,7 @@
99
103
  "optionItems": {
100
104
  "type": "object",
101
105
  "required": false,
102
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/dropdown/option\").OptionType[] | undefined",
106
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/dropdown/option\").OptionType[] | undefined",
103
107
  "properties": {
104
108
  "id": {
105
109
  "type": "string",
@@ -126,7 +130,7 @@
126
130
  "register": {
127
131
  "type": "object",
128
132
  "required": false,
129
- "rawType": "import(\"/home/runner/_work/ncds/ncds/node_modules/.pnpm/react-hook-form@7.72.0_react@18.2.0/node_modules/react-hook-form/dist/types/form\").UseFormRegisterReturn | undefined"
133
+ "rawType": "import(\"/Users/nhn/Project/ncds/node_modules/.pnpm/react-hook-form@7.72.0_react@18.2.0/node_modules/react-hook-form/dist/types/form\").UseFormRegisterReturn | undefined"
130
134
  },
131
135
  "required": {
132
136
  "type": "boolean",
@@ -155,7 +159,7 @@
155
159
  "value": {
156
160
  "type": "object",
157
161
  "required": false,
158
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/dropdown/option\").OptionValue | undefined"
162
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/dropdown/option\").OptionValue | undefined"
159
163
  }
160
164
  },
161
165
  "html": {},
@@ -62,7 +62,7 @@
62
62
  "datePickerOptions": {
63
63
  "type": "object",
64
64
  "required": false,
65
- "rawType": "Partial<import(\"/home/runner/_work/ncds/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
65
+ "rawType": "Partial<import(\"/Users/nhn/Project/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
66
66
  },
67
67
  "destructive": {
68
68
  "type": "string",
@@ -115,12 +115,12 @@
115
115
  "groups": {
116
116
  "type": "object",
117
117
  "required": true,
118
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownGroup[]",
118
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownGroup[]",
119
119
  "properties": {
120
120
  "items": {
121
121
  "type": "object",
122
122
  "required": true,
123
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownItemType[]",
123
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownItemType[]",
124
124
  "properties": {
125
125
  "id": {
126
126
  "type": "string",
@@ -178,7 +178,7 @@
178
178
  "header": {
179
179
  "type": "object",
180
180
  "required": false,
181
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownHeaderType | undefined",
181
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").DropdownHeaderType | undefined",
182
182
  "properties": {
183
183
  "type": {
184
184
  "type": "string",
@@ -206,7 +206,7 @@
206
206
  "trigger": {
207
207
  "type": "object",
208
208
  "required": true,
209
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").AvatarTrigger | import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").ButtonTrigger | import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").IconTrigger | import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").CustomTrigger",
209
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").AvatarTrigger | import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").ButtonTrigger | import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").IconTrigger | import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/dropdown/Dropdown\").CustomTrigger",
210
210
  "properties": {
211
211
  "type": {
212
212
  "type": "string",
@@ -37,7 +37,7 @@
37
37
  "buttons": {
38
38
  "type": "object",
39
39
  "required": false,
40
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/feedback-and-status/empty-state/EmptyState\").ButtonOptions | import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/feedback-and-status/empty-state/EmptyState\").ButtonOptions[] | undefined",
40
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/feedback-and-status/empty-state/EmptyState\").ButtonOptions | import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/feedback-and-status/empty-state/EmptyState\").ButtonOptions[] | undefined",
41
41
  "properties": {
42
42
  "label": {
43
43
  "type": "string",
@@ -79,7 +79,7 @@
79
79
  "leadingIcon": {
80
80
  "type": "object",
81
81
  "required": false,
82
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
82
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
83
83
  "properties": {
84
84
  "type": {
85
85
  "type": "string",
@@ -142,7 +142,7 @@
142
142
  "trailingIcon": {
143
143
  "type": "object",
144
144
  "required": false,
145
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
145
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
146
146
  "properties": {
147
147
  "type": {
148
148
  "type": "string",
@@ -60,7 +60,7 @@
60
60
  "menus": {
61
61
  "type": "object",
62
62
  "required": false,
63
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/tab/TabButton\").TabButtonProps[] | undefined",
63
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/tab/TabButton\").TabButtonProps[] | undefined",
64
64
  "properties": {
65
65
  "id": {
66
66
  "type": "string",
@@ -97,7 +97,7 @@
97
97
  "badgeInfo": {
98
98
  "type": "object",
99
99
  "required": false,
100
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/feedback-and-status/badge/Badge\").BadgeProps | undefined",
100
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/feedback-and-status/badge/Badge\").BadgeProps | undefined",
101
101
  "properties": {
102
102
  "label": {
103
103
  "type": "string",
@@ -131,7 +131,7 @@
131
131
  "leadingIcon": {
132
132
  "type": "object",
133
133
  "required": false,
134
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
134
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
135
135
  "properties": {
136
136
  "type": {
137
137
  "type": "string",
@@ -194,7 +194,7 @@
194
194
  "trailingIcon": {
195
195
  "type": "object",
196
196
  "required": false,
197
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
197
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SideSlotType | undefined",
198
198
  "properties": {
199
199
  "type": {
200
200
  "type": "string",
@@ -338,6 +338,7 @@
338
338
  "ncua-image-file-input__empty-slot-wrapper",
339
339
  "ncua-image-file-input__preview-container",
340
340
  "ncua-image-file-input__previews",
341
+ "ncua-image-file-input__slot-tooltip",
341
342
  "ncua-input__help-icon"
342
343
  ],
343
344
  "usage": {
package/data/modal.json CHANGED
@@ -211,7 +211,7 @@
211
211
  "featuredIcon": {
212
212
  "type": "object",
213
213
  "required": false,
214
- "rawType": "{ icon: import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/types/side-slot\").SlotIconComponent; color: import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/image-and-icons/featured-icon/FeaturedIcon\").FeaturedIconColor; theme: import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/image-and-icons/featured-icon/FeaturedIcon\").FeaturedIconTheme; } | undefined",
214
+ "rawType": "{ icon: import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/types/side-slot\").SlotIconComponent; color: import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/image-and-icons/featured-icon/FeaturedIcon\").FeaturedIconColor; theme: import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/image-and-icons/featured-icon/FeaturedIcon\").FeaturedIconTheme; } | undefined",
215
215
  "properties": {
216
216
  "icon": {
217
217
  "type": "function",
@@ -45,7 +45,7 @@
45
45
  "actions": {
46
46
  "type": "object",
47
47
  "required": false,
48
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/overlays/notification/Notification\").NotificationAction[] | undefined",
48
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/overlays/notification/Notification\").NotificationAction[] | undefined",
49
49
  "properties": {
50
50
  "label": {
51
51
  "type": "string",
@@ -56,7 +56,7 @@
56
56
  "breadcrumbItems": {
57
57
  "type": "object",
58
58
  "required": false,
59
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/layout/page-title/PageTitle\").PageTitleBreadcrumbItem[] | undefined",
59
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/layout/page-title/PageTitle\").PageTitleBreadcrumbItem[] | undefined",
60
60
  "properties": {
61
61
  "label": {
62
62
  "type": "string",
@@ -52,7 +52,7 @@
52
52
  "segments": {
53
53
  "type": "object",
54
54
  "required": false,
55
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/feedback-and-status/progress-bar/types\").ProgressSegment[] | undefined",
55
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/feedback-and-status/progress-bar/types\").ProgressSegment[] | undefined",
56
56
  "properties": {
57
57
  "value": {
58
58
  "type": "number",
@@ -61,7 +61,7 @@
61
61
  "endDateOptions": {
62
62
  "type": "object",
63
63
  "required": true,
64
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/forms-and-input/date-picker/DatePicker\").DatePickerProps",
64
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/forms-and-input/date-picker/DatePicker\").DatePickerProps",
65
65
  "properties": {
66
66
  "size": {
67
67
  "type": "enum",
@@ -82,7 +82,7 @@
82
82
  "datePickerOptions": {
83
83
  "type": "object",
84
84
  "required": false,
85
- "rawType": "Partial<import(\"/home/runner/_work/ncds/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
85
+ "rawType": "Partial<import(\"/Users/nhn/Project/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
86
86
  },
87
87
  "destructive": {
88
88
  "type": "string",
@@ -144,7 +144,7 @@
144
144
  "startDateOptions": {
145
145
  "type": "object",
146
146
  "required": true,
147
- "rawType": "import(\"/home/runner/_work/ncds/ncds/packages/ui-admin/src/components/forms-and-input/date-picker/DatePicker\").DatePickerProps",
147
+ "rawType": "import(\"/Users/nhn/Project/ncds/packages/ui-admin/src/components/forms-and-input/date-picker/DatePicker\").DatePickerProps",
148
148
  "properties": {
149
149
  "size": {
150
150
  "type": "enum",
@@ -165,7 +165,7 @@
165
165
  "datePickerOptions": {
166
166
  "type": "object",
167
167
  "required": false,
168
- "rawType": "Partial<import(\"/home/runner/_work/ncds/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
168
+ "rawType": "Partial<import(\"/Users/nhn/Project/ncds/node_modules/.pnpm/flatpickr@4.6.13/node_modules/flatpickr/dist/types/options\").BaseOptions> | undefined"
169
169
  },
170
170
  "destructive": {
171
171
  "type": "string",