sh-ui-cli 0.45.0 → 0.45.2

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,30 @@
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.45.2",
7
+ "date": "2026-04-30",
8
+ "title": "추가 하드코딩 제거 — release URL · MCP 패키지명 동적 파생",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**`scripts/release.mjs` 의 GitHub URL 동적화** — `cli/package.json` 의 `repository.url` 에서 base URL 추출 (`.git` suffix + `git+` prefix 정리) 후 `${base}/releases/tag/v${ver}` 빌드. owner/repo 이름이 바뀌면 cli/package.json 한 곳만 갱신하면 따라옴.",
12
+ "**MCP 서버의 cli 패키지명 동적 읽기** — `mcp-init.mjs` 의 `SH_UI_ENTRY.args` 와 `mcp.mjs` 의 `SERVER_INSTRUCTIONS`/tool description 안 `npx <cli> create ...` 예시가 모두 `package.json` 의 `name` 에서 동적 보간. cli 가 rename 되어도 자동 동기화.",
13
+ "기능 변경 0 — drift 위험만 추가 제거. v0.45.1 의 mcp.mjs version 동적 읽기 + `pnpm release` 에 이은 후속 정리."
14
+ ],
15
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.45.2"
16
+ },
17
+ {
18
+ "version": "0.45.1",
19
+ "date": "2026-04-30",
20
+ "title": "릴리즈 자동화 — `pnpm release` 명령 + mcp.mjs 동적 버전",
21
+ "type": "patch",
22
+ "highlights": [
23
+ "**`pnpm release <patch|minor|major|X.Y.Z>` 명령 신설** — packages/cli/package.json 의 version 갱신 + packages/changelog/versions.json 에 placeholder 엔트리 prepend 를 한 번에 처리. 매 릴리즈 6단계 수작업 → highlights 채우기 + git/PR/merge/tag 6 명령으로 단순화. 거꾸로 가는 버전·중복 엔트리·잘못된 형식 인자는 모두 거부.",
24
+ "**MCP 서버 버전 동적 읽기** — `packages/cli/src/mcp.mjs` 가 시작 시점에 package.json 의 version 을 읽도록 변경. 하드코딩된 `version: \"X.Y.Z\"` 문자열 제거 — 매 릴리즈마다 손으로 갱신할 필요 영구 사라짐 (실제로 v0.45.0 출고 시 거의 빠뜨릴 뻔한 drift 위험을 잡은 변경).",
25
+ "기능 변경 0 — 릴리즈 워크플로 신뢰성만 향상."
26
+ ],
27
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.45.1"
28
+ },
5
29
  {
6
30
  "version": "0.45.0",
7
31
  "date": "2026-04-30",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.45.0",
3
+ "version": "0.45.2",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/mcp-init.mjs CHANGED
@@ -19,10 +19,18 @@ import { homedir, platform as osPlatform } from "node:os";
19
19
 
20
20
  const CLIENTS = ["claude-code", "cursor", "claude-desktop"];
21
21
 
22
- const SH_UI_ENTRY = {
23
- command: "npx",
24
- args: ["-y", "sh-ui-cli", "mcp"],
25
- };
22
+ /**
23
+ * `npx -y <cliName> mcp` 형태의 MCP 엔트리 빌더.
24
+ * 패키지명을 package.json 에서 동적으로 읽어 cli rename 시에도 자동 따라감.
25
+ */
26
+ async function buildShUiEntry() {
27
+ const pkgUrl = new URL("../package.json", import.meta.url);
28
+ const pkg = JSON.parse(await readFile(pkgUrl, "utf8"));
29
+ return {
30
+ command: "npx",
31
+ args: ["-y", pkg.name, "mcp"],
32
+ };
33
+ }
26
34
 
27
35
  /** 클라이언트·스코프별 설정 파일 절대 경로. */
28
36
  function resolveConfigPath(client, scope, cwd) {
@@ -115,7 +123,7 @@ export async function mcpInit({ cwd, args }) {
115
123
  }
116
124
 
117
125
  const before = config.mcpServers["sh-ui"];
118
- config.mcpServers["sh-ui"] = SH_UI_ENTRY;
126
+ config.mcpServers["sh-ui"] = await buildShUiEntry();
119
127
 
120
128
  await mkdir(dirname(configPath), { recursive: true });
121
129
  await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf8");
package/src/mcp.mjs CHANGED
@@ -120,7 +120,22 @@ function resolveCwd(input) {
120
120
  return input?.cwd ? resolve(input.cwd) : process.cwd();
121
121
  }
122
122
 
123
- const SERVER_INSTRUCTIONS = `sh-ui — Base UI 위에 빌드된 React/Flutter 디자인 시스템.
123
+ /**
124
+ * 하드코딩 제거 — packages/cli/package.json 에서 version + name 을 시작 시점에 읽어 그대로 사용.
125
+ * mcp.mjs 가 src/ 에 있고 package.json 은 그 상위 (../package.json) 라 상대 URL 로 해석.
126
+ * 출고 모드 (data/ 번들) 에서도 동일 경로 (src/mcp.mjs ↔ package.json) 라 그대로 동작.
127
+ *
128
+ * version: McpServer 식별자 — 클라이언트가 캐시·진단용으로 표시
129
+ * name: SERVER_INSTRUCTIONS 의 `npx <cli> ...` 예시에 보간 — cli rename 시 자동 따라감
130
+ */
131
+ async function readPackageMeta() {
132
+ const pkgUrl = new URL("../package.json", import.meta.url);
133
+ const pkg = JSON.parse(await readFile(pkgUrl, "utf8"));
134
+ return { version: pkg.version, name: pkg.name };
135
+ }
136
+
137
+ function buildServerInstructions(cliName) {
138
+ return `sh-ui — Base UI 위에 빌드된 React/Flutter 디자인 시스템.
124
139
 
125
140
  ## 새 프로젝트를 만드는 경우
126
141
 
@@ -131,7 +146,7 @@ const SERVER_INSTRUCTIONS = `sh-ui — Base UI 위에 빌드된 React/Flutter
131
146
  - 인터랙티브 프롬프트 없이 한 번에 스캐폴드 + 토큰 + sh-ui.config.json 생성
132
147
 
133
148
  **2차 — Bash** (사용자가 직접 셸에서 돌리고 싶다고 명시할 때만):
134
- npx sh-ui-cli create my-app --platform next --structure standalone --yes
149
+ npx ${cliName} create my-app --platform next --structure standalone --yes
135
150
 
136
151
  \`create-next-app\` + \`sh_ui_init\` 조합은 **쓰지 말 것** — 위 두 경로가 더 짧고 sh-ui 관용에 맞다.
137
152
 
@@ -149,13 +164,15 @@ const SERVER_INSTRUCTIONS = `sh-ui — Base UI 위에 빌드된 React/Flutter
149
164
  - \`sh_ui_add_component\` / \`sh_ui_remove_component\` — 설치/삭제
150
165
  - \`sh_ui_get_changelog\` — 최근 변경 내역
151
166
  `;
167
+ }
152
168
 
153
169
  export async function startMcpServer() {
170
+ const { version, name: cliName } = await readPackageMeta();
154
171
  const server = new McpServer(
155
- { name: "sh-ui", version: "0.45.0" }, // sh-ui-cli 와 동기화
172
+ { name: "sh-ui", version },
156
173
  {
157
174
  capabilities: { tools: {} },
158
- instructions: SERVER_INSTRUCTIONS,
175
+ instructions: buildServerInstructions(cliName),
159
176
  },
160
177
  );
161
178
 
@@ -175,7 +192,7 @@ export async function startMcpServer() {
175
192
  {
176
193
  description:
177
194
  "빈 폴더에 sh-ui 프로젝트 스캐폴드 — Next.js (standalone/monorepo) 또는 Flutter. " +
178
- "FSD 폴더 구조 + 토큰 + sh-ui.config.json 일괄 생성. 사용자가 '새 프로젝트' / '빈 폴더' / '스캐폴드부터' 류 요청을 하면 이 툴 사용 (Bash 로 npx sh-ui-cli create 직접 호출보다 우선).",
195
+ `FSD 폴더 구조 + 토큰 + sh-ui.config.json 일괄 생성. 사용자가 '새 프로젝트' / '빈 폴더' / '스캐폴드부터' 류 요청을 하면 이 툴 사용 (Bash 로 npx ${cliName} create 직접 호출보다 우선).`,
179
196
  inputSchema: {
180
197
  name: z.string().min(1)
181
198
  .describe("프로젝트 디렉토리 이름. 예: my-app"),