sh-ui-cli 0.59.7 → 0.59.9

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.
@@ -2,6 +2,32 @@
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.59.9",
7
+ "date": "2026-05-06",
8
+ "title": "fix — next-intl standalone 빌드 (globals.css 상대 경로 보정)",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**`sh-ui-cli create --plugins next-intl --structure standalone` prod 빌드 폭발 수정** — next-intl 플러그인이 `app/layout.tsx` 를 `app/[locale]/layout.tsx` 로 이동하면서 보존하는 side-effect import (`import './globals.css';`) 의 상대 경로를 보정하지 않아, 한 단계 깊어진 새 위치에서 `./globals.css` 가 미해결 모듈이 됐다. `pnpm build` (`next build`) 가 `Module not found: Can't resolve './globals.css'` 로 실패.",
12
+ "**경로 보정** — `nextIntl.js` 의 `contentFn` 에서 보존되는 side-effect import 의 `./` / `../` 접두사를 디렉토리 깊이 변화(1단계)만큼 끌어올림. 절대 경로(`/x`) 와 모듈명(`polyfills`) 은 그대로.",
13
+ "**회귀 가드 강화** — smoke 시나리오 3 의 globals.css 검사가 `/[^'\"]*globals\\.css/` 단순 존재만 봤어서 v0.59.8 까지 누락. `import '../globals.css';` 정확 매치 + `import './globals.css';` 부재로 강화.",
14
+ "**전수 검증** — 36-combo 스캐폴드 매트릭스(structure × arch × css × plugins) 의 standalone+all-plugins 6 케이스 모두 fix 후 prod 빌드 성공 확인. monorepo+all-plugins 는 원래부터 정상."
15
+ ],
16
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.59.9"
17
+ },
18
+ {
19
+ "version": "0.59.8",
20
+ "date": "2026-05-06",
21
+ "title": "fix — flat standalone globals.css 토큰 import 경로",
22
+ "type": "patch",
23
+ "highlights": [
24
+ "**`sh-ui-cli create --arch flat --structure standalone` 빌드 폭발 수정** — 베이스 `app/globals.css` 가 fsd 경로(`../src/shared/styles/tokens.css`)를 하드코딩하고 있었고 `_arch/flat/` 에 오버라이드가 없어, flat standalone 으로 생성한 프로젝트는 `pnpm dev` 첫 페이지에서 tailwindcss 가 토큰 파일을 못 찾고 CssSyntaxError 로 죽었다.",
25
+ "**오버라이드 추가** — `_arch/flat/app/globals.css` 가 베이스를 덮어 `../lib/styles/tokens.css` 로 토큰을 import. 다른 토큰 주입(`injectCssTheme`)/마커 검증은 이미 flat 경로를 알고 있었어서 그쪽은 변경 불필요.",
26
+ "**회귀 가드** — 기존 flat 가드는 `.ts/.tsx` 만 검사해 `.css` 의 상대 import 누수를 못 잡았다. `globals.css 의 tokens import 가 실재하는 파일을 가리킴` 케이스를 smoke.test 에 추가해 재발 방지.",
27
+ "**영향 범위** — flat + standalone 조합만 해당. fsd standalone, 어떤 monorepo 조합도 영향 없음 (monorepo 는 토큰을 별도 패키지에서 import)."
28
+ ],
29
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.59.8"
30
+ },
5
31
  {
6
32
  "version": "0.59.7",
7
33
  "date": "2026-05-06",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.59.7",
3
+ "version": "0.59.9",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -64,12 +64,20 @@ export const nextIntlPlugin = {
64
64
  // side-effect import (`import 'x';` 형태, binding 없음) 만 보존하고 나머지는 통째 교체.
65
65
  // 이름 있는 import (예: `import { RootLayout } from ...`) 는 새 본체와 식별자 충돌 가능성이
66
66
  // 있어 제외.
67
+ //
68
+ // 경로 보정: 파일이 `app/layout.tsx` → `app/[locale]/layout.tsx` 로 1단계 깊어졌으므로
69
+ // 보존된 side-effect import 의 상대 경로(`./x` / `../x`)는 `../` 한 번만큼 더 위로 끌어올린다.
70
+ // 절대 경로(`/x`)나 모듈명(`polyfills`)은 그대로. v0.59.8 까지는 보정이 빠져 standalone+next-intl
71
+ // 조합에서 `./globals.css` 가 깨졌고 prod 빌드가 실패했다.
67
72
  type: 'replace',
68
73
  path: 'app/[locale]/layout.tsx',
69
74
  contentFn: (existing) => {
75
+ const adjustRelative = (line) =>
76
+ line.replace(/(['"])(\.\.?\/)/g, (_m, q, prefix) => `${q}../${prefix === './' ? '' : prefix}`);
70
77
  const sideEffectImports = existing
71
78
  .split('\n')
72
79
  .filter((line) => /^\s*import\s+['"][^'"]+['"];?\s*$/.test(line))
80
+ .map(adjustRelative)
73
81
  .join('\n');
74
82
  const body = `import type { Metadata } from 'next';
75
83
  import { RootLayout } from '${arch.aliases.layouts}/RootLayout';
@@ -0,0 +1,49 @@
1
+ @import 'tailwindcss';
2
+ @import '../lib/styles/tokens.css';
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ /* Tailwind v4 — 토큰 CSS 변수를 utility 클래스로 노출.
7
+ * `bg-primary` / `text-foreground` 같은 클래스가 토큰을 따라가도록 매핑.
8
+ * 옵셔널 색(success/warning/info)은 토큰에 없으면 변수가 undefined 라 browsers 가 단순 무시 — 안전.
9
+ *
10
+ * flat overlay — 베이스(`app/globals.css`)는 fsd 경로로 토큰을 import 하므로
11
+ * flat arch 에서는 이 파일이 베이스를 덮어 `lib/styles/tokens.css` 로 보낸다.
12
+ * 베이스 globals.css 내용 변경 시 이 파일도 동일하게 동기화할 것.
13
+ */
14
+ @theme inline {
15
+ --color-background: var(--background);
16
+ --color-background-subtle: var(--background-subtle);
17
+ --color-background-muted: var(--background-muted);
18
+ --color-background-inverse: var(--background-inverse);
19
+ --color-foreground: var(--foreground);
20
+ --color-foreground-muted: var(--foreground-muted);
21
+ --color-foreground-subtle: var(--foreground-subtle);
22
+ --color-foreground-inverse: var(--foreground-inverse);
23
+ --color-border: var(--border);
24
+ --color-border-strong: var(--border-strong);
25
+ --color-primary: var(--primary);
26
+ --color-primary-foreground: var(--primary-foreground);
27
+ --color-primary-hover: var(--primary-hover);
28
+ --color-ring: var(--ring);
29
+ --color-danger: var(--danger);
30
+ --color-danger-hover: var(--danger-hover);
31
+ --color-danger-foreground: var(--danger-foreground);
32
+ --color-success: var(--success);
33
+ --color-success-foreground: var(--success-foreground);
34
+ --color-warning: var(--warning);
35
+ --color-warning-foreground: var(--warning-foreground);
36
+ --color-info: var(--info);
37
+ --color-info-foreground: var(--info-foreground);
38
+ --radius-sm: calc(var(--radius) - 2px);
39
+ --radius-md: var(--radius);
40
+ --radius-lg: calc(var(--radius) + 2px);
41
+ --radius-xl: calc(var(--radius) + 4px);
42
+ }
43
+
44
+ @layer base {
45
+ body {
46
+ background: var(--background);
47
+ color: var(--foreground);
48
+ }
49
+ }