@spectrabrain/eds 0.1.0 → 0.1.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.
- package/AI.md +13 -63
- package/AI_CONTEXT.json +26 -95
- package/CHANGELOG.md +66 -4
- package/CONSUMER_AGENT.md +86 -164
- package/FRONTEND_CONVENTIONS.md +252 -0
- package/QUICKSTART.md +24 -29
- package/README.md +24 -73
- package/TAILWIND_V4.md +49 -184
- package/TOKEN_CONTEXT.md +63 -36
- package/consumer/align/templates/components.json +21 -0
- package/consumer/align/templates/env.mock +1 -0
- package/consumer/align/templates/eslint.config.js +35 -0
- package/consumer/align/templates/package.scripts.json +10 -0
- package/consumer/align/templates/prettierignore +2 -0
- package/consumer/align/templates/prettierrc.json +7 -0
- package/consumer/align/templates/src/app/App.tsx +16 -0
- package/consumer/align/templates/src/app/main.tsx +27 -0
- package/consumer/align/templates/src/app/providers/ErrorBoundary.tsx +58 -0
- package/consumer/align/templates/src/app/providers/ErrorHandler.tsx +29 -0
- package/consumer/align/templates/src/app/router/index.tsx +23 -0
- package/consumer/align/templates/src/app/styles/index.css +2 -0
- package/consumer/align/templates/src/mocks/browser.ts +5 -0
- package/consumer/align/templates/src/mocks/handlers.ts +4 -0
- package/consumer/align/templates/src/shared/api/index.ts +23 -0
- package/consumer/align/templates/src/shared/api/queryClient.ts +24 -0
- package/consumer/align/templates/src/shared/lib/eventBus.ts +44 -0
- package/consumer/align/templates/src/shared/lib/utils/index.ts +6 -0
- package/consumer/align/templates/src/vite-env.d.ts +2 -0
- package/consumer/align/templates/tsconfig.json +22 -0
- package/consumer/align/templates/vite.config.babel.ts +36 -0
- package/consumer/align/templates/vite.config.rolldown.ts +35 -0
- package/consumer/align-analysis.mjs +1159 -0
- package/consumer/align-plan.mjs +377 -0
- package/consumer/align-rules.mjs +473 -0
- package/consumer/align.mjs +401 -0
- package/consumer/cli.mjs +90 -40
- package/consumer/css-root.mjs +24 -4
- package/consumer/doctor.mjs +47 -21
- package/consumer/init.mjs +39 -25
- package/consumer/managed-block.mjs +11 -5
- package/consumer/paths.mjs +69 -14
- package/consumer/register-scripts.mjs +17 -12
- package/consumer/scan-classes.mjs +4 -3
- package/consumer/sync.mjs +35 -13
- package/consumer/update-agent-context.mjs +63 -7
- package/consumer-postinstall.mjs +8 -7
- package/dist/components/Button/README.md +66 -95
- package/dist/components/Button/spec.json +19 -138
- package/dist/components.css +102 -366
- package/dist/index.d.mts +20 -18
- package/dist/index.d.ts +20 -18
- package/dist/tokens.d.mts +3 -0
- package/dist/tokens.d.ts +3 -0
- package/llms.txt +20 -14
- package/package.json +3 -1
package/AI.md
CHANGED
|
@@ -1,70 +1,20 @@
|
|
|
1
|
-
# EVA Design System —
|
|
1
|
+
# EVA Design System — 공개 범위와 사용 경계
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
요청이 EDS 공개 범위 밖의 기능(dark theme, 생성된 class 밖의 Tailwind utility, 목록에 없는 컴포넌트)을 요구할 때 읽습니다. 규칙과 명령은 [QUICKSTART.md](QUICKSTART.md), setup은 [CONSUMER_AGENT.md](CONSUMER_AGENT.md)에 있습니다.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 공개 범위
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- light theme, `AI_CONTEXT.json`의 `components`에 있는 컴포넌트(현재 `Button`), 공개 semantic color·typography token과 token runtime API(`@spectrabrain/eds/tokens`)를 제공합니다.
|
|
8
|
+
- 패키지는 Tailwind preset·plugin·utility를 export하지 않습니다. Tailwind class는 소비처의 `eds sync`가 `src/styles/eds-tokens.css`에 생성한 것만 씁니다.
|
|
9
|
+
- dark theme, 목록 밖 컴포넌트, 공개 spacing·radius token은 없습니다. 요청이 이를 요구하면 만들지 말고 사용자에게 확인합니다. spacing·radius는 소비처의 기존 scale을 씁니다.
|
|
10
|
+
- CSS 진입점 구성은 `CONSUMER_AGENT.md` 「font 정책」을 따릅니다.
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
## 사용 경계
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
- 문서·`spec.json`·`tokens.json`에 있는 API·prop·variant·token·export 경로만 씁니다. 없거나 스타일 우회가 필요하면 `QUICKSTART.md` 규칙 4·5를 따릅니다.
|
|
15
|
+
- EDS 컴포넌트의 native element·accessible name·keyboard 동작은 그대로 둡니다. icon-only Button에는 비어 있지 않은 `aria-label`(또는 `aria-labelledby`)을 지정합니다.
|
|
16
|
+
- 이름으로 지정하는 아이콘은 allowlist(`spec.json`의 `api.iconNames`)만 받고, 목록 밖 아이콘은 ReactElement 슬롯으로 전달합니다. 버전 선언과 보고 방법은 `dist/components/Button/README.md` 「Layout과 아이콘」에 있습니다.
|
|
12
17
|
|
|
13
|
-
##
|
|
18
|
+
## 문서와 manifest
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
- `Button` React 컴포넌트를 제공합니다.
|
|
17
|
-
- `@spectrabrain/eds/styles.css`, `@spectrabrain/eds/tokens.css`, `@spectrabrain/eds/components.css`, `@spectrabrain/eds/fonts.css`, `@spectrabrain/eds/base.css`를 제공합니다.
|
|
18
|
-
- `styles.css`는 `fonts.css`, `tokens.css`, `base.css`, `components.css`를 순서대로 불러옵니다. `components.css`는 Button CSS만, `fonts.css`는 Pretendard Variable font만, `base.css`는 `:where(html)`의 body1 font family 한 규칙만 불러옵니다.
|
|
19
|
-
- EDS text style은 `fonts.css`가 선언하는 font family `Pretendard`를 참조합니다. 개별 파일로 구성할 때는 `tokens.css`, `components.css`, `fonts.css`를 함께 import하고 `base.css`는 선택합니다. 다른 출처의 Pretendard로 EDS `fonts.css`를 대체하는 구성은 지원하지 않습니다.
|
|
20
|
-
- `TOKEN_CONTEXT.md`는 공개 token의 역할과 화면 맥락을 설명합니다.
|
|
21
|
-
|
|
22
|
-
공개되지 않은 token 원본·raw 값·임의 CSS variable은 직접 사용하지 않습니다. dark theme를 추가하지 않으며 EDS가 Tailwind utility API를 직접 제공한다고 가정하지 않습니다.
|
|
23
|
-
|
|
24
|
-
## token 사용
|
|
25
|
-
|
|
26
|
-
```ts
|
|
27
|
-
import "@spectrabrain/eds/styles.css";
|
|
28
|
-
import { cssVar, type SemanticTokenName } from "@spectrabrain/eds/tokens";
|
|
29
|
-
|
|
30
|
-
const token: SemanticTokenName = "color-fg-brand";
|
|
31
|
-
const color = cssVar(token); // var(--eds-color-fg-brand)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
- 색상에는 `SemanticTokenName`, `cssVar()`, 또는 `--eds-*` CSS variable만 사용합니다.
|
|
35
|
-
- text style은 같은 style의 `fontFamily`, `fontWeight`, `fontSize`, `lineHeight`, `letterSpacing` token을 함께 적용합니다.
|
|
36
|
-
- `styles.css`를 import하면 font, token CSS, `html` 기본 font family, Button CSS를 함께 불러옵니다. `tokens.css`를 개별로 사용하는 경우에도 `fonts.css`를 함께 import합니다.
|
|
37
|
-
- 역할에 맞는 exact token이 없으면 `fg/bg/stroke` 역할, 상태, 행동 의미, `neutral` 순서로 가까운 공개 token을 선택합니다. raw 값을 새로 만들지 않습니다.
|
|
38
|
-
|
|
39
|
-
## Tailwind CSS v4
|
|
40
|
-
|
|
41
|
-
Tailwind CSS v4에서 token을 `className`으로 사용하려면 [TAILWIND_V4.md](TAILWIND_V4.md)를 읽습니다. 설치된 `eds sync`가 공개 `tokens.json`에서 `src/styles/eds-tokens.css`를 생성하고 `@import "tailwindcss"`가 있는 Tailwind root CSS에 연결합니다. 생성된 `@theme inline`에는 color alias와 함께 `--font-sans: var(--eds-typography-body1-fontFamily);`가 들어가므로 Tailwind의 기본 sans font도 Pretendard가 됩니다. 소비처는 별도 generator script를 소유하지 않습니다.
|
|
42
|
-
|
|
43
|
-
npm 10·11에서는 EDS `postinstall`이 소비처 `package.json`에 `sync:eds`·`eds:doctor` script를 등록하고, 의존성의 install script가 실행되지 않는 환경에서는 `npx @spectrabrain/eds init`이 같은 script를 등록한 뒤 패키지 매니저별 승인 절차를 기록하거나 안내합니다. 설치·업데이트 후에는 `npm run sync:eds`로 Tailwind root CSS import, Tailwind alias, `AGENTS.md` managed block을 함께 갱신하고 `npm run eds:doctor`로 상태를 점검합니다. Tailwind를 사용하지 않는 저장소에서는 sync가 Tailwind 배선을 건너뛰고 `AGENTS.md`만 갱신합니다.
|
|
44
|
-
|
|
45
|
-
권장 className은 다음과 같습니다.
|
|
46
|
-
|
|
47
|
-
- `text-eds-fg-*`
|
|
48
|
-
- `bg-eds-bg-*`
|
|
49
|
-
- `border-eds-stroke-*`
|
|
50
|
-
- `eds-typography-*`
|
|
51
|
-
|
|
52
|
-
새 컴포넌트별 스타일을 `index.css`에 추가하지 않고 Tailwind `className`을 우선 사용합니다. 기존 CSS Modules와 전역 규칙은 일괄 변환하지 않습니다.
|
|
53
|
-
|
|
54
|
-
## 컴포넌트 문서
|
|
55
|
-
|
|
56
|
-
컴포넌트를 사용하기 전에 해당 README와 공개 manifest를 먼저 읽습니다. 문서에는 개요, 사용 맥락, 공개 API, 접근성 계약, 금지 사례가 기록되어 있습니다.
|
|
57
|
-
|
|
58
|
-
현재 `Button` 문서는 다음 경로에서 확인합니다. npm 설치 후에는 package root 상대 경로로 파일을 읽거나 export subpath로 resolve합니다.
|
|
59
|
-
|
|
60
|
-
| 환경 | 개요·API 문서 | 기계 판독 manifest |
|
|
61
|
-
| --- | --- | --- |
|
|
62
|
-
| 저장소 작업 | `src/components/Button/README.md` | `dist/components/Button/spec.json` |
|
|
63
|
-
| npm 설치 후(package root 상대 경로) | `dist/components/Button/README.md` | `dist/components/Button/spec.json` |
|
|
64
|
-
| npm 설치 후(export subpath) | `@spectrabrain/eds/components/Button/README.md` | `@spectrabrain/eds/components/Button/spec.json` |
|
|
65
|
-
|
|
66
|
-
제공되는 EDS 컴포넌트를 유사한 자체 구현보다 우선 사용합니다. 소비처 저장소 규칙이 특정 컴포넌트를 지정하더라도 EDS에 같은 역할의 컴포넌트가 있으면 EDS를 먼저 선택하고, 소비처 규칙이 접근성·보안·제품 요구사항인 경우에만 그것을 우선합니다. typed prop으로 제공하지 않은 색상·상태·variant를 `className`이나 inline style로 우회하지 않으며, native semantics·accessible name·keyboard interaction을 임의로 변경하지 않습니다.
|
|
67
|
-
|
|
68
|
-
`iconName`·`startIconName`·`endIconName`에는 승인된 allowlist의 lucide 이름만 사용합니다. `ButtonIconName`이 이 목록과 같은 union이며 `spec.json`의 `api.iconNames`에서 확인합니다. allowlist 밖 아이콘은 `icon`/`startIcon`/`endIcon`에 ReactElement로 전달합니다. `lucide-react`에서 직접 import하는 경우 소비처 `package.json`에 EDS와 같은 `1.45.0`으로 선언하고 stroke 두께는 기본값 `2`로 둡니다. 같은 아이콘이 두 화면 이상에서 반복되면 allowlist PR을 엽니다.
|
|
69
|
-
|
|
70
|
-
세부적인 소비처 setup과 버전 업데이트 절차는 [CONSUMER_AGENT.md](CONSUMER_AGENT.md), token 선택 맥락은 [TOKEN_CONTEXT.md](TOKEN_CONTEXT.md)를 기준으로 합니다.
|
|
20
|
+
문서 설명과 JSON manifest가 다르면 token 이름·component prop·접근성 동작은 JSON manifest(`tokens.json`, `spec.json`)와 TypeScript contract를 따릅니다. 컴포넌트 문서는 package root의 `dist/components/<Component>/README.md`(`@spectrabrain/eds/components/<Component>/README.md`)와 같은 디렉터리의 `spec.json`에 있습니다.
|
package/AI_CONTEXT.json
CHANGED
|
@@ -1,159 +1,90 @@
|
|
|
1
1
|
{
|
|
2
|
-
"schemaVersion":
|
|
2
|
+
"schemaVersion": 2,
|
|
3
3
|
"package": "@spectrabrain/eds",
|
|
4
4
|
"purpose": "consumer-ai-routing",
|
|
5
|
-
"pathConvention": "readOrder[].file is relative to the package root returned by require.resolve(\"@spectrabrain/eds/package.json\"); readOrder[].specifier is the export subpath for require.resolve or import
|
|
5
|
+
"pathConvention": "readOrder[].file is relative to the package root returned by require.resolve(\"@spectrabrain/eds/package.json\"); readOrder[].specifier is the export subpath for require.resolve or import; {name} expands to each entry of components. Rules and commands live in QUICKSTART.md, setup and CLI behavior in CONSUMER_AGENT.md.",
|
|
6
6
|
"components": [
|
|
7
7
|
"Button"
|
|
8
8
|
],
|
|
9
9
|
"readOrder": [
|
|
10
10
|
{
|
|
11
|
-
"path": "QUICKSTART.md",
|
|
12
11
|
"file": "QUICKSTART.md",
|
|
13
12
|
"specifier": "@spectrabrain/eds/QUICKSTART.md",
|
|
14
13
|
"kind": "quickstart",
|
|
15
14
|
"required": true
|
|
16
15
|
},
|
|
17
16
|
{
|
|
18
|
-
"path": "CONSUMER_AGENT.md",
|
|
19
17
|
"file": "CONSUMER_AGENT.md",
|
|
20
18
|
"specifier": "@spectrabrain/eds/CONSUMER_AGENT.md",
|
|
21
|
-
"kind": "
|
|
19
|
+
"kind": "setup-contract",
|
|
22
20
|
"required": false,
|
|
23
|
-
"when": "setup
|
|
21
|
+
"when": "First setup: the consumer AGENTS.md has no <!-- EDS:BEGIN --> block; eds sync or eds doctor exits 2, or eds doctor still exits 1 after sync; EDS was upgraded; the user asks to reorganize a prototype into the EVA frontend structure (eds align)"
|
|
24
22
|
},
|
|
25
23
|
{
|
|
26
|
-
"path": "AI.md",
|
|
27
24
|
"file": "AI.md",
|
|
28
25
|
"specifier": "@spectrabrain/eds/AI.md",
|
|
29
|
-
"kind": "
|
|
26
|
+
"kind": "scope-and-boundaries",
|
|
30
27
|
"required": false,
|
|
31
|
-
"when": "The
|
|
28
|
+
"when": "The request needs dark theme, a Tailwind plugin or utility beyond the generated eds classes, or a component not listed in components"
|
|
32
29
|
},
|
|
33
30
|
{
|
|
34
|
-
"path": "TOKEN_CONTEXT.md",
|
|
35
31
|
"file": "TOKEN_CONTEXT.md",
|
|
36
32
|
"specifier": "@spectrabrain/eds/TOKEN_CONTEXT.md",
|
|
37
|
-
"kind": "
|
|
33
|
+
"kind": "token-selection",
|
|
38
34
|
"required": false,
|
|
39
|
-
"when": "A token is
|
|
35
|
+
"when": "A color or typography token is written or changed outside EDS component props, including CSS variables or cssVar() without Tailwind"
|
|
40
36
|
},
|
|
41
37
|
{
|
|
42
|
-
"path": "TAILWIND_V4.md",
|
|
43
38
|
"file": "TAILWIND_V4.md",
|
|
44
39
|
"specifier": "@spectrabrain/eds/TAILWIND_V4.md",
|
|
45
40
|
"kind": "tailwind-setup",
|
|
46
41
|
"required": false,
|
|
47
|
-
"when": "Tailwind CSS v4 is
|
|
42
|
+
"when": "The Tailwind CSS v4 adapter, root CSS or eds-tokens.css wiring is set up or changed"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"file": "FRONTEND_CONVENTIONS.md",
|
|
46
|
+
"specifier": "@spectrabrain/eds/FRONTEND_CONVENTIONS.md",
|
|
47
|
+
"kind": "frontend-conventions",
|
|
48
|
+
"required": false,
|
|
49
|
+
"when": ".eds/align/PLAN.md exists (eds align in progress), or the consumer AGENTS.md points to this file for structure, library or code pattern changes"
|
|
48
50
|
},
|
|
49
51
|
{
|
|
50
|
-
"path": "dist/tokens.json",
|
|
51
52
|
"file": "dist/tokens.json",
|
|
52
53
|
"specifier": "@spectrabrain/eds/tokens.json",
|
|
53
54
|
"kind": "token-manifest",
|
|
54
55
|
"required": false,
|
|
55
|
-
"when": "A token, CSS variable
|
|
56
|
+
"when": "A tool or script needs the machine-readable token manifest, or an agent checks a CSS variable name for var() without Tailwind; class names come from src/styles/eds-tokens.css"
|
|
56
57
|
},
|
|
57
58
|
{
|
|
58
|
-
"path": "dist/components/{name}/README.md",
|
|
59
59
|
"file": "dist/components/{name}/README.md",
|
|
60
60
|
"specifier": "@spectrabrain/eds/components/{name}/README.md",
|
|
61
|
-
"kind": "component-
|
|
61
|
+
"kind": "component-guide",
|
|
62
62
|
"required": false,
|
|
63
|
-
"when": "An EDS component is
|
|
63
|
+
"when": "An EDS component is used: usage context, role and variant choice, props, accessibility and icons outside the allowlist"
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"path": "dist/components/{name}/spec.json",
|
|
67
66
|
"file": "dist/components/{name}/spec.json",
|
|
68
67
|
"specifier": "@spectrabrain/eds/components/{name}/spec.json",
|
|
69
68
|
"kind": "component-contract",
|
|
70
69
|
"required": false,
|
|
71
|
-
"when": "An
|
|
70
|
+
"when": "An icon name from api.iconNames must be confirmed, or a tool needs the machine-readable component contract"
|
|
72
71
|
},
|
|
73
72
|
{
|
|
74
|
-
"path": "CHANGELOG.md",
|
|
75
73
|
"file": "CHANGELOG.md",
|
|
76
74
|
"specifier": "@spectrabrain/eds/CHANGELOG.md",
|
|
77
75
|
"kind": "changelog",
|
|
78
76
|
"required": false,
|
|
79
|
-
"when": "
|
|
77
|
+
"when": "EDS was upgraded: the installed version is higher than the AGENTS.md EDS:VERSION line"
|
|
80
78
|
}
|
|
81
79
|
],
|
|
82
80
|
"precedence": [
|
|
83
81
|
"user-requirements",
|
|
84
|
-
"consumer-repository-rules",
|
|
85
|
-
"eds-managed-block-component-preference",
|
|
86
82
|
"accessibility-security-and-framework-constraints",
|
|
87
|
-
"eds-
|
|
88
|
-
"
|
|
83
|
+
"eds-component-preference",
|
|
84
|
+
"consumer-repository-rules",
|
|
85
|
+
"eds-json-manifest-and-typescript-contract",
|
|
86
|
+
"eds-usage-guides",
|
|
89
87
|
"examples"
|
|
90
88
|
],
|
|
91
|
-
"precedenceNote": "
|
|
92
|
-
"setup": {
|
|
93
|
-
"install": "npm install @spectrabrain/eds",
|
|
94
|
-
"init": "npx @spectrabrain/eds init",
|
|
95
|
-
"sync": "npm run sync:eds",
|
|
96
|
-
"doctor": "npm run eds:doctor",
|
|
97
|
-
"doctorWarn": "npm run eds:doctor -- --warn",
|
|
98
|
-
"doctorScan": "npm run eds:doctor -- --scan",
|
|
99
|
-
"doctorEnv": "EDS_DOCTOR=warn|off",
|
|
100
|
-
"printCi": "npx eds init --print-ci gitlab|github",
|
|
101
|
-
"tailwindRootOverride": "EDS_TAILWIND_ROOT=src/app/styles/index.css npm run sync:eds",
|
|
102
|
-
"tailwindRootConfig": "package.json eds.tailwindRoot (written by sync after EDS_TAILWIND_ROOT; resolution order: EDS_TAILWIND_ROOT, eds.tailwindRoot, auto-detect)",
|
|
103
|
-
"postinstall": "register-consumer-scripts-only",
|
|
104
|
-
"postinstallRequires": "npm 10 or 11 with lifecycle scripts enabled",
|
|
105
|
-
"legacyScriptMigration": "known-eds-commands-only",
|
|
106
|
-
"fontPolicy": "eds-fonts-required",
|
|
107
|
-
"syncOrder": [
|
|
108
|
-
"generate-public-tailwind-token-aliases",
|
|
109
|
-
"add-missing-eds-css-root-imports",
|
|
110
|
-
"update-agents-managed-block",
|
|
111
|
-
"add-claude-agents-import",
|
|
112
|
-
"add-gemini-agents-import"
|
|
113
|
-
],
|
|
114
|
-
"syncEffects": [
|
|
115
|
-
"generate-public-tailwind-token-aliases",
|
|
116
|
-
"add-missing-eds-css-root-imports",
|
|
117
|
-
"remove-legacy-eds-tokens-js-imports",
|
|
118
|
-
"update-agents-managed-block",
|
|
119
|
-
"add-claude-agents-import",
|
|
120
|
-
"add-gemini-agents-import"
|
|
121
|
-
]
|
|
122
|
-
},
|
|
123
|
-
"selection": {
|
|
124
|
-
"component": "prefer-eds-public-component",
|
|
125
|
-
"colorClassPatterns": [
|
|
126
|
-
"text-eds-fg-*",
|
|
127
|
-
"bg-eds-bg-*",
|
|
128
|
-
"border-eds-stroke-*"
|
|
129
|
-
],
|
|
130
|
-
"typographyClassPattern": "eds-typography-*",
|
|
131
|
-
"tokenSource": "dist/tokens.json",
|
|
132
|
-
"componentSource": "dist/components/{name}/spec.json",
|
|
133
|
-
"iconNameSource": "dist/components/Button/spec.json#api.iconNames",
|
|
134
|
-
"nearestTokenOrder": [
|
|
135
|
-
"same-fg-bg-stroke-role",
|
|
136
|
-
"same-state",
|
|
137
|
-
"same-action-meaning",
|
|
138
|
-
"neutral"
|
|
139
|
-
],
|
|
140
|
-
"fallbackRecordRequired": false
|
|
141
|
-
},
|
|
142
|
-
"implementation": {
|
|
143
|
-
"stylePreference": "tailwind-className",
|
|
144
|
-
"avoid": [
|
|
145
|
-
"raw-color",
|
|
146
|
-
"raw-typography",
|
|
147
|
-
"arbitrary-css-variable",
|
|
148
|
-
"private-deep-import",
|
|
149
|
-
"local-reimplementation-of-an-eds-component",
|
|
150
|
-
"component-rules-added-to-index.css"
|
|
151
|
-
]
|
|
152
|
-
},
|
|
153
|
-
"completionReport": [
|
|
154
|
-
"changed-files",
|
|
155
|
-
"selected-eds-components",
|
|
156
|
-
"selected-eds-tokens",
|
|
157
|
-
"verification-results"
|
|
158
|
-
]
|
|
89
|
+
"precedenceNote": "Explicit user requests come first, then accessibility, security and framework constraints. eds-component-preference outranks consumer-repository-rules only when choosing between a local component and an EDS component with the same role; a consumer rule that states an accessibility, security or product requirement as its reason still wins. When Markdown and a JSON manifest disagree, token names, component props and accessibility behavior follow the JSON manifest and the TypeScript contract."
|
|
159
90
|
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,65 @@
|
|
|
1
1
|
# @spectrabrain/eds
|
|
2
2
|
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 190c1d1: 소비처 조치: 업데이트 뒤 sync가 `note:` 줄을 출력하면 그 안내대로 지시 파일을 만들거나 루트 지시 파일에 안내 문장을 넣습니다.
|
|
8
|
+
|
|
9
|
+
sync와 doctor는 managed block이 에이전트에게 전달되지 않을 수 있는 경우(Claude Code·Gemini CLI 지시 파일 없음, `CLAUDE.local.md`만 있음, `AGENTS.override.md`, block이 Codex 기본 32 KiB 밖, monorepo 하위 package)를 exit code에 영향이 없는 `note:`로 알립니다. sync는 `CLAUDE.md` 없이 `.claude/CLAUDE.md`만 있으면 그 파일에 `@../AGENTS.md` import를 넣습니다. managed block은 UI 작업을 "JSX·CSS·`className`을 만들거나 고치는 작업"으로 정의하고, 완료 기준을 `[EDS] synced with` 줄로 바꿉니다.
|
|
10
|
+
|
|
11
|
+
- 4ba9fb9: 소비처 조치: `grep -rn -- '--eds-button-' src`로 내부 변수 참조를 찾습니다. 참조가 있으면 색은 `--eds-color-*`, 글자는 `--eds-typography-*`로 바꾸고, 높이·간격·모서리는 Button의 `size` prop으로 맞춥니다. 참조가 없으면 할 일이 없습니다.
|
|
12
|
+
|
|
13
|
+
`components.css`의 Button 내부 CSS 변수 이름을 크기 단위로 정리했습니다(예: `--eds-button-size-xs-textOnly-root-height` → `--eds-button-size-xs-root-height`). 렌더링 결과는 같습니다. 내부 변수는 공개 계약이 아니며, doctor는 CSS의 `var(--eds-button-*)` 참조를 검사하지 않습니다.
|
|
14
|
+
|
|
15
|
+
- 7066f66: 소비처 조치: `spec.json`을 코드로 읽는 도구가 있다면 제거된 필드에 맞춥니다. Button `spec.json`은 `semanticTokens`를 싣지 않고, `accessibility`는 `iconOnlyName`과 `loading`만 남깁니다(branch별 필수 prop은 `api.props`에 있습니다). Button의 동작과 타입은 바뀌지 않습니다.
|
|
16
|
+
|
|
17
|
+
Button README는 행동별 조합을 한 표로 모으고(`brand/outline`·`neutral/ghost` 포함), 컴파일되는 예시 네 줄, 액션 그룹 조합 규칙, link·native button branch 규칙, render 중 오류를 던지는 입력 전체와 그 결과, loading 뒤 포커스 이동과 결과 알림, `neutral/link`가 client router와 연결되지 않는다는 점을 담습니다. icon-only의 `aria-label`은 항상 지정하도록 문구를 통일하고, 확인되지 않은 우선순위(툴바 안 보조 행동, `neutral/solid` 옆 취소 버튼)는 `미결`로 표시합니다. `Button`의 `role`·`variant` 속성과 `children`·`aria-label`·`href`, `@spectrabrain/eds/tokens`의 `tokens`·`cssVar()`·`SemanticToken.value`에 JSDoc을 더합니다. `TOKEN_CONTEXT.md`는 Button과 겹치던 행동 맥락 표를 지웁니다.
|
|
18
|
+
|
|
19
|
+
- 64e13c4: 소비처 조치: 없습니다.
|
|
20
|
+
|
|
21
|
+
`eds` CLI가 pnpm·yarn이 그대로 넘기는 `--`를 무시합니다. 그래서 `pnpm eds:doctor -- --scan`처럼 문서의 `npm run … -- <옵션>`을 runner만 바꿔 실행해도 동작합니다. 옵션은 해당 명령에서만 받고, 다른 명령에 주거나 값이 필요한 옵션(`--only`·`--print-ci`·`--frontend`)에 값을 주지 않으면 파일을 쓰지 않고 exit 2로 끝납니다. 알 수 없는 옵션·명령에는 전체 usage 대신 `[EDS]`로 시작하는 한 줄 안내와 `npx @spectrabrain/eds --help`를 출력하고, `eds help`는 `eds --help`와 같습니다.
|
|
22
|
+
|
|
23
|
+
- bdeb42c: 소비처 조치: CI에 `npx eds doctor` job을 붙였다면 `npx @spectrabrain/eds init --print-ci github`(또는 `gitlab`)로 다시 출력해 교체합니다. 그 밖에는 없습니다.
|
|
24
|
+
|
|
25
|
+
EDS CLI를 `npx`·`bunx`로 실행하는 모든 안내와 출력을 `npx @spectrabrain/eds …`로 바꿨습니다. npm registry의 unscoped `eds`는 EDS와 무관한 패키지라서, 로컬 bin이 없는 위치에서 `npx eds …`를 실행하면 그 패키지가 설치되어 실행될 수 있었습니다. 패키지 매니저는 가장 가까운 lockfile(현재 디렉터리부터 git 루트까지)로 판별하므로, pnpm 저장소에서 `npx @spectrabrain/eds init`을 실행해도 pnpm 명령과 managed block이 나옵니다. `init`은 현재 `package.json`이 `@spectrabrain/eds`를 선언하지 않으면 아무것도 쓰지 않고 exit 2로 끝납니다. 출력 prefix는 `[EDS]`로 통일했습니다.
|
|
26
|
+
|
|
27
|
+
- 20e0502: 소비처 조치: 없습니다. 다음 버전 업데이트부터 AI 에이전트는 `CONSUMER_AGENT.md` 「버전 업데이트」의 순서대로 `AGENTS.md`의 `EDS:VERSION` 줄보다 높은 `CHANGELOG.md` 절을 읽고 각 항목의 소비처 조치를 적용합니다.
|
|
28
|
+
|
|
29
|
+
`CONSUMER_AGENT.md`는 읽기 순서 절과 온보딩 절을 지우고(온보딩 한 줄은 `README.md` 「설치」로 옮김), 「Tailwind root 결정」과 「sync가 쓰는 파일」을 나눕니다. Tailwind root 후보가 둘 이상일 때 `eds sync`·`eds doctor`는 사용자에게 root를 확인하라고 안내합니다. yarn Plug'n'Play(`.pnp.cjs`)를 발견하면 sync·doctor가 `note:`로 알리고 `nodeLinker`를 바꾸기 전에 담당자에게 확인하라고 안내합니다.
|
|
30
|
+
|
|
31
|
+
- b37f7a8: 소비처 조치: 없습니다.
|
|
32
|
+
|
|
33
|
+
sync의 완료 줄은 `eds:doctor` script가 `eds doctor`를 실행할 때만 그 script를, 아니면 `npx @spectrabrain/eds doctor`처럼 CLI를 안내합니다. Tailwind root 후보가 둘 이상일 때의 exit 2 메시지는 후보 가운데 하나를 채운 예시 명령 대신 `EDS_TAILWIND_ROOT=<that file>`만 보여 줍니다. `CLAUDE.md`(또는 `.claude/CLAUDE.md`)가 없으면 `GEMINI.md`가 있어도 Claude Code가 block을 읽지 못할 수 있다는 `note:`를 출력합니다.
|
|
34
|
+
|
|
35
|
+
- 8a58208: 소비처 조치: 없습니다.
|
|
36
|
+
|
|
37
|
+
managed block과 소비처 AI 문서를 다시 썼습니다. block은 사용자의 명시적 요청을 먼저 따르고, Tailwind root가 없는 저장소에서는 `var(--eds-color-*)`·`var(--eds-typography-*)` 또는 `cssVar()`를 쓰라고 안내합니다. `QUICKSTART.md`는 필요한 prop·variant·상태가 없을 때 멈추고 확인하는 규칙, `neutral/link` 선택 기준, `role`이 ARIA role이 아니라는 점을 담습니다. 공개 API, token 값, CLI 동작은 바뀌지 않습니다.
|
|
38
|
+
|
|
39
|
+
- 2163c44: 소비처 조치: `AI_CONTEXT.json`을 코드로 읽는 도구가 있다면 `schemaVersion` 2에 맞춥니다. `setup`·`selection`·`implementation`·`completionReport`·`path` 필드를 제거했고, `readOrder` 항목은 package root 상대 경로 `file`, export subpath `specifier`, `kind`, `required`, 관찰할 수 있는 읽기 조건 `when`만 가집니다. 규칙과 명령은 `QUICKSTART.md`에만 둡니다. AI 에이전트만 읽는 저장소는 조치가 필요 없습니다.
|
|
40
|
+
|
|
41
|
+
`QUICKSTART.md`는 「규칙」, 「완료 기준」, 「명령」, 「더 읽을 문서」로 다시 나누고, EDS 컴포넌트의 `className`은 바깥 배치(margin·정렬·grid 위치)에만 쓴다고 명시합니다. `eds doctor`의 마지막 안내는 `QUICKSTART.md` 「완료 기준」을 가리킵니다. `llms.txt`·`AI.md`·`README.md`는 라우팅을 `AI_CONTEXT.json`의 `when` 조건과 맞추고, `TOKEN_CONTEXT.md`는 `cssVar()` 예시를, Button README는 직접 import하는 `lucide-react` 버전을 찾는 위치를 담습니다.
|
|
42
|
+
|
|
43
|
+
- cdfb4a0: 소비처 조치: 완료를 판정하는 스크립트가 있다면 doctor의 exit 0 대신 `[EDS] synced with` 줄을 확인하게 바꿉니다. 그런 스크립트가 없으면 할 일이 없습니다.
|
|
44
|
+
|
|
45
|
+
`eds doctor`의 실패 출력은 항목마다 조치를 붙이고, 다음에 실행할 명령 하나(script가 없으면 `init`, sync로 고칠 줄이 있으면 sync)와 `[EDS] synced with`가 나올 때까지 다시 실행하라는 줄로 끝납니다. `--warn`·`EDS_DOCTOR=warn`으로 얻은 exit 0에는 이 줄이 없습니다. sync는 marker가 잘못된 `AGENTS.md`를 doctor와 같은 `invalid:` 접두로 보고하며 모든 marker의 줄 번호와 고치는 방법을 출력하고, 완료 줄은 쓴 파일을 변경에 포함한 뒤 doctor를 실행하라고 안내합니다.
|
|
46
|
+
|
|
47
|
+
- efe0076: 소비처 조치: 없습니다. 사용자가 프로토타입 정렬을 요청할 때만 실행하며 `init`·`sync`·`doctor` 동작은 바뀌지 않습니다.
|
|
48
|
+
|
|
49
|
+
`eds align`과 `eds align --check`, 새 공개 문서 `FRONTEND_CONVENTIONS.md`를 추가했습니다. Vite + React 프로토타입의 frontend package에서 `npx @spectrabrain/eds align`을 실행하면 소스를 바꾸지 않고 `.eds/align/`에 AI 에이전트가 따를 8단계 계획(`PLAN.md`), 진행·기준선·결정을 적는 `NOTES.md`, 이 저장소의 경로로 채운 설정·소스 템플릿을 만듭니다. `--check`는 컨벤션(FSD 구조, import 방향, 의존성, 설정, script)과, 계획이 있으면 기준 commit 이후 보호 경로(backend·배포 설정·frontend package 밖)의 변경을 점검합니다. UI 문구는 당분간 다국어 리소스 없이 한국어로 컴포넌트에 직접 쓰고, 나중에 리소스로 옮길 수 있도록 문장을 한 문자열로 씁니다(「UI 문구」). 사용법·보호 경로·exit code는 `CONSUMER_AGENT.md` 「프로토타입 정렬」, 규칙은 `FRONTEND_CONVENTIONS.md`에 있습니다.
|
|
50
|
+
|
|
51
|
+
- ec3d964: 소비처 조치: Tailwind CSS v3 저장소(CSS가 `@tailwind` 지시어를 씀)에서 `EDS_TAILWIND_ROOT`나 `package.json` `eds.tailwindRoot`가 v3 CSS 파일을 가리키면 이제 `eds sync`·`eds doctor`가 exit 2로 멈춥니다. 그 설정을 지우고, 앱 진입점에서 `@spectrabrain/eds/styles.css`를 import한 뒤 `var(--eds-*)`·`cssVar()`로 token을 씁니다. Tailwind CSS v4로 올리는 것은 사용자에게 확인한 뒤 진행합니다.
|
|
52
|
+
|
|
53
|
+
Tailwind root가 없을 때 sync·doctor는 v3 저장소에 `Tailwind CSS v3 detected` note를, 그 밖의 저장소에 `@import "tailwindcss";`를 추가한 뒤 sync를 다시 실행하라는 note를 출력합니다. `TAILWIND_V4.md`는 설정 순서, 관찰할 수 있는 조건으로 고르는 adapter 표(Vite에서는 `@tailwindcss/vite`만), 기존 설정에 합치는 예시, `src/styles/eds-tokens.css`를 commit하는 이유, Tailwind 저장소 전용 완료 기준만 담는 설정 문서로 바뀝니다. class 사용법은 `TOKEN_CONTEXT.md`에만 둡니다. `CONSUMER_AGENT.md`는 yarn berry에서 doctor hook 대신 `typecheck`·`build` 앞의 `eds doctor`가 같은 역할을 한다고 적습니다.
|
|
54
|
+
|
|
55
|
+
- c9f2708: 소비처 조치: `vite.config.*`가 있고 `package.json`에 `@tailwindcss/postcss`가 있으면 `tailwindcss`와 같은 버전의 `@tailwindcss/vite`를 devDependency로 설치하고 `vite.config`의 `plugins`에 `tailwindcss()`를 추가한 뒤, PostCSS 설정에서 Tailwind 항목만 지우고 `@tailwindcss/postcss`를 제거합니다. `vite build` 출력 asset에 `.woff2`가 있으면 완료입니다. `eds doctor`는 이 구성을 검사하지 않으므로 doctor exit 0만으로는 판정할 수 없습니다.
|
|
56
|
+
|
|
57
|
+
Vite 프로젝트에서 Tailwind를 `@tailwindcss/postcss`로 실행하면 EDS `fonts.css`의 Pretendard woff2가 번들에 들어가지 않아 font가 로드되지 않습니다. 이전 `TAILWIND_V4.md` 안내를 따른 구성이 해당하며, 안내를 `@tailwindcss/vite`로 바로잡았습니다.
|
|
58
|
+
|
|
59
|
+
- 82a251f: 소비처 조치: 업데이트 뒤 `eds doctor`가 대소문자를 틀린 token class(예: `outline-eds-stroke-FocusRing`)를 `unknown:`으로 새로 보고하면 token 이름의 대소문자대로 고칩니다. doctor가 이제 대소문자가 섞인 class(예: `outline-eds-stroke-focusRing`)도 검사하기 때문입니다.
|
|
60
|
+
|
|
61
|
+
`TOKEN_CONTEXT.md`는 역할별 실제 token 이름표(의미 색, `neutral`, `layer`·`transparent`·`disabled`·`placeholder`·`focus`·`focusRing`)와 hover가 bg에만 있다는 점, `ring-`·`outline-`·`divide-`·`fill-` class 패턴, exact token이 없을 때 조건을 하나씩 완화하는 순서, 의미별 용도(`critical` 오류·위험 등)와 Button과 같은 배경·글자 조합을 담습니다. 확인되지 않은 조합(`-contrast` fg의 용도, `layer`와 `neutral` 배경의 구분, divider 단계)은 `미결`로 표시합니다. 예시는 surface 배경 class를 빼고 divider를 `<hr className="border-t …">`로 바꾸며, 기존 scale로 표현할 수 없는 spacing·radius는 멈추고 사용자에게 확인하도록 안내합니다.
|
|
62
|
+
|
|
3
63
|
## 0.1.0
|
|
4
64
|
|
|
5
65
|
### Minor Changes
|
|
@@ -8,14 +68,16 @@
|
|
|
8
68
|
- bee9af6: `CHANGELOG.md`를 배포물에 포함하고 `@spectrabrain/eds/CHANGELOG.md`로 export합니다. `AI_CONTEXT.json`의 `readOrder`에 EDS 버전이 바뀐 경우의 항목을 추가하고 `QUICKSTART.md`·`llms.txt`·`CONSUMER_AGENT.md`의 버전 업데이트 절에서 안내합니다. CHANGELOG도 공개 경계 검사 대상이 되어 내부 token 계층 이름을 적은 0.0.x 항목 두 개의 표현을 고쳤습니다.
|
|
9
69
|
- b09c8d6: `eds sync`가 `GEMINI.md`가 있으면 `<!-- EDS:GEMINI:BEGIN -->`·`<!-- EDS:GEMINI:END -->` 사이에 `@./AGENTS.md` import 한 줄을 추가하고, `eds doctor`가 누락을 `missing:`으로 보고합니다. Gemini CLI가 기본으로 `GEMINI.md`만 읽기 때문이며, `CLAUDE.md`와 같은 규칙(파일이 없으면 만들지 않음, symlink와 fenced 예시 무시)을 따릅니다. Codex·Cursor·Copilot·Windsurf는 `AGENTS.md`를 직접 읽습니다.
|
|
10
70
|
- 4dce7ce: `@spectrabrain/eds/AI.md` export를 추가합니다. `AI_CONTEXT.json`의 `readOrder`에서 `specifier`가 `null`이던 유일한 항목이 `@spectrabrain/eds/AI.md`가 되어, 모든 공개 문서를 `require.resolve`나 `import.meta.resolve`로 같은 방식으로 찾을 수 있습니다. `README.md` 공개 경로 표에 같은 행을 추가했으며 읽기 순서와 조건은 바뀌지 않습니다.
|
|
11
|
-
- 9b2116e: `@spectrabrain/eds/base.css` export를 추가합니다. `:where(html)`에 `--eds-typography-body1-fontFamily`를 `font-family`로 적용하는 규칙 하나만 담고 있으며, `:where()` 선택자라 specificity가 0이므로 소비처의 `html`·`body` font 규칙이
|
|
71
|
+
- 9b2116e: `@spectrabrain/eds/base.css` export를 추가합니다. `:where(html)`에 `--eds-typography-body1-fontFamily`를 `font-family`로 적용하는 규칙 하나만 담고 있으며, `:where()` 선택자라 specificity가 0이므로 cascade layer 밖에 있는 소비처의 `html`·`body` font 규칙이 우선합니다. 소비처가 `@layer` 안에 둔 `html` 규칙보다는 `base.css`가 우선합니다. `@spectrabrain/eds/styles.css`는 이제 `fonts.css`, `tokens.css`, `base.css`, `components.css` 순서로 불러오며, `tokens.css`와 `components.css`만 따로 import하는 소비처는 필요할 때 `base.css`를 함께 import합니다.
|
|
12
72
|
|
|
13
73
|
`@spectrabrain/eds/tokens` runtime과 타입 선언을 가볍게 만듭니다. `tokens`와 `tokenNames`를 만드는 `Object.freeze` 호출에 `/* @__PURE__ */` 표시를 붙이고 `cssVar()`가 token map 대신 `tokenNames`로 이름을 검증하도록 바꿔, `cssVar()`만 사용하는 앱에서는 번들러가 token map을 제거할 수 있습니다. `SemanticTokenCssVariable`과 `SemanticTokenCssReference`는 `SemanticTokenName`에서 파생하는 template literal type으로 선언해 `tokens.d.ts` 크기를 줄였습니다. token 이름 목록, 자동완성, `cssVar()` 반환값과 오류 메시지는 바뀌지 않습니다.
|
|
74
|
+
|
|
14
75
|
- cb5d1b5: `eds init`이 `npm_config_user_agent`와 lockfile로 패키지 매니저를 판별해 setup을 그 환경에 맞춥니다. npm 12 이상에서는 소비처 `package.json`에 `allowScripts["@spectrabrain/eds"] = true`를 기록해 이후 설치·업그레이드에서 postinstall이 자동 실행되게 하며, `--no-allow-scripts`로 건너뛸 수 있습니다. pnpm(`pnpm approve-builds` 또는 `pnpm.onlyBuiltDependencies`), bun(`trustedDependencies`, 기본 신뢰 목록 대체 경고), Yarn 2+(`enableScripts`·`dependenciesMeta`, pre/post hook 미실행 안내)에는 정확한 승인 절차를 출력합니다. `AGENTS.md` managed block과 CLI 안내문의 `npm run ` 접두사는 판별된 runner(`pnpm `, `yarn `, `bun run `)로 렌더링되고 `eds doctor`도 같은 렌더링과 비교합니다. `eds doctor --warn`은 `EDS_DOCTOR=warn`과 같고, `eds init --print-ci github|gitlab`은 `npx eds doctor`를 실행하는 CI job snippet만 출력합니다. Tailwind root가 없고 `EDS_TAILWIND_ROOT`도 없으면 `eds sync`는 `src/styles/eds-tokens.css` 생성과 CSS import 편집을 건너뛰고 안내만 출력하며, `eds doctor`는 Tailwind 관련 항목을 보고하지 않습니다. Tailwind root가 둘 이상이면 이전처럼 exit 2입니다.
|
|
15
76
|
- cb5d1b5: `eds doctor`가 EDS 글꼴 import를 점검합니다. CSS·JS·TS 어디에서도 `@spectrabrain/eds/styles.css` 또는 `@spectrabrain/eds/fonts.css`를 import하지 않으면 `missing:` 항목으로 보고합니다. EDS text style은 `fonts.css`가 선언하는 family `Pretendard`를 참조하므로 opt-out 구성은 `tokens.css` + `components.css` + `fonts.css`입니다. Tailwind root가 있으면 `eds sync`가 빠진 `fonts.css` import를 root CSS에 추가합니다. `index.html`이나 CSS가 CDN·`<link>`·별도 `@font-face`로 Pretendard를 참조하면 exit code에 영향을 주지 않는 `note:` 줄을 출력합니다. 생성되는 `src/styles/eds-tokens.css`의 `@theme inline` block 마지막 줄에 `--font-sans: var(--eds-typography-body1-fontFamily);`가 추가되어 Tailwind 기본 sans 글꼴이 EDS body 글꼴을 따릅니다. 기존 소비처는 `npm run sync:eds`를 한 번 실행하면 갱신됩니다.
|
|
16
|
-
- 507e821: `ButtonIconName`을 승인된 lucide 아이콘 목록으로 좁힙니다. `iconName`·`startIconName`·`endIconName`은 EVA 화면에서 실제로 사용하는 47개의 canonical lucide-react 이름만 허용하며, 목록에 없는 이름은 TypeScript 오류와 render 오류로 처리합니다. 승인된 목록은 공개 `spec.json`의 `api.iconNames`에서 확인할 수 있습니다.
|
|
77
|
+
- 507e821: **breaking**: `ButtonIconName`을 승인된 lucide 아이콘 목록으로 좁힙니다. 목록 밖 이름을 쓰던 코드는 `icon={<X />}`처럼 ReactElement 슬롯으로 바꿉니다. `iconName`·`startIconName`·`endIconName`은 EVA 화면에서 실제로 사용하는 47개의 canonical lucide-react 이름만 허용하며, 목록에 없는 이름은 TypeScript 오류와 render 오류로 처리합니다. 승인된 목록은 공개 `spec.json`의 `api.iconNames`에서 확인할 수 있습니다.
|
|
17
78
|
|
|
18
79
|
아이콘 registry의 lazy 로드 chunk(`dist/button-icons.js`, `dist/button-icons.mjs`)를 제거하고 아이콘을 동기적으로 렌더링합니다. SSR에서도 아이콘 SVG를 바로 렌더링하며, `ButtonIconName`은 type-only export로 유지됩니다. 목록 밖 아이콘은 `icon`·`startIcon`·`endIcon`에 ReactElement로 전달합니다.
|
|
80
|
+
|
|
19
81
|
- 4fdcd43: 소비처 AI의 필수 읽기를 4 KB 이하의 `QUICKSTART.md` 하나로 줄이고 `./QUICKSTART.md` export를 추가합니다. package root 찾기, EDS 컴포넌트 우선·Button role/variant 대응·`eds-*` class·raw 값 금지·`className` 배치·doctor/sync·완료 보고 규칙, 명령, 조건부로 읽을 문서만 담습니다. `AI_CONTEXT.json`의 `readOrder`는 `QUICKSTART.md`를 유일한 필수 문서로 두고 `CONSUMER_AGENT.md`(setup·sync·doctor), `AI.md`, `TOKEN_CONTEXT.md`를 `when` 조건부로 내리며, `setup`에 `doctorWarn`, `printCi`, `fontPolicy`를 추가합니다. `AGENTS.md` managed block의 첫 두 항목은 `QUICKSTART.md`를 먼저 읽고 `eds doctor`가 실패하면 `sync:eds`를 실행하도록 바뀌므로 기존 소비처는 `npm run sync:eds`를 한 번 실행합니다. 공개 문서는 앱이 이미 Pretendard를 불러오는 경우의 이전 opt-out 문구를 제거하고 EDS `fonts.css`를 필수로 안내하며, `node scripts/check-consumer-guidance.mjs`가 `QUICKSTART.md`의 크기와 핵심 패턴, 제거된 문구의 부재를 단언합니다.
|
|
20
82
|
- 2ad76e2: 소비처 AI가 공개 token·Button·Tailwind CSS v4 사용 규칙을 먼저 읽고 적용할 수 있도록 `AI_CONTEXT.json`, `CONSUMER_AGENT.md`, `TOKEN_CONTEXT.md`를 제공하고, 소비처 setup을 `eds` CLI(`npx @spectrabrain/eds init`, `eds sync`, `eds doctor`)로 배포합니다. npm 10·11의 postinstall은 소비처 `package.json`에 `sync:eds`·`eds:doctor`와 `pretypecheck`·`prebuild` hook만 등록하며, `npm run sync:eds`는 `src/styles/eds-tokens.css` 생성, Tailwind root CSS의 `@spectrabrain/eds/styles.css`·`eds-tokens.css` import, `AGENTS.md` managed block과 `EDS:VERSION` 줄, 기존 `CLAUDE.md`의 `@AGENTS.md` import를 원자적으로 갱신합니다. Tailwind root는 `EDS_TAILWIND_ROOT`로 지정할 수 있고, `npm run eds:doctor`는 읽기 전용으로 미동기·버전 불일치를 보고합니다. Markdown code block을 추출해 실행하던 이전 runner export와 소비처 소유 script 옵션, `EDS_ENTRYPOINT`는 제거합니다.
|
|
21
83
|
- 8724189: `@spectrabrain/eds/components.css` export를 추가합니다. Button CSS만 포함하며 font는 포함하지 않으므로 개별 구성에서는 `@spectrabrain/eds/tokens.css`·`@spectrabrain/eds/fonts.css`와 함께 import합니다.
|
|
@@ -29,7 +91,7 @@
|
|
|
29
91
|
- 4fdcd43: 소비처 AI 문서의 라우팅과 판정 규칙을 정리합니다. `AI_CONTEXT.json`의 `readOrder` 항목마다 package root 상대 경로 `file`과 export subpath `specifier`를 함께 기록하고(`path`는 `file`과 같은 값으로 유지), 최상위 `components` 배열과 `pathConvention`, `setup.doctorEnv`를 추가합니다. `QUICKSTART.md`·`AI.md`·`CONSUMER_AGENT.md`·`README.md`·`TOKEN_CONTEXT.md`의 Button 문서와 token manifest 경로를 실제 파일 위치인 `dist/components/Button/`·`dist/tokens.json`으로 고칩니다. managed block과 `QUICKSTART.md`에 컴포넌트 선택 tie-break 한 문장을 추가하고 `AI_CONTEXT.json` precedence에 `eds-managed-block-component-preference`를 넣습니다. 기존 소비처는 `npm run sync:eds`를 한 번 실행하면 block이 갱신됩니다. 취소·닫기·수정은 `neutral/outline`, 초기화·갱신·되돌리기처럼 부담이 낮은 반복 행동은 `neutral/weak`로 Button 안내를 하나로 맞춥니다. `typesVersions`를 추가해 `moduleResolution: node` 소비처에서도 `@spectrabrain/eds/tokens` 타입이 해석됩니다. `README.md`의 Button contract 참조는 `components/Button/README.md`·`spec.json`을 직접 가리키고, `TAILWIND_V4.md`의 script 충돌 서술을 `CONSUMER_AGENT.md`와 같게 맞춥니다.
|
|
30
92
|
- dda103c: 손으로만 유지되던 공개 계약 목록을 저장소 검사가 대조합니다. `npm run build`의 public boundary 검사는 `README.md` 공개 경로 표의 `@spectrabrain/eds/...` 경로 집합이 `package.json` exports와 정확히 일치하는지 확인하고, `npm run component-manifest:generate`는 Button context metadata의 `props`·`unsupportedProps` 이름 집합이 `Button.tsx`가 선언한 prop 이름과 같은지 확인하며, 어긋나면 빠진 이름과 남는 이름을 출력하고 실패합니다. CI verify workflow는 `npx changeset status --since=origin/main`을 경고 전용 단계로 실행합니다. 배포 파일에서는 `llms.txt`만 바뀌어 읽기 순서가 `AI_CONTEXT.json`의 `readOrder`와 같아지고 `dist/tokens.json`, `dist/components/Button/README.md`, `dist/components/Button/spec.json`을 package root 기준 파일 경로로 안내합니다.
|
|
31
93
|
- 3922273: Button이 `icon`, `iconName`, `startIcon`, `startIconName`, `endIcon`, `endIconName` 슬롯 prop을 native `<button>`·`<a>` 속성으로 전달하던 문제를 수정합니다. React의 알 수 없는 prop 경고와 DOM의 불필요한 속성이 사라지며 공개 API는 바뀌지 않습니다.
|
|
32
|
-
- ef16f71: `Button` 루트 CSS에서 구현 reset 두 줄(`margin: 0`, `flex: 0 0 auto`)을 제거합니다. 공개 token 값과 컴포넌트 계약은 바뀌지 않으며, 버튼의 margin과 flex 동작은 이제 소비처 레이아웃의 기본값을 따릅니다.
|
|
94
|
+
- ef16f71: `Button` 루트 CSS에서 구현 reset 두 줄(`margin: 0`, `flex: 0 0 auto`)을 제거합니다. 공개 token 값과 컴포넌트 계약은 바뀌지 않으며, 버튼의 margin과 flex 동작은 이제 소비처 레이아웃의 기본값을 따릅니다. 줄어드는 flex 컨테이너에서 버튼 폭이 줄면 부모 레이아웃에서 조정합니다.
|
|
33
95
|
|
|
34
96
|
## 0.0.4
|
|
35
97
|
|
|
@@ -51,7 +113,7 @@
|
|
|
51
113
|
### Patch Changes
|
|
52
114
|
|
|
53
115
|
- 6081959: React `Button` 컴포넌트와 허용된 role·variant·size·loading·icon slot contract를 추가합니다. lucide PascalCase 이름과 `ButtonIconName` 자동완성도 제공합니다.
|
|
54
|
-
Button label typography는 `xs=body3`, `sm·md=title3` semantic preset을 사용합니다. Semantic typography의
|
|
116
|
+
Button label typography는 `xs=body3`, `sm·md=title3` semantic preset을 사용합니다. Semantic typography의 font weight 값 변경도 포함합니다.
|
|
55
117
|
|
|
56
118
|
custom icon slot을 기존 `ReactNode`에서 `ReactElement`로 제한한 변경은 이후 stable release에서 breaking 후보로 검토합니다. 이번 changeset은 `0.0.2` patch 릴리스 준비용으로 기록합니다.
|
|
57
119
|
|