From 98462488e8ea85da4f628625df4b4edd6558bf67 Mon Sep 17 00:00:00 2001 From: Samuel Kim Date: Fri, 27 Mar 2026 16:47:32 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20.claude/skills=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?(claude-plugins-ios=20=EB=A7=88=EC=BC=93=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EC=A0=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/figma-to-swiftui/SKILL.md | 179 ----------------------- .claude/skills/release/SKILL.md | 124 ---------------- 2 files changed, 303 deletions(-) delete mode 100644 .claude/skills/figma-to-swiftui/SKILL.md delete mode 100644 .claude/skills/release/SKILL.md diff --git a/.claude/skills/figma-to-swiftui/SKILL.md b/.claude/skills/figma-to-swiftui/SKILL.md deleted file mode 100644 index 9fd02048..00000000 --- a/.claude/skills/figma-to-swiftui/SKILL.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -name: figma-to-swiftui -description: Figma 디자인을 Montage 디자인 시스템의 SwiftUI 코드로 변환 ---- - -# Figma to SwiftUI (Montage Design System) - -피그마 디자인을 Montage 디자인 시스템의 SwiftUI 코드로 변환합니다. - -## 입력 - -$ARGUMENTS - -## 절차 - -### 1단계: 피그마 디자인 분석 - -피그마 URL에서 fileKey와 nodeId를 추출합니다. -- URL 형식: `https://figma.com/design/:fileKey/:fileName?node-id=:int1-:int2` -- fileKey: URL path의 `:fileKey` 부분 -- nodeId: `node-id` 쿼리 파라미터의 값 (하이픈을 콜론으로 변환, 예: `1-2` → `1:2`) - -`mcp__figma__get_design_context` 도구를 사용하여 디자인 컨텍스트를 가져옵니다. -- clientLanguages: "swift" -- clientFrameworks: "swiftui" - -필요하다면 `mcp__figma__get_screenshot` 도구로 스크린샷도 확인합니다. - -### 2단계: Montage 컴포넌트 매핑 - -디자인에서 사용되는 UI 요소를 분석하고, 아래 Montage 컴포넌트 목록에서 매칭되는 컴포넌트를 식별합니다. - -**Actions (액션)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| ActionArea | 화면 하단 액션 버튼 영역 | `Projects/Views/Montage/documentation/components/actions/actionarea/ios.md` | -| Button | 버튼 (solid, outlined) | `Projects/Views/Montage/documentation/components/actions/button/ios.md` | -| Chip | 칩 | `Projects/Views/Montage/documentation/components/actions/chip/ios.md` | -| IconButton | 아이콘 버튼 | `Projects/Views/Montage/documentation/components/actions/iconbutton/ios.md` | -| TextButton | 텍스트 버튼 | `Projects/Views/Montage/documentation/components/actions/textbutton/ios.md` | - -**Contents (콘텐츠)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| Accordion | 접을 수 있는 콘텐츠 | `Projects/Views/Montage/documentation/components/contents/accordion/ios.md` | -| Avatar | 프로필 이미지 | `Projects/Views/Montage/documentation/components/contents/avatar/ios.md` | -| AvatarGroup | 그룹 아바타 | `Projects/Views/Montage/documentation/components/contents/avatargroup/ios.md` | -| Card | 썸네일+콘텐츠 카드 | `Projects/Views/Montage/documentation/components/contents/card/ios.md` | -| ContentBadge | 텍스트/아이콘 뱃지 | `Projects/Views/Montage/documentation/components/contents/contentbadge/ios.md` | -| ListCard | 수평 리스트 카드 | `Projects/Views/Montage/documentation/components/contents/listcard/ios.md` | -| ListCell | 리스트 아이템 | `Projects/Views/Montage/documentation/components/contents/listcell/ios.md` | -| PlayBadge | 재생 버튼 뱃지 | `Projects/Views/Montage/documentation/components/contents/playbadge/ios.md` | -| SectionHeader | 섹션 헤더 | `Projects/Views/Montage/documentation/components/contents/sectionheader/ios.md` | -| Thumbnail | 이미지 썸네일 | `Projects/Views/Montage/documentation/components/contents/thumbnail/ios.md` | - -**Feedback (피드백)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| FallbackView | 빈 화면/에러 대체 | `Projects/Views/Montage/documentation/components/feedback/fallbackview/ios.md` | -| PushBadge | 알림 뱃지 | `Projects/Views/Montage/documentation/components/feedback/pushbadge/ios.md` | -| SnackBar | 알림 메시지 | `Projects/Views/Montage/documentation/components/feedback/snackbar/ios.md` | -| Toast | 짧은 알림 | `Projects/Views/Montage/documentation/components/feedback/toast/ios.md` | - -**Loading (로딩)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| Loading | 로딩 애니메이션 | `Projects/Views/Montage/documentation/components/loading/loading/ios.md` | -| Skeleton | 스켈레톤 UI | `Projects/Views/Montage/documentation/components/loading/skeleton/ios.md` | - -**Navigations (네비게이션)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| Category | 카테고리 선택 | `Projects/Views/Montage/documentation/components/navigations/category/ios.md` | -| PageCounter | 숫자 페이지 표시기 | `Projects/Views/Montage/documentation/components/navigations/pagecounter/ios.md` | -| PaginationDots | 점 페이지 표시기 | `Projects/Views/Montage/documentation/components/navigations/paginationdots/ios.md` | -| ProgressIndicator | 진행 인디케이터 | `Projects/Views/Montage/documentation/components/navigations/progressindicator/ios.md` | -| ProgressTracker | 단계별 진행 표시 | `Projects/Views/Montage/documentation/components/navigations/progresstracker/ios.md` | -| Tab | 탭 메뉴 | `Projects/Views/Montage/documentation/components/navigations/tab/ios.md` | -| TopNavigation | 상단 내비게이션 바 | `Projects/Views/Montage/documentation/components/navigations/topnavigation/ios.md` | - -**Presentation (프레젠테이션)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| BottomSheet | 바텀 시트 모달 | `Projects/Views/Montage/documentation/components/presentation/bottomsheet/ios.md` | -| Popover | 팝오버 | `Projects/Views/Montage/documentation/components/presentation/popover/ios.md` | -| Popup | 팝업 모달 | `Projects/Views/Montage/documentation/components/presentation/popup/ios.md` | -| Tooltip | 툴팁 | `Projects/Views/Montage/documentation/components/presentation/tooltip/ios.md` | - -**Selection & Input (선택/입력)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| Checkbox | 체크박스 | `Projects/Views/Montage/documentation/components/selection and input/checkbox/ios.md` | -| Checkmark | 체크마크 | `Projects/Views/Montage/documentation/components/selection and input/checkmark/ios.md` | -| FilterButton | 필터 버튼 | `Projects/Views/Montage/documentation/components/selection and input/filterbutton/ios.md` | -| FramedStyle | 프레임 스타일 | `Projects/Views/Montage/documentation/components/selection and input/framedstyle/ios.md` | -| Radio | 라디오 버튼 | `Projects/Views/Montage/documentation/components/selection and input/radio/ios.md` | -| SegmentedControl | 세그먼트 컨트롤 | `Projects/Views/Montage/documentation/components/selection and input/segmentedcontrol/ios.md` | -| Select | 드롭다운 선택 | `Projects/Views/Montage/documentation/components/selection and input/select/ios.md` | -| Slider | 슬라이더 | `Projects/Views/Montage/documentation/components/selection and input/slider/ios.md` | -| Switch | 스위치 | `Projects/Views/Montage/documentation/components/selection and input/switch/ios.md` | -| TextArea | 여러 줄 텍스트 입력 | `Projects/Views/Montage/documentation/components/selection and input/textarea/ios.md` | -| TextField | 단일 줄 텍스트 입력 | `Projects/Views/Montage/documentation/components/selection and input/textfield/ios.md` | - -**Utilities (유틸리티)** -| 컴포넌트 | 설명 | 문서 경로 | -|---|---|---| -| Color | 디자인 시스템 컬러 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/color.md` | -| FlowLayout | 흐름 레이아웃 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/flowlayout.md` | -| Icon | 아이콘 세트 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/icon.md` | -| Interaction | 상호작용 장식 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/interaction.md` | -| ModalNavigation | 모달 내비게이션 바 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/modalnavigation.md` | -| Opacity | 투명도 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/opacity.md` | -| PullToRefresh | 당겨서 새로고침 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/pulltorefresh.md` | -| ScrollView | 커스텀 스크롤뷰 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/scrollview.md` | -| Shadow | 그림자 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/shadow.md` | -| Spacing | 간격 시스템 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/spacing.md` | -| Typography | 타이포그래피 | `Projects/Views/Montage/documentation/utilities/ios-utility-components/typography.md` | - -### 3단계: API 문서 참조 - -식별된 각 컴포넌트와 유틸리티 토큰의 API 문서를 **반드시** 읽습니다. 문서 소스 우선순위: - -**1순위: doccarchive JSON** (소스 코드에서 자동 생성된 정확한 API 스펙) -``` -# 컴포넌트 개요 — initializers, methods, enums, 코드 예시 포함 -Projects/Views/Montage/.build/derived_data/Build/Products/Debug-iphoneos/Montage.doccarchive/data/documentation/montage/{컴포넌트명 lowercase}.json - -# 중첩 타입 세부 정보 — enum case, nested struct 등 -Projects/Views/Montage/.build/derived_data/Build/Products/Debug-iphoneos/Montage.doccarchive/data/documentation/montage/{컴포넌트명 lowercase}/{중첩타입 lowercase}.json -``` -- 2단계에서 식별된 **모든 컴포넌트**의 doccarchive JSON을 읽을 것 -- 컴포넌트에서 사용하는 enum/nested type도 함께 읽을 것 (예: Button이면 `button/variant.json`, `button/size.json`, `button/color.json`도 확인) - -**2순위: markdown 문서** (doccarchive에 해당 컴포넌트가 없는 경우 fallback) -- 2단계 테이블의 문서 경로를 프로젝트 루트에서 참조 - -**유틸리티 토큰 문서** (항상 읽을 것): - -| 토큰 | doccarchive (1순위) | markdown (2순위) | -|------|---------------------|------------------| -| Color | `montage/color.json` + `montage/color/{semantic,atomic}.json` | `Projects/Views/Montage/documentation/utilities/ios-utility-components/color.md` | -| Typography | `montage/typography.json` + `montage/typography/{variant,weight}.json` | `Projects/Views/Montage/documentation/utilities/ios-utility-components/typography.md` | -| Spacing | `montage/spacing.json` | `Projects/Views/Montage/documentation/utilities/ios-utility-components/spacing.md` | -| Icon | `montage/icon.json` | `Projects/Views/Montage/documentation/utilities/ios-utility-components/icon.md` | - -> **중요**: 이 단계에서 읽은 문서가 코드 생성의 유일한 진실의 원천(single source of truth)입니다. 사전 지식이나 추측으로 API를 사용하지 마세요. - -### 4단계: SwiftUI 코드 생성 - -다음 규칙을 따라 코드를 생성합니다: - -1. **import**: `import Montage` 사용 -2. **컴포넌트 우선**: 표준 SwiftUI 뷰보다 Montage 컴포넌트를 우선 사용 (예: `SwiftUI.Button` 대신 `Montage.Button`) -3. **디자인 토큰 사용**: 하드코딩된 값 대신, **3단계에서 읽은 문서에 명시된** Montage 토큰 API를 그대로 사용. 색상/타이포그래피/간격 모두 문서에서 확인한 정확한 시그니처를 따를 것 -4. **피그마 속성 매핑**: - - 피그마의 variant/property → 3단계에서 확인한 Montage enum 값으로 매핑 - - 피그마의 색상 토큰 → 3단계에서 확인한 Color 토큰으로 매핑 - - 피그마의 텍스트 스타일 → 3단계에서 확인한 Typography variant로 매핑 -5. **코드 스타일**: CLAUDE.md의 Swift 문법 규칙을 따름 - -### 5단계: API 검증 - -생성한 코드에서 사용한 Montage API가 실제로 존재하는지 검증합니다. - -1. 코드에서 사용한 모든 Montage 타입, initializer, modifier, enum case를 목록으로 추출 -2. 각 항목이 3단계에서 읽은 doccarchive/문서에 **실제로 존재하는지** 대조 -3. 문서에서 확인할 수 없는 API가 있다면, Swift 소스 파일에서 직접 확인: - ``` - Projects/Views/Montage/Sources/Montage/{컴포넌트명}.swift - ``` -4. 존재하지 않는 API를 사용한 경우, 문서에서 확인된 올바른 API로 교체 - -### 6단계: 결과 출력 - -생성된 코드와 함께 다음을 출력합니다: -- 사용된 Montage 컴포넌트 목록 -- 5단계 검증 결과 (수정된 API가 있다면 무엇을 왜 바꿨는지) -- 피그마 디자인과 1:1 매핑이 되지 않는 부분이 있다면 설명 -- Montage에 없는 커스텀 UI가 필요한 부분이 있다면 안내 diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md deleted file mode 100644 index 2c7e40bd..00000000 --- a/.claude/skills/release/SKILL.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -name: montage-release -description: Montage GitHub Release 생성 및 취소 (릴리즈/태그 관리, Slack 알림) ---- - -# Montage Release - -Montage 디자인 시스템(wanteddev/montage-ios)의 GitHub Release를 생성하거나 취소합니다. - -## 입력 - -$ARGUMENTS - -## 0단계 — 액션 선택 - -- `$ARGUMENTS`에 "취소" 또는 "cancel"이 포함되면 → **릴리즈 취소 플로우**로 진입 -- 그 외 → **릴리즈 생성 플로우**로 진입 - ---- - -## [릴리즈 생성 플로우] - -### 1단계 — 버전 선택 - -1. `gh release list --repo wanteddev/montage-ios --limit 1`로 최신 버전(latest) 확인 -2. `$ARGUMENTS`에 버전(`v`로 시작)이 있으면 사용, 없으면 AskUserQuestion으로 bump 유형 질문: - - Patch (v3.3.1 → v3.3.2) - - Minor (v3.3.1 → v3.4.0) - - Major (v3.3.1 → v4.0.0) - - Other (직접 입력) -3. **버전 입력 검증**: 입력된 버전이 semver 형식(`v{major}.{minor}.{patch}`)인지 확인. `v` 접두사가 없으면 자동 추가. 형식이 잘못되면 재입력 요청 - -### 2단계 — Release 브랜치 확인 - -`git ls-remote --heads origin release/{version_without_v}`로 release 브랜치 존재 여부 확인 - -- **브랜치 있음**: - 1. `gh pr list --repo wanteddev/montage-ios --head release/{version_without_v} --base main`으로 PR 상태 확인 - 2. PR이 이미 merged → 3단계(릴리즈 생성)로 진행 - 3. PR이 open → PR URL을 알려주고 "PR이 머지된 후 다시 실행해주세요." 안내 후 **중단** - 4. PR 없음 → PR 생성(`release/{ver} → main`) 후 **중단** -- **브랜치 없음** → main에서 릴리즈할지 AskUserQuestion으로 확인. 거부 시 중단 - -### 3단계 — GitHub Release 생성 - -1. **`--latest` 플래그 조건부 적용**: 선택한 버전이 현재 latest 버전보다 높은 경우에만 `--latest` 추가. 낮은 버전(hotfix 등)이면 `--latest` 생략 -2. `gh release create {version} --repo wanteddev/montage-ios --target main --generate-notes [--latest] --title "{version}"` -3. `gh release view {version} --repo wanteddev/montage-ios --json url,body`로 릴리즈 URL과 body 가져오기 - -### 4단계 — 마일스톤 클로즈 - -1. `gh api repos/wanteddev/montage-ios/milestones --jq '.[] | select(.title=="{version_without_v}") | .number'`로 해당 버전의 마일스톤 번호 조회 -2. **마일스톤 있음**: `gh api -X PATCH repos/wanteddev/montage-ios/milestones/{number} -f state=closed`로 클로즈 -3. **마일스톤 없음**: "마일스톤 {version_without_v}이(가) 존재하지 않아 건너뜁니다." 안내 후 다음 단계로 진행 - -### 5단계 — Slack 알림 - -1. Slack MCP 사용 가능 여부 확인 (`mcp__plugin_slack_slack__slack_send_message` 도구 존재 여부) -2. **사용 불가 시**: "Slack MCP가 설정되어 있지 않습니다. 아래 명령어로 설정해주세요:" 안내 후 메시지 텍스트 출력 - ``` - claude plugin add slack - ``` -3. **사용 가능 시**: - - body를 Slack standard markdown으로 변환하여 **메시지 미리보기를 사용자에게 표시** - - AskUserQuestion으로 확인: "아래 메시지를 #design_system_updates, #ios-developers 채널에 발송할까요?" - - 옵션: "발송", "수정 후 발송", "발송하지 않음" - - 확인 후 두 채널에 발송: - - `C068KCRS2LD` (#design_system_updates) - - `C0136G84N87` (#ios-developers) - -**메시지 형식**: -``` -:appleinc:**Montage {version} Release 되었습니다.** -{release_url} - -**What's Changed** -• {changes... } - -Full Changelog: <{compare_url}|{old_version}...{new_version}> -``` - -**body 변환 규칙** (GitHub Release body → Slack mrkdwn): -1. **지라 티켓번호 링크 추가**: `[PI-12345]` → `` (지라 링크 추가, 대괄호 유지). `WRP-` 접두사도 동일 처리 -2. **PR 링크 유지**: `in https://github.com/.../pull/123` → `in ` (URL을 PR 번호 링크로 변환) -3. **Full Changelog 링크**: 전체 URL 대신 `<{compare_url}|{old_version}...{new_version}>` 형식으로 변환 -4. **`*` 불릿 → `•`**: 마크다운 리스트를 Slack 불릿으로 변환 - ---- - -## [릴리즈 취소 플로우] - -### 1단계 — 취소할 버전 선택 - -1. `gh release list --repo wanteddev/montage-ios --limit 5`로 최근 릴리즈 목록 표시 -2. `$ARGUMENTS`에 버전이 있으면 사용, 없으면 AskUserQuestion으로 취소할 버전 선택 - - 최근 5개 릴리즈를 옵션으로 제시 - -### 2단계 — 경고 및 확인 - -AskUserQuestion으로 경고 메시지 표시: -- 질문: "`{version}` 릴리즈를 취소하면 해당 태그와 릴리즈가 모두 삭제됩니다. 이미 이 버전을 의존성으로 사용 중인 프로젝트가 있다면 빌드가 깨질 수 있습니다. 정말 취소하시겠습니까?" -- 옵션: "취소 진행", "중단" -- "중단" 선택 시 작업 종료 - -### 3단계 — 릴리즈 및 태그 삭제 - -1. `gh release delete {version} --repo wanteddev/montage-ios --yes`로 릴리즈 삭제 -2. `git push origin --delete {version}`으로 원격 태그 삭제 -3. **latest 복원**: 삭제한 버전이 latest였으면, 이전 릴리즈를 latest로 설정 - - `gh release list --repo wanteddev/montage-ios --limit 1`로 현재 최신 확인 - - `gh release edit {prev_version} --repo wanteddev/montage-ios --latest` - -### 4단계 — Slack 취소 알림 - -1. Slack MCP 사용 가능 여부 확인 (생성 플로우와 동일한 방식) -2. 두 채널에 취소 메시지 발송 (미리보기 없이 바로 발송): - - `C068KCRS2LD` (#design_system_updates) - - `C0136G84N87` (#ios-developers) - -**메시지 형식**: -``` -:warning:**Montage {version} 릴리즈가 취소되었습니다.** -해당 버전의 태그와 릴리즈가 삭제되었습니다. -```