sh-ui-cli 0.88.1 → 0.89.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.
@@ -2,6 +2,31 @@
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.89.1",
7
+ "date": "2026-05-14",
8
+ "title": "/create 페이지 vite + tauri 노출 + api.d.ts 타입 정정",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**docs `/create` 페이지에 Vite (SPA) 플랫폼 토글 + Tauri 데스크탑 셸 토글** — v0.86.0~v0.88.0 의 CLI 변경이 docs UI 까지 따라가지 못한 빈틈 해소. ProjectOptionsForm 의 플랫폼 ToggleGroup 에 'Vite (SPA)' 추가, vite 일 때 구조/아키텍처/CSS 프레임워크 토글 공유 (플러그인은 next 전용), vite + standalone 일 때만 `--tauri` 버튼 활성 (monorepo+tauri 는 v0.89 후속이라 자동 비활성화 + 친절한 hover hint).",
12
+ "**`sh-ui-cli/api` 의 `.d.ts` 타입 정정** — `CreatePlatform` union 이 v0.86.0 부터 runtime 에 'vite' 추가됐는데 `api.d.ts` 가 `'next' \\| 'flutter'` 로 stale 상태였음. 'vite' 추가로 union 동기화. `DescribeTemplateOptions` 에도 v0.88.0 부터 runtime 이 받던 `tauri?: boolean` 필드 명시. 다운스트림 TS 소비자 가 정확한 타입 받음.",
13
+ "**`/api/template-content` 엔드포인트가 vite 인식** — 미리보기 트리에서 vite-standalone / vite-app / tauri-shell 파일을 정확히 resolve. `?tauri=true` 쿼리 시 `src-tauri/*` 경로가 `tauri-shell` 템플릿에서 lookup. 모노레포 `apps/{name}/*` 는 vite-app, `packages/ui/ui-apps/ui-{name}/*` 는 ui-app-template, 루트는 monorepo 템플릿."
14
+ ],
15
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.89.1"
16
+ },
17
+ {
18
+ "version": "0.89.0",
19
+ "date": "2026-05-14",
20
+ "title": "vite-standalone fsd arch — FSD-pure entry (src/app/main.tsx)",
21
+ "type": "minor",
22
+ "highlights": [
23
+ "**fsd arch 의 entry 가 `src/app/main.tsx` 로 이동** — Feature-Sliced Design 의 app layer 가 정식 부트스트랩 위치가 되도록. v0.88.x 까지는 Vite 컨벤션 (`src/main.tsx`) 따라 루트에 두고 안에서 FSD 레이어로 분기하던 1-layer 우회 — v0.89.0 부터는 entry 자체가 app layer 안. `_arch/fsd/index.html` overlay 신설 (script src `/src/app/main.tsx`). ai-org 처럼 명시적 FSD 노선을 가진 프로젝트에 맞춤.",
24
+ "**flat arch 는 Vite 컨벤션 유지** — `src/main.tsx` + `src/App.tsx` + `src/Home.tsx` 그대로 루트. 그러나 base 에서 이 파일들이 빠지면서 `_arch/flat/` overlay 가 자체적으로 emit (`_arch/flat/index.html`, `_arch/flat/src/Home.tsx` 신설). 사용자 입장의 결과 파일은 v0.88.x 와 동일.",
25
+ "**base 가 entry 책임 안 가짐** — `index.html`, `src/App.tsx`, `src/Home.tsx`, `src/main.tsx` 가 vite-standalone base 에서 제거. 각 arch overlay 가 자체 entry 를 owner — flat 은 Vite-style, fsd 는 FSD-pure. base 는 빌드 설정 + 메타 파일만 (CLAUDE.md / README.md / package.json / vite.config.ts / tsconfig.* / eslint.config.js / vitest.config.ts / gitignore — 10개).",
26
+ "**Smoke V10 + V11 회귀 가드 + V1 갱신** — V10 은 fsd 의 `src/app/main.tsx` 존재 + 루트 entry/opinionated 폴더 부재 + index.html script 경로 단언. V11 은 flat 의 Vite-convention 보장. V1 (기존 vite fsd smoke) 도 새 entry 경로로 갱신. fsd + flat 양쪽 manual `pnpm build` 검증 그린."
27
+ ],
28
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.89.0"
29
+ },
5
30
  {
6
31
  "version": "0.88.1",
7
32
  "date": "2026-05-14",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.88.1",
3
+ "version": "0.89.1",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/api.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * apps/docs 등 TypeScript 사용자가 자동완성과 타입 안전을 받을 수 있게.
4
4
  */
5
5
 
6
- export type CreatePlatform = 'next' | 'flutter';
6
+ export type CreatePlatform = 'next' | 'flutter' | 'vite';
7
7
  export type CreateStructure = 'standalone' | 'monorepo';
8
8
  export type InitPlatform = 'react' | 'flutter';
9
9
  export type ThemeBase = 'neutral' | 'zinc' | 'slate';
@@ -139,6 +139,8 @@ export interface DescribeTemplateOptions {
139
139
  projectName?: string;
140
140
  /** monorepo 첫 앱 이름. 기본 'web'. */
141
141
  appName?: string;
142
+ /** platform=vite + structure=standalone 일 때 Tauri 2.x 셸(`src-tauri/`) 동시 emit. */
143
+ tauri?: boolean;
142
144
  }
143
145
 
144
146
  export interface DescribeTemplateGroup {
@@ -384,11 +384,7 @@ export const TEMPLATE_MANIFEST = {
384
384
  "README.md",
385
385
  "eslint.config.js",
386
386
  "gitignore",
387
- "index.html",
388
387
  "package.json",
389
- "src/App.tsx",
390
- "src/Home.tsx",
391
- "src/main.tsx",
392
388
  "tsconfig.json",
393
389
  "tsconfig.node.json",
394
390
  "vite.config.ts",
@@ -397,8 +393,10 @@ export const TEMPLATE_MANIFEST = {
397
393
  ],
398
394
  "arches": {
399
395
  "flat": [
396
+ "index.html",
400
397
  "sh-ui.config.json",
401
398
  "src/App.tsx",
399
+ "src/Home.tsx",
402
400
  "src/components/layouts/RootLayout.tsx",
403
401
  "src/components/providers/GlobalProvider/index.tsx",
404
402
  "src/components/providers/index.tsx",
@@ -412,12 +410,13 @@ export const TEMPLATE_MANIFEST = {
412
410
  "tsconfig.app.json"
413
411
  ],
414
412
  "fsd": [
413
+ "index.html",
415
414
  "sh-ui.config.json",
416
- "src/App.tsx",
415
+ "src/app/App.tsx",
417
416
  "src/app/layouts/RootLayout.tsx",
417
+ "src/app/main.tsx",
418
418
  "src/app/providers/GlobalProvider/index.tsx",
419
419
  "src/app/providers/theme/ThemeProvider.tsx",
420
- "src/main.tsx",
421
420
  "src/shared/api/queryClient.ts",
422
421
  "src/shared/hooks/useTheme.ts",
423
422
  "src/shared/lib/utils.ts",
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html lang="ko" suppressHydrationWarning>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <!-- viewport-fit=cover: iOS safe-area inset / Android edge-to-edge / Tauri mobile 호환 -->
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
8
+ <!-- theme-color: 모바일 브라우저 / PWA / Tauri WebView 의 status bar 톤. dark default 에 맞춰 어두운 톤. -->
9
+ <meta name="theme-color" content="#0A0A0A" media="(prefers-color-scheme: dark)" />
10
+ <meta name="theme-color" content="#FFFFFF" media="(prefers-color-scheme: light)" />
11
+ <title>sh-ui app</title>
12
+ <script>
13
+ // FOUC 차단 — ThemeProvider mount 전에 첫 paint 에 dark class 박기.
14
+ try {
15
+ var t = localStorage.getItem('theme');
16
+ var d = t === 'dark' || ((!t || t === 'system') && matchMedia('(prefers-color-scheme:dark)').matches);
17
+ if (d) document.documentElement.classList.add('dark');
18
+ } catch (e) {}
19
+ </script>
20
+ </head>
21
+ <body>
22
+ <div id="root"></div>
23
+ <!-- v0.89.0+ FSD-pure entry — 부트스트랩이 app layer 안에 있음. -->
24
+ <script type="module" src="/src/app/main.tsx"></script>
25
+ </body>
26
+ </html>
@@ -1,12 +1,13 @@
1
1
  import { GlobalProvider } from '@/app/providers/GlobalProvider';
2
2
  import { RootLayout } from '@/app/layouts/RootLayout';
3
- import Home from './Home';
4
3
 
5
4
  export default function App() {
6
5
  return (
7
6
  <GlobalProvider>
8
7
  <RootLayout>
9
- <Home />
8
+ <main className="flex min-h-screen flex-col items-center justify-center">
9
+ <h1 className="text-4xl font-bold">Hello World</h1>
10
+ </main>
10
11
  </RootLayout>
11
12
  </GlobalProvider>
12
13
  );
@@ -1,5 +0,0 @@
1
- import Home from './Home';
2
-
3
- export default function App() {
4
- return <Home />;
5
- }
@@ -1,9 +0,0 @@
1
- import { StrictMode } from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import App from './App';
4
-
5
- createRoot(document.getElementById('root')!).render(
6
- <StrictMode>
7
- <App />
8
- </StrictMode>,
9
- );