@infomind-ux/infoux-mcp 0.1.0 → 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.
@@ -0,0 +1,460 @@
1
+ {
2
+ "name": "INFOUX Art Direction",
3
+ "version": "1.0.0",
4
+ "policy": "타이포 카탈로그·팔레트 인덱스·한글 조판 수치의 기계용 정본. references/art-direction.md의 표는 build-art-direction.js가 이 파일에서 생성한다. 팔레트 hex 정본은 tokens/presets/*.json — 여기서는 참조만 한다. 폰트 입수·라이선스 판단은 원 배포처 기준으로만 하며, CI는 외부 URL을 fetch하지 않는다. woff2 실물 입수 전까지 파일 실존 검사는 sha256이 기록된 폰트에만 적용한다.",
5
+ "hangul": {
6
+ "wordBreak": "keep-all",
7
+ "overflowWrap": "break-word",
8
+ "bodyLineHeight": {
9
+ "min": 1.6,
10
+ "max": 1.7,
11
+ "default": 1.7,
12
+ "compactDefault": 1.6,
13
+ "lintFloor": 1.5
14
+ },
15
+ "headingLineHeight": {
16
+ "min": 1.2,
17
+ "max": 1.45
18
+ },
19
+ "headingLetterSpacing": {
20
+ "min": "-0.03em",
21
+ "max": "0",
22
+ "appliesFromRem": 2.4
23
+ },
24
+ "headingMaxLines": 2,
25
+ "weights": {
26
+ "bodyBase": 400,
27
+ "bodyEmphasisMax": 700,
28
+ "headingMax": 700,
29
+ "maxPerScreen": 4
30
+ },
31
+ "note": "lintFloor는 R-24 검출기의 warn 임계(이 값 미만이 warn), min~max는 저작 기준값. bodyEmphasisMax 700은 인라인 강조 한정 — 연속 문단 볼드 금지. headingMax 700은 h1~h2급 한정. 상세 산문: references/art-direction.md §2."
32
+ },
33
+ "typography": [
34
+ {
35
+ "id": "standard-gov",
36
+ "label": "표준 관청체",
37
+ "mood": [
38
+ "중립",
39
+ "신뢰",
40
+ "표준"
41
+ ],
42
+ "heading": {
43
+ "stack": "var(--font-sans)",
44
+ "weights": [
45
+ 600,
46
+ 700
47
+ ],
48
+ "letterSpacing": "-0.02em",
49
+ "lineHeight": 1.35
50
+ },
51
+ "body": {
52
+ "stack": "var(--font-sans)",
53
+ "weights": [
54
+ 400,
55
+ 500
56
+ ],
57
+ "lineHeight": 1.7
58
+ },
59
+ "fonts": [
60
+ {
61
+ "family": "Pretendard GOV",
62
+ "hangul": true,
63
+ "hosting": "self",
64
+ "license": {
65
+ "type": "OFL-1.1",
66
+ "verifiedAt": "2026-08-03"
67
+ },
68
+ "provenance": "github.com/orioncactus/pretendard (공식 woff2·동적 서브셋 제공)",
69
+ "files": [
70
+ "assets/fonts/standard-gov/PretendardGOV-Regular.subset.woff2",
71
+ "assets/fonts/standard-gov/PretendardGOV-Medium.subset.woff2",
72
+ "assets/fonts/standard-gov/PretendardGOV-SemiBold.subset.woff2",
73
+ "assets/fonts/standard-gov/PretendardGOV-Bold.subset.woff2"
74
+ ],
75
+ "sha256": {
76
+ "assets/fonts/standard-gov/PretendardGOV-Regular.subset.woff2": "e99d5c21e28505ff7ea884e174b2c5ddb636b6501b85027b36406b73f4753027",
77
+ "assets/fonts/standard-gov/PretendardGOV-Medium.subset.woff2": "d4df3ea6d8a52c5ab19bec33f3dbeae68ae55960f06afc4c81ddbd09e99d9662",
78
+ "assets/fonts/standard-gov/PretendardGOV-SemiBold.subset.woff2": "6728f66985e38b2686b022e692f72e7271818cb898dc3c969e96bd24303f99e6",
79
+ "assets/fonts/standard-gov/PretendardGOV-Bold.subset.woff2": "b7748f8fd3f26b83d339417e92a8fe0d2a5a8667f653588c4e7a9e8a3e3d21e0"
80
+ },
81
+ "acquiredAt": "2026-08-03"
82
+ }
83
+ ],
84
+ "expression": [
85
+ "utility",
86
+ "restrained",
87
+ "expressive"
88
+ ],
89
+ "profiles": [
90
+ "general-site",
91
+ "public-service",
92
+ "public-institution",
93
+ "cms-admin",
94
+ "commerce-reservation"
95
+ ],
96
+ "cautions": [
97
+ {
98
+ "severity": "warn",
99
+ "text": "단독으로는 무개성 — 크기 대비(본문 1.7rem ↔ h1 4rem)와 여백으로 위계를 만든다."
100
+ },
101
+ {
102
+ "severity": "info",
103
+ "text": "민간 프로젝트는 일반 Pretendard도 무방. 전 프로필 안전 기본값."
104
+ }
105
+ ]
106
+ },
107
+ {
108
+ "id": "product-modern",
109
+ "label": "프로덕트 산세리프",
110
+ "mood": [
111
+ "친근",
112
+ "현대적",
113
+ "제품"
114
+ ],
115
+ "heading": {
116
+ "stack": "'Wanted Sans', var(--font-sans)",
117
+ "weights": [
118
+ 600,
119
+ 700
120
+ ],
121
+ "letterSpacing": "-0.02em",
122
+ "lineHeight": 1.3
123
+ },
124
+ "body": {
125
+ "stack": "var(--font-sans)",
126
+ "weights": [
127
+ 400,
128
+ 500
129
+ ],
130
+ "lineHeight": 1.7
131
+ },
132
+ "fonts": [
133
+ {
134
+ "family": "Wanted Sans",
135
+ "hangul": true,
136
+ "hosting": "self",
137
+ "license": {
138
+ "type": "OFL-1.1",
139
+ "verifiedAt": "2026-08-03"
140
+ },
141
+ "provenance": "github.com/wanteddev/wanted-sans (공식 woff2·웹폰트 가이드)",
142
+ "files": [
143
+ "assets/fonts/product-modern/WantedSans-SemiBold.subset.woff2",
144
+ "assets/fonts/product-modern/WantedSans-Bold.subset.woff2"
145
+ ],
146
+ "sha256": {
147
+ "assets/fonts/product-modern/WantedSans-SemiBold.subset.woff2": "821bd2383962aef80a5d9ffe9a4fe26d77c6c74a8431b922720e2aa43a6c1a29",
148
+ "assets/fonts/product-modern/WantedSans-Bold.subset.woff2": "0642aee76b41e75aa75e485c34058dd0d316c493f11e97fe898698646435a698"
149
+ },
150
+ "acquiredAt": "2026-08-03"
151
+ }
152
+ ],
153
+ "expression": [
154
+ "expressive"
155
+ ],
156
+ "profiles": [
157
+ "general-site",
158
+ "commerce-reservation"
159
+ ],
160
+ "cautions": [
161
+ {
162
+ "severity": "error",
163
+ "text": "본문까지 Wanted Sans로 바꾸지 않는다 — 본문 축은 --font-sans 고정이 카탈로그 전제."
164
+ }
165
+ ]
166
+ },
167
+ {
168
+ "id": "formal-serif",
169
+ "label": "격식 명조",
170
+ "mood": [
171
+ "격식",
172
+ "기록",
173
+ "전통"
174
+ ],
175
+ "heading": {
176
+ "stack": "'Noto Serif KR', var(--font-sans)",
177
+ "weights": [
178
+ 600
179
+ ],
180
+ "letterSpacing": "-0.01em",
181
+ "lineHeight": 1.4
182
+ },
183
+ "body": {
184
+ "stack": "var(--font-sans)",
185
+ "weights": [
186
+ 400,
187
+ 500
188
+ ],
189
+ "lineHeight": 1.7
190
+ },
191
+ "fonts": [
192
+ {
193
+ "family": "Noto Serif KR",
194
+ "hangul": true,
195
+ "hosting": "self",
196
+ "license": {
197
+ "type": "OFL-1.1",
198
+ "verifiedAt": "2026-08-03"
199
+ },
200
+ "provenance": "fonts.google.com/noto (Google 공식)",
201
+ "files": [
202
+ "assets/fonts/formal-serif/NotoSerifKR-SemiBold.subset.woff2"
203
+ ],
204
+ "sha256": {
205
+ "assets/fonts/formal-serif/NotoSerifKR-SemiBold.subset.woff2": "709684b6c0eb5558e5d9e168d2859cd482234553e80e05dd21062fed64ed21af"
206
+ },
207
+ "acquiredAt": "2026-08-03"
208
+ }
209
+ ],
210
+ "expression": [
211
+ "restrained",
212
+ "expressive"
213
+ ],
214
+ "profiles": [
215
+ "public-institution",
216
+ "general-site"
217
+ ],
218
+ "cautions": [
219
+ {
220
+ "severity": "error",
221
+ "text": "2rem 미만 크기 사용 금지 — 명조 가는 획이 뭉개진다."
222
+ },
223
+ {
224
+ "severity": "warn",
225
+ "text": "CJK 명조는 용량이 크다 — 서브셋 필수, heading 전용 weight 1종(600)만 로드."
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ "id": "retro-display",
231
+ "label": "레트로 디스플레이",
232
+ "mood": [
233
+ "레트로",
234
+ "문화",
235
+ "독립"
236
+ ],
237
+ "heading": {
238
+ "stack": "'Hahmlet', var(--font-sans)",
239
+ "weights": [
240
+ 500,
241
+ 600
242
+ ],
243
+ "letterSpacing": "0",
244
+ "lineHeight": 1.3
245
+ },
246
+ "body": {
247
+ "stack": "var(--font-sans)",
248
+ "weights": [
249
+ 400,
250
+ 500
251
+ ],
252
+ "lineHeight": 1.7
253
+ },
254
+ "fonts": [
255
+ {
256
+ "family": "Hahmlet",
257
+ "hangul": true,
258
+ "hosting": "self",
259
+ "license": {
260
+ "type": "OFL-1.1",
261
+ "verifiedAt": "2026-08-03"
262
+ },
263
+ "provenance": "github.com/hyper-type/hahmlet + fonts.google.com (가변 폰트)",
264
+ "files": [
265
+ "assets/fonts/retro-display/Hahmlet-Variable.subset.woff2"
266
+ ],
267
+ "sha256": {
268
+ "assets/fonts/retro-display/Hahmlet-Variable.subset.woff2": "0eb94d35bc5e5ab9d73876f524a156fe75f2988d768bf95a156984a6311debe0"
269
+ },
270
+ "acquiredAt": "2026-08-03"
271
+ }
272
+ ],
273
+ "expression": [
274
+ "expressive"
275
+ ],
276
+ "profiles": [
277
+ "general-site"
278
+ ],
279
+ "cautions": [
280
+ {
281
+ "severity": "error",
282
+ "text": "hero·배너·섹션 타이틀 전용 — 본문·폼·표 사용 금지."
283
+ },
284
+ {
285
+ "severity": "warn",
286
+ "text": "글리프 커버리지 검수 — 프로젝트 실제 카피(기관명·고유명사)로 누락 음절을 확인한 뒤 채택한다."
287
+ }
288
+ ]
289
+ },
290
+ {
291
+ "id": "technical-global",
292
+ "label": "테크니컬 고딕",
293
+ "mood": [
294
+ "테크",
295
+ "국제",
296
+ "데이터"
297
+ ],
298
+ "heading": {
299
+ "stack": "'IBM Plex Sans KR', var(--font-sans)",
300
+ "weights": [
301
+ 600
302
+ ],
303
+ "letterSpacing": "-0.01em",
304
+ "lineHeight": 1.3
305
+ },
306
+ "body": {
307
+ "stack": "var(--font-sans)",
308
+ "weights": [
309
+ 400,
310
+ 500
311
+ ],
312
+ "lineHeight": 1.7
313
+ },
314
+ "fonts": [
315
+ {
316
+ "family": "IBM Plex Sans KR",
317
+ "hangul": true,
318
+ "hosting": "self",
319
+ "license": {
320
+ "type": "OFL-1.1",
321
+ "verifiedAt": "2026-08-03"
322
+ },
323
+ "provenance": "github.com/IBM/plex (npm 공식 woff2 배포)",
324
+ "files": [
325
+ "assets/fonts/technical-global/IBMPlexSansKR-SemiBold.subset.woff2"
326
+ ],
327
+ "sha256": {
328
+ "assets/fonts/technical-global/IBMPlexSansKR-SemiBold.subset.woff2": "5c452d7e4ec4c8164dab99bbb1cd166d43da361242ad11e5e48e89b0246abe0b"
329
+ },
330
+ "acquiredAt": "2026-08-03"
331
+ }
332
+ ],
333
+ "expression": [
334
+ "utility",
335
+ "restrained",
336
+ "expressive"
337
+ ],
338
+ "profiles": [
339
+ "cms-admin",
340
+ "general-site"
341
+ ],
342
+ "cautions": [
343
+ {
344
+ "severity": "warn",
345
+ "text": "한글 글리프가 완성형 중심 — 실제 카피로 누락 음절 검수."
346
+ },
347
+ {
348
+ "severity": "info",
349
+ "text": "foundation의 --font-mono(Plex Mono 계열)와 가족 정합 — 데이터 화면에서 강점. admin에서는 standard-gov 단일 서체도 유효한 대안."
350
+ }
351
+ ]
352
+ }
353
+ ],
354
+ "palettes": [
355
+ {
356
+ "id": "trust-blue",
357
+ "label": "공공 신뢰 블루",
358
+ "mood": "관공서·금융 신뢰, 현행 기본 승계",
359
+ "file": "tokens/presets/trust-blue.json",
360
+ "expression": [
361
+ "utility",
362
+ "restrained",
363
+ "expressive"
364
+ ],
365
+ "profiles": [
366
+ "public-service",
367
+ "public-institution",
368
+ "cms-admin"
369
+ ]
370
+ },
371
+ {
372
+ "id": "coast-teal",
373
+ "label": "관광 청록",
374
+ "mood": "바다·환경·청량",
375
+ "file": "tokens/presets/coast-teal.json",
376
+ "expression": [
377
+ "restrained",
378
+ "expressive"
379
+ ],
380
+ "profiles": [
381
+ "general-site",
382
+ "public-service"
383
+ ]
384
+ },
385
+ {
386
+ "id": "market-terracotta",
387
+ "label": "커머스 웜 테라코타",
388
+ "mood": "온기·식욕·프로모션",
389
+ "file": "tokens/presets/market-terracotta.json",
390
+ "expression": [
391
+ "expressive"
392
+ ],
393
+ "profiles": [
394
+ "commerce-reservation",
395
+ "general-site"
396
+ ]
397
+ }
398
+ ],
399
+ "profiles": {
400
+ "general-site": {
401
+ "typography": [
402
+ "standard-gov",
403
+ "product-modern",
404
+ "formal-serif",
405
+ "retro-display"
406
+ ],
407
+ "palettes": [
408
+ "coast-teal",
409
+ "market-terracotta"
410
+ ],
411
+ "rhythm": "풀블리드 인트로(hero-bleed)→이미지-텍스트 교차(section-media)→리스트 변주 허용",
412
+ "copyTone": "합쇼체 기본. 명사형 버튼 레이블. 직역체·2인칭 '당신' 금지"
413
+ },
414
+ "public-service": {
415
+ "typography": [
416
+ "standard-gov"
417
+ ],
418
+ "palettes": [
419
+ "trust-blue",
420
+ "coast-teal"
421
+ ],
422
+ "rhythm": "과업 진입(search) 우선. 장식 hero는 화면 1/2 이하",
423
+ "copyTone": "합쇼체 고정. 느낌표 금지. KRDS 용어 우선"
424
+ },
425
+ "public-institution": {
426
+ "typography": [
427
+ "standard-gov",
428
+ "formal-serif"
429
+ ],
430
+ "palettes": [
431
+ "trust-blue"
432
+ ],
433
+ "rhythm": "기관 정체성+공지 결합형 인트로. 슬라이더는 정지 컨트롤 필수",
434
+ "copyTone": "합쇼체 고정. 성과 홍보 어조 금지 — 사실 서술"
435
+ },
436
+ "cms-admin": {
437
+ "typography": [
438
+ "standard-gov",
439
+ "technical-global"
440
+ ],
441
+ "palettes": [
442
+ "trust-blue"
443
+ ],
444
+ "rhythm": "hero 없음(profiles 소유 참조). 첫 화면은 검색/필터+데이터",
445
+ "copyTone": "명사형·개조식. 문장 최소화"
446
+ },
447
+ "commerce-reservation": {
448
+ "typography": [
449
+ "standard-gov",
450
+ "product-modern"
451
+ ],
452
+ "palettes": [
453
+ "market-terracotta",
454
+ "trust-blue"
455
+ ],
456
+ "rhythm": "상품·프로모션 중심, 전환 CTA 1개 원칙. 결제 플로우는 utility 강등",
457
+ "copyTone": "합쇼체 기본. 근거 없는 최상급 금지. 가격·기간 사실 정보 우선"
458
+ }
459
+ }
460
+ }
package/data/contract.md CHANGED
@@ -91,6 +91,7 @@
91
91
  | 작업 맥락 | 로드 |
92
92
  |-----------|------|
93
93
  | 코드 생성 전 사이트 유형 판정 | `references/project-profiles.md` |
94
+ | 표현 등급·타이포 페어링·팔레트 프리셋·한글 조판 판단 | `references/art-direction.md` |
94
95
  | 토큰 결정 (색상·기본 폰트·브레이크포인트) | `references/krds-tokens.md` |
95
96
  | 컴포넌트 마크업 작성 — 시각/스타일 카탈로그 | `references/krds-components.md` |
96
97
  | 컴포넌트 마크업 작성 — 인포마인드 기본 골격·ARIA·키보드 | 기존 인포마인드 구축 사이트 HTML + `references/html-semantics.md` |
@@ -1,13 +1,19 @@
1
1
  {
2
- "version": "c8f34dd",
2
+ "version": "c43579d",
3
3
  "generated": "scripts/build-mcp.js",
4
4
  "references": [
5
5
  {
6
6
  "id": "accessibility",
7
7
  "file": "accessibility.md",
8
- "chars": 5489,
8
+ "chars": 6196,
9
9
  "summary": "KRDS는 **WCAG 2.1 Level AA 이상 + KWCAG 2.1/2.2** 준수를 강제한다. 본 스킬도 이를 그대로 따른다."
10
10
  },
11
+ {
12
+ "id": "art-direction",
13
+ "file": "art-direction.md",
14
+ "chars": 12247,
15
+ "summary": "brand.json과 `--font-*` 토큰에 무엇을 넣을지, 표현 수위를 어디까지 열지 판단하는 기준. 수치 정본은 `contracts/art-direction.json`, 팔레트 hex 정본은 `tokens/presets/`이며, 이 문서의 표는 build-art-direct..."
16
+ },
11
17
  {
12
18
  "id": "forbidden-patterns",
13
19
  "file": "forbidden-patterns.md",
@@ -41,15 +47,21 @@
41
47
  {
42
48
  "id": "krds-tokens",
43
49
  "file": "krds-tokens.md",
44
- "chars": 6700,
50
+ "chars": 6868,
45
51
  "summary": "색상, 기본 폰트, 브레이크포인트는 이 문서의 토큰을 사용한다. 임의 hex/rgb/hsl 색상 작성은 금지한다. 간격·크기·타이포 스케일·모션·z-index는 토큰 카탈로그 대상이 아니며 CSS/Tailwind 직접값으로 작성한다."
46
52
  },
47
53
  {
48
54
  "id": "project-profiles",
49
55
  "file": "project-profiles.md",
50
- "chars": 4256,
56
+ "chars": 8105,
51
57
  "summary": "KRDS 체크리스트는 모든 프로젝트에 같은 방식으로 적용하지 않는다. 코드 생성 전 사이트 유형을 먼저 판정하고, 공통 품질 규칙과 조건부 정부/공공 규칙을 분리한다."
52
58
  },
59
+ {
60
+ "id": "release-checklist",
61
+ "file": "release-checklist.md",
62
+ "chars": 2373,
63
+ "summary": "자동검사가 통과했다고 배포해도 되는 것은 아니다. `npm run check`는 규칙 위반을 잡을 뿐, \"이 화면이 쓸 만한가\"는 판단하지 못한다."
64
+ },
53
65
  {
54
66
  "id": "snippet-template",
55
67
  "file": "snippet-template.md",
@@ -61,6 +73,12 @@
61
73
  "file": "tailwind-mapping.md",
62
74
  "chars": 1699,
63
75
  "summary": "INFOUX는 Tailwind v4 `@theme`에 색상과 폰트만 공개한다."
76
+ },
77
+ {
78
+ "id": "trade-off-rules",
79
+ "file": "trade-off-rules.md",
80
+ "chars": 2127,
81
+ "summary": "좋은 원칙끼리 부딪히는 순간이 실제 작업의 대부분이다. \"접근성도 중요하고 브랜드도 중요하다\"는 말은 결정을 미룰 뿐이다. 아래는 **무엇이 무엇을 이기는지**를 미리 정한 것이다."
64
82
  }
65
83
  ],
66
84
  "workflows": [
@@ -85,7 +103,7 @@
85
103
  {
86
104
  "id": "design-page",
87
105
  "file": "design-page.md",
88
- "chars": 775,
106
+ "chars": 931,
89
107
  "summary": "INFOUX 기준으로 새 페이지, 화면, 랜딩, 상세, 목록, 관리자 화면을 설계하거나 구현할 때 사용. 코드 작성 전에 사이트 유형, 사용자 핵심 과업, page shell, section 패턴과 재사용 컴포넌트를 확정한다."
90
108
  },
91
109
  {
@@ -97,7 +115,7 @@
97
115
  {
98
116
  "id": "init-project",
99
117
  "file": "init-project.md",
100
- "chars": 1478,
118
+ "chars": 2124,
101
119
  "summary": "INFOUX 스타터 기반 새 프로젝트 초기화. 프로젝트 유형과 브랜드 토큰을 반영해 프로젝트 컨트랙트와 토큰을 설정한다. \"새 프로젝트\", \"프로젝트 시작\", \"init project\" 요청 시 사용."
102
120
  },
103
121
  {
@@ -192,6 +210,12 @@
192
210
  "chars": 1561,
193
211
  "summary": "사이트 유형과 무관하게 사용할 수 있는 공통 헤더 패턴. 브랜드 + 주 메뉴 + 액션 영역을 기본으로 하며, 공식 배너·정부 상징·운영기관 식별자는 공공서비스/공공기관에서 적용 대상이 확인된 경우에만 별도 추가한다."
194
212
  },
213
+ {
214
+ "id": "hero-bleed",
215
+ "file": "hero-bleed.md",
216
+ "chars": 1506,
217
+ "summary": "화면 가로 전체를 쓰는 도입 섹션이다. section 자체에 클래스를 얹어 쓰고, 내부 `.container`가 본문 폭을 잡는다. 배경 이미지 위에 텍스트를 얹을 때는 `--scrim`을 함께 쓴다."
218
+ },
195
219
  {
196
220
  "id": "list",
197
221
  "file": "list.md",
@@ -222,6 +246,12 @@
222
246
  "chars": 579,
223
247
  "summary": "native `<progress>` + 시각 커스텀."
224
248
  },
249
+ {
250
+ "id": "section-media",
251
+ "file": "section-media.md",
252
+ "chars": 1974,
253
+ "summary": "동일 archetype 연속(R-25)을 끊는 변주 패턴이다. 태블릿 이상에서 이미지와 본문이 2컬럼으로 나란히 서고, `--reverse`로 좌우를 교차해 zigzag 리듬을 만든다."
254
+ },
225
255
  {
226
256
  "id": "select",
227
257
  "file": "select.md",
@@ -234,6 +264,12 @@
234
264
  "chars": 1476,
235
265
  "summary": "우측에서 슬라이드 인하는 보조 패널. 모달과 달리 본문 스크롤을 차단하지 않는다."
236
266
  },
267
+ {
268
+ "id": "signature",
269
+ "file": "signature.md",
270
+ "chars": 3970,
271
+ "summary": "\"이 사이트만의 것\"으로 기억되는 반복 장치 3패턴이다. 등급별 상한(utility 0 · restrained 1 · expressive 3)은 `contracts/art-direction.json` expressionLevels가 정본이고, 선정·배치 원칙은 `references..."
272
+ },
237
273
  {
238
274
  "id": "spinner",
239
275
  "file": "spinner.md",