sh-ui-cli 0.40.0 → 0.42.0

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
@@ -21,8 +21,10 @@ const usage = `사용법:
21
21
  옵션:
22
22
  --skip-install (add) 외부 패키지 자동 설치 생략
23
23
  --diff (add) 파일을 쓰지 않고 변경 내역만 출력
24
+ --force (add) 기존 파일을 모두 덮어쓰기 (prompt 없음)
25
+ (remove) 사용자가 수정한 파일도 삭제
26
+ --keep (add) 기존 파일을 모두 유지 (prompt 없음)
24
27
  --all (list) 설치되지 않은 컴포넌트까지 표시
25
- --force (remove) 사용자가 수정한 파일도 삭제
26
28
  --dry-run (remove) 삭제 대상만 출력하고 실행 안 함
27
29
  `;
28
30
 
@@ -39,13 +41,20 @@ try {
39
41
  case "add": {
40
42
  const skipInstall = rest.includes("--skip-install");
41
43
  const diffMode = rest.includes("--diff");
44
+ const force = rest.includes("--force");
45
+ const keepFlag = rest.includes("--keep");
46
+ if (force && keepFlag) {
47
+ console.error("에러: --force 와 --keep 은 함께 쓸 수 없습니다.\n");
48
+ process.exit(1);
49
+ }
50
+ const onConflict = force ? "overwrite" : keepFlag ? "keep" : "prompt";
42
51
  const names = rest.filter((a) => !a.startsWith("--"));
43
52
  if (names.length === 0) {
44
53
  console.error("에러: 추가할 컴포넌트 이름이 필요합니다.\n");
45
54
  console.error(usage);
46
55
  process.exit(1);
47
56
  }
48
- await add({ cwd: process.cwd(), names, skipInstall, diffMode });
57
+ await add({ cwd: process.cwd(), names, skipInstall, diffMode, onConflict });
49
58
  break;
50
59
  }
51
60
  case "list": {
@@ -2,6 +2,35 @@
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.42.0",
7
+ "date": "2026-04-30",
8
+ "title": "Calendar 컴포넌트 + DatePicker 내부 리팩터링",
9
+ "type": "minor",
10
+ "highlights": [
11
+ "**신규 `Calendar` 컴포넌트** — 인라인 캘린더 primitive. `mode=\"single\" | \"multiple\" | \"range\"` 3종, `numberOfMonths` 로 동시에 여러 달 표시, `disabled(date)` 콜백으로 날짜별 비활성 처리(e.g. 주말 비활성)",
12
+ "**빠른 헤더 내비게이션** — `‹‹ / ››` (1년 단위), `‹ / ›` (1개월 단위) + 연도/월 dropdown 으로 임의 연도·월 점프. dropdown 은 sh-ui `Select` 로 빌드되어 어포던스(chevron) 와 키보드 내비게이션을 그대로 가짐. `fromYear` / `toYear` 로 dropdown 범위 커스터마이징",
13
+ "**Compound API** — `CalendarHeader` / `CalendarPrevYearButton` / `CalendarPrevMonthButton` / `CalendarYearSelect` / `CalendarMonthSelect` / `CalendarNextMonthButton` / `CalendarNextYearButton` / `CalendarGrid` 컴파운드 파츠로 헤더를 자유롭게 조립. 화살표를 선택적으로 숨기거나 dropdown 만 노출하는 식의 변형이 가능",
14
+ "`weekStartsOn` (0=일/1=월), `weekdayLabels`, `formatMonthLabel` 등 i18n/표시 옵션. 키보드는 ←→↑↓ 외에 `PageUp/Down`(월), `Home/End`(월의 시작/끝)도 지원",
15
+ "**`DatePicker` 내부 리팩터링** — 중복 구현되어 있던 캘린더 그리드를 신규 `Calendar` 로 교체. 공개 API(`DatePicker` / `DateRangePicker` / `DatePickerCalendar` 등)는 변경 없음",
16
+ "registry: `calendar` 가 `select` 를, `date-picker` 가 `calendar` 를 registryDependency 로 의존 — `npx sh-ui-cli add date-picker` 시 `calendar` + `select` 도 자동 설치",
17
+ "**CLI: 기존 파일 충돌 처리** — registryDependency 로 끌려온 컴포넌트가 이미 존재 + 사용자가 커스터마이즈한 경우 자동으로 덮어쓰지 않는다. TTY 에서는 keep / overwrite / keep-all / overwrite-all 4지선다 prompt, 비대화형(CI·파이프·MCP) 환경에서는 자동으로 keep. `--force` / `--keep` 플래그로 동작 고정 가능. MCP `sh_ui_add_component` 도 기본 keep + `overwrite: true` 옵션 노출"
18
+ ],
19
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.42.0"
20
+ },
21
+ {
22
+ "version": "0.41.0",
23
+ "date": "2026-04-30",
24
+ "title": "sh-ui create — git 자동 초기화 + .gitignore 자동 생성",
25
+ "type": "minor",
26
+ "highlights": [
27
+ "**`sh-ui create` 직후 `git init` 자동 실행** — 별도 명령 없이 바로 첫 커밋 가능한 상태. git 미설치 등 실패 시는 조용히 스킵 (스캐폴드 자체는 성공)",
28
+ "**`.gitignore` 자동 생성** — Next.js standalone / monorepo / Flutter 각 템플릿에 맞는 ignore 패턴 동봉. 모노레포는 `.turbo` `.vercel`, Flutter 는 `.dart_tool/` `**/ios/Flutter/.last_build_id` 등 플랫폼 표준 패턴 + `.claude/settings.local.json` 공통",
29
+ "**npm strip 우회** — npm publish 가 패키지 내 `.gitignore` 를 자동 strip 하던 이슈를 템플릿 파일명 `gitignore` (no-dot) → 스캐폴드 시 `.gitignore` 로 리네이밍하는 방식으로 해결",
30
+ "dry-run 모드는 git init / 파일 쓰기 모두 우회 (기존 동작 유지)"
31
+ ],
32
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.41.0"
33
+ },
5
34
  {
6
35
  "version": "0.40.0",
7
36
  "date": "2026-04-29",