sh-ui-cli 0.67.3 → 0.68.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/bin/sh-ui.mjs CHANGED
@@ -15,6 +15,7 @@ const usage = `사용법:
15
15
  필요한 외부 패키지를 자동 설치
16
16
  특수값: tokens → 설정 기반 토큰 파일 생성
17
17
  sh-ui list 현재 설치된 컴포넌트 목록 표시
18
+ sh-ui doctor 프로젝트 정합성 점검 (config / tokens / 설치된 컴포넌트)
18
19
  sh-ui remove <component...> 설치된 컴포넌트 파일 삭제
19
20
  sh-ui rename-app <old> <new> monorepo 의 앱 이름 일괄 변경
20
21
  (apps/<old>/, packages/ui/ui-apps/ui-<old>/
@@ -99,6 +100,11 @@ try {
99
100
  await list({ cwd: process.cwd(), all });
100
101
  break;
101
102
  }
103
+ case "doctor": {
104
+ const { doctor } = await import("../src/doctor.mjs");
105
+ await doctor({ cwd: process.cwd() });
106
+ break;
107
+ }
102
108
  case "mcp": {
103
109
  // `sh-ui mcp init ...` → 설정 파일에 엔트리 추가
104
110
  // `sh-ui mcp` → MCP 서버 시작
@@ -2,6 +2,34 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$description": "sh-ui 릴리즈 노트 단일 소스. docs(React)와 showcase(Flutter)가 함께 읽는다. 새 릴리즈마다 맨 앞에 추가.",
4
4
  "versions": [
5
+ {
6
+ "version": "0.68.1",
7
+ "date": "2026-05-09",
8
+ "title": "fix(tokens) — --ring / --danger-hover / --shadow-menu 정식 등록 (Phase A 후속)",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**`--ring` 토큰 신설** — 58 개 컴포넌트가 focus outline 으로 사용하던 변수가 미정의였음 (시각적으로 outline 색이 빈 값으로 들어가 거의 안 보이던 silent breakage). v0.68.0 doctor 가 발견. 이번 릴리즈로 light=neutral.400 / dark=neutral.500 (preset 별 derive) 으로 정식 매핑.",
12
+ "**`--danger-hover` 토큰 신설** — Button danger 변종 hover 색 변화가 없던 silent breakage. light=red.700 / dark=red.500 추가, 기존 `--danger` 와 자연스러운 진/연 차이.",
13
+ "**`--shadow-menu` 토큰 의미화** — DropdownMenu / Select / ContextMenu 그림자. 이전엔 inject 단계 hardcode 였는데 semantic.json 의 `{shadow.lg}` 참조로 정식화 — `sh-ui add tokens` (buildTokens 경로) 와 `sh-ui create` (inject 경로) 둘 다 동일하게 emit.",
14
+ "**Flutter 측 `ShUiColorTokens.ring` / `.dangerHover` 필드 추가** — DART_FIELD_SOURCES 에 `fallback` 메타 추가, 옛 base64 theme 처럼 키가 누락된 경우 `danger` / `foreground-subtle` 로 안전하게 폴백. 기존 `sh_ui_encode_theme` 산출물도 깨지지 않음.",
15
+ "**옵셔널 키 정책** — `ring`, `danger-hover` 는 OPTIONAL_TOKEN_KEYS 로 등록. light/dark 모두 정의된 preset 만 inject 시 emit (NEUTRAL/slate 정식 정의, rose/emerald/violet 은 NEUTRAL spread 로 자동 상속). 옛 base64 theme 디코드는 strict 검증을 우회해 backward 호환.",
16
+ "**v0.68.0 doctor 가 즉시 활용** — fresh `sh-ui create` + `sh-ui doctor` 가 ✓ 모든 검사 통과."
17
+ ],
18
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.68.1"
19
+ },
20
+ {
21
+ "version": "0.68.0",
22
+ "date": "2026-05-09",
23
+ "title": "토큰 의존 검증 + sh-ui doctor — silent breakage 가시화 (Phase A)",
24
+ "type": "minor",
25
+ "highlights": [
26
+ "**`sh-ui doctor` 추가** — 프로젝트 정합성 점검. config/tokens.css/cssEntry/설치된 컴포넌트의 토큰 의존성을 한 번에 검사하고 ✓⚠✗ 로 리포트. CI 통합 가능 (실패 시 exit 1).",
27
+ "**컴포넌트 토큰 의존 메타** — `packages/registry/react/tokens-used.json` 자동 생성 (`scripts/build-registry-tokens.mjs`). 컴포넌트 CSS 의 `var(--*)` 참조를 framework 별로 추출하고 fallback 있는 var 와 컴포넌트 자체 정의 변수는 외부 의존에서 제외. `pnpm lint:tokens-used` 가 drift 검출.",
28
+ "**add-time 토큰 검증** — `sh-ui add <component>` 가 destination tokens.css 의 변수 정의를 비교해 누락이면 한 번에 친절한 경고 (silent breakage 사전 차단). 실패가 아닌 안내 — 실제 실행은 그대로.",
29
+ "**`paths.cssEntry` 옵션 신설** — `sh-ui.config.json` 의 paths 에 `cssEntry` (globals.css 위치) 추가. doctor 가 tokens.css import 정합성을 검증. init/create 가 자동 채움 (Next.js fsd/flat → `app/globals.css`, monorepo ui-app → `src/styles/globals.css`). 기존 config 는 미설정 시 검사 스킵."
30
+ ],
31
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.68.0"
32
+ },
5
33
  {
6
34
  "version": "0.67.3",
7
35
  "date": "2026-05-09",
@@ -20,6 +20,8 @@ class ShUiColorTokens {
20
20
  final Color primaryHover;
21
21
  final Color danger;
22
22
  final Color dangerForeground;
23
+ final Color dangerHover;
24
+ final Color ring;
23
25
 
24
26
  const ShUiColorTokens({
25
27
  required this.background,
@@ -37,6 +39,8 @@ class ShUiColorTokens {
37
39
  required this.primaryHover,
38
40
  required this.danger,
39
41
  required this.dangerForeground,
42
+ required this.dangerHover,
43
+ required this.ring,
40
44
  });
41
45
 
42
46
  static const light = ShUiColorTokens(
@@ -55,6 +59,8 @@ class ShUiColorTokens {
55
59
  primaryHover: Color(0xFF262626),
56
60
  danger: Color(0xFFDC2626),
57
61
  dangerForeground: Color(0xFFFFFFFF),
62
+ dangerHover: Color(0xFFB91C1C),
63
+ ring: Color(0xFFA3A3A3),
58
64
  );
59
65
 
60
66
  static const dark = ShUiColorTokens(
@@ -73,6 +79,8 @@ class ShUiColorTokens {
73
79
  primaryHover: Color(0xFFE5E5E5),
74
80
  danger: Color(0xFFDC2626),
75
81
  dangerForeground: Color(0xFFFFFFFF),
82
+ dangerHover: Color(0xFFEF4444),
83
+ ring: Color(0xFF737373),
76
84
  );
77
85
  }
78
86
 
@@ -194,12 +202,14 @@ class ShUiShadowTokens {
194
202
  final List<BoxShadow> md;
195
203
  final List<BoxShadow> lg;
196
204
  final List<BoxShadow> xl;
205
+ final List<BoxShadow> menu;
197
206
 
198
207
  const ShUiShadowTokens({
199
208
  required this.sm,
200
209
  required this.md,
201
210
  required this.lg,
202
211
  required this.xl,
212
+ required this.menu,
203
213
  });
204
214
 
205
215
  static const tokens = ShUiShadowTokens(
@@ -207,6 +217,7 @@ class ShUiShadowTokens {
207
217
  md: <BoxShadow>[BoxShadow(offset: Offset(0.0, 4.0), blurRadius: 12.0, spreadRadius: 0.0, color: Color(0x1F000000))],
208
218
  lg: <BoxShadow>[BoxShadow(offset: Offset(0.0, 8.0), blurRadius: 24.0, spreadRadius: 0.0, color: Color(0x26000000))],
209
219
  xl: <BoxShadow>[BoxShadow(offset: Offset(0.0, 16.0), blurRadius: 48.0, spreadRadius: 0.0, color: Color(0x2E000000))],
220
+ menu: <BoxShadow>[BoxShadow(offset: Offset(0.0, 8.0), blurRadius: 24.0, spreadRadius: 0.0, color: Color(0x26000000))],
210
221
  );
211
222
  }
212
223