From 982661cb1c6cddaff6ce0418cdda2ff55d84ba38 Mon Sep 17 00:00:00 2001 From: hyeonggil <> Date: Sun, 12 Apr 2026 16:32:51 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=EA=B3=B5=ED=86=B5=20Skill?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EB=B0=8F=20=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 8 +- README.md | 68 +++- .../.claude/common/CLAUDE.md | 39 +++ .../.claude/common/rules/claude-workflow.md | 62 ++++ .../common/rules/coding-conventions.md | 50 +++ .../.claude/common/rules/commit-pr.md | 83 +++++ .../.claude/common/rules/framework-rules.md | 47 +++ .../.claude/common/scripts/init-project.sh | 96 +++++ .../.claude/common/scripts/install.sh | 135 ++++++++ .../.claude/common/scripts/link-skills.sh | 139 ++++++++ .../.claude/common/scripts/update.sh | 36 ++ .../.claude/common/skills/README.md | 52 +++ .../skills/conventional-commit/SKILL.md | 78 +++++ .../common/skills/edm-email-html/SKILL.md | 310 +++++++++++++++++ .../edm-email-html/assets/example_asset.txt | 24 ++ .../references/api_reference.md | 34 ++ .../references/html-patterns.md | 327 ++++++++++++++++++ .../skills/edm-email-html/scripts/example.py | 19 + .../skills/vue-component-review/SKILL.md | 87 +++++ .../.claude/common/templates/CLAUDE.md.tpl | 9 + .../common/templates/project/architecture.md | 46 +++ .../common/templates/project/conventions.md | 44 +++ .../common/templates/project/overview.md | 39 +++ .../.claude/project/architecture.md | 42 +++ .../.claude/project/conventions.md | 34 ++ .../.claude/project/overview.md | 33 ++ .../.claude/skills/conventional-commit | 1 + .../.claude/skills/edm-email-html | 1 + .../.claude/skills/vue-component-review | 1 + examples/sample-nuxt-project/.gitignore | 24 ++ .../sample-nuxt-project/.gitmodules.example | 7 + examples/sample-nuxt-project/CLAUDE.md | 16 + examples/sample-nuxt-project/README.md | 107 ++++++ examples/sample-nuxt-project/app.vue | 16 + examples/sample-nuxt-project/nuxt.config.ts | 19 + examples/sample-nuxt-project/package.json | 27 ++ .../sample-nuxt-project/tailwind.config.ts | 22 ++ examples/sample-nuxt-project/tsconfig.json | 9 + scripts/install.sh | 25 ++ scripts/link-skills.sh | 139 ++++++++ skills/README.md | 52 +++ skills/conventional-commit/SKILL.md | 78 +++++ skills/vue-component-review/SKILL.md | 87 +++++ 43 files changed, 2570 insertions(+), 2 deletions(-) create mode 100644 examples/sample-nuxt-project/.claude/common/CLAUDE.md create mode 100644 examples/sample-nuxt-project/.claude/common/rules/claude-workflow.md create mode 100644 examples/sample-nuxt-project/.claude/common/rules/coding-conventions.md create mode 100644 examples/sample-nuxt-project/.claude/common/rules/commit-pr.md create mode 100644 examples/sample-nuxt-project/.claude/common/rules/framework-rules.md create mode 100755 examples/sample-nuxt-project/.claude/common/scripts/init-project.sh create mode 100755 examples/sample-nuxt-project/.claude/common/scripts/install.sh create mode 100755 examples/sample-nuxt-project/.claude/common/scripts/link-skills.sh create mode 100755 examples/sample-nuxt-project/.claude/common/scripts/update.sh create mode 100644 examples/sample-nuxt-project/.claude/common/skills/README.md create mode 100644 examples/sample-nuxt-project/.claude/common/skills/conventional-commit/SKILL.md create mode 100644 examples/sample-nuxt-project/.claude/common/skills/edm-email-html/SKILL.md create mode 100644 examples/sample-nuxt-project/.claude/common/skills/edm-email-html/assets/example_asset.txt create mode 100644 examples/sample-nuxt-project/.claude/common/skills/edm-email-html/references/api_reference.md create mode 100644 examples/sample-nuxt-project/.claude/common/skills/edm-email-html/references/html-patterns.md create mode 100755 examples/sample-nuxt-project/.claude/common/skills/edm-email-html/scripts/example.py create mode 100644 examples/sample-nuxt-project/.claude/common/skills/vue-component-review/SKILL.md create mode 100644 examples/sample-nuxt-project/.claude/common/templates/CLAUDE.md.tpl create mode 100644 examples/sample-nuxt-project/.claude/common/templates/project/architecture.md create mode 100644 examples/sample-nuxt-project/.claude/common/templates/project/conventions.md create mode 100644 examples/sample-nuxt-project/.claude/common/templates/project/overview.md create mode 100644 examples/sample-nuxt-project/.claude/project/architecture.md create mode 100644 examples/sample-nuxt-project/.claude/project/conventions.md create mode 100644 examples/sample-nuxt-project/.claude/project/overview.md create mode 120000 examples/sample-nuxt-project/.claude/skills/conventional-commit create mode 120000 examples/sample-nuxt-project/.claude/skills/edm-email-html create mode 120000 examples/sample-nuxt-project/.claude/skills/vue-component-review create mode 100644 examples/sample-nuxt-project/.gitignore create mode 100644 examples/sample-nuxt-project/.gitmodules.example create mode 100644 examples/sample-nuxt-project/CLAUDE.md create mode 100644 examples/sample-nuxt-project/README.md create mode 100644 examples/sample-nuxt-project/app.vue create mode 100644 examples/sample-nuxt-project/nuxt.config.ts create mode 100644 examples/sample-nuxt-project/package.json create mode 100644 examples/sample-nuxt-project/tailwind.config.ts create mode 100644 examples/sample-nuxt-project/tsconfig.json create mode 100755 scripts/link-skills.sh create mode 100644 skills/README.md create mode 100644 skills/conventional-commit/SKILL.md create mode 100644 skills/vue-component-review/SKILL.md diff --git a/CLAUDE.md b/CLAUDE.md index 367eab4..2299cd0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,8 +26,14 @@ 2. 이 공통 지침은 프로젝트 지침과 충돌하지 않는 범위 내에서 항상 적용됩니다. 3. 충돌이 발생하면 프로젝트 지침을 따르되, 차이를 사용자에게 알려주세요. +## 공통 Skill + +공통 저장소는 `skills/` 폴더에 팀 공용 Claude skill 들을 함께 관리합니다. +프로젝트는 `scripts/link-skills.sh` 로 `.claude/skills/` 에 심볼릭 링크하여 사용합니다. +자세한 내용은 `skills/README.md` 를 참고하세요. + ## 업데이트 - 공통 지침은 이 레파지토리(`fe-common-rules`)에서만 수정합니다. -- 각 프로젝트는 `scripts/update-common.sh`(또는 `git submodule update --remote`)로 최신 버전을 받아갑니다. +- 각 프로젝트는 `scripts/update.sh`(또는 `git submodule update --remote`)로 최신 버전을 받아갑니다. - 수정 제안은 PR로 받습니다. 자세한 내용은 루트 `README.md` 참고. diff --git a/README.md b/README.md index c15188b..a8bbb83 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,16 @@ fe-common-rules/ │ ├── overview.md │ ├── conventions.md │ └── architecture.md +├── skills/ # 팀 공용 Claude skill 모음 +│ ├── README.md +│ ├── vue-component-review/ +│ │ └── SKILL.md +│ └── conventional-commit/ +│ └── SKILL.md ├── scripts/ -│ ├── install.sh # 프로젝트에 submodule 설치 + 템플릿 복사 +│ ├── install.sh # submodule 설치 + 템플릿 복사 + skill 링크 │ ├── init-project.sh # .claude/project 양식만 다시 초기화/diff +│ ├── link-skills.sh # 공통 skill 을 .claude/skills 로 링크/해제 │ └── update.sh # 최신 공통 지침으로 업데이트 └── examples/ └── sample-nuxt-project/ # Nuxt4 + Vue3 + TS + Tailwind 샘플 @@ -138,6 +145,65 @@ bash .claude/common/scripts/init-project.sh --diff --- +## 🛠 공통 Skill 사용 + +Claude Code 는 프로젝트의 `.claude/skills//SKILL.md` 를 자동으로 탐색합니다. +공통 저장소는 `skills/` 폴더에 팀 공용 skill 들을 두고, 각 프로젝트는 **심볼릭 링크**로 +이를 `.claude/skills/` 에 연결합니다. 링크 방식이기 때문에 `git submodule update` 한 번으로 +모든 프로젝트가 최신 skill 을 자동으로 사용하게 됩니다. + +### 설치 (install.sh 사용 시 자동) + +`install.sh` 는 submodule 추가, 템플릿 복사, **공통 skill 링크** 까지 한 번에 처리합니다. +별도 조치가 필요하지 않습니다. + +### 이미 설치된 프로젝트 — link-skills.sh + +```bash +# 모든 공통 skill 을 .claude/skills/ 로 링크 (기존 링크는 건너뜀) +bash .claude/common/scripts/link-skills.sh + +# 실제 링크 없이 어떤 작업이 일어날지 미리보기 +bash .claude/common/scripts/link-skills.sh --dry-run + +# 기존 링크/폴더를 덮어쓰기 +bash .claude/common/scripts/link-skills.sh --force + +# 특정 skill 하나만 링크 +bash .claude/common/scripts/link-skills.sh vue-component-review + +# 공통 skill 링크 전체 해제 (프로젝트 고유 skill 은 건드리지 않음) +bash .claude/common/scripts/link-skills.sh --unlink +``` + +### 프로젝트 고유 skill 과의 공존 + +`.claude/skills/` 아래에는 공통 skill 링크와 **프로젝트 자체 skill 폴더**가 함께 있을 수 +있습니다. `link-skills.sh` 는 심볼릭 링크(`-L`)인 항목만 관리하므로 프로젝트 고유 skill +은 덮어쓰지 않습니다. + +``` +.claude/skills/ +├── vue-component-review → 링크: ../common/skills/vue-component-review +├── conventional-commit → 링크: ../common/skills/conventional-commit +└── my-project-only-skill/ ← 이 프로젝트만의 skill (실제 폴더) + └── SKILL.md +``` + +### 새 skill 을 공통 저장소에 추가 + +1. `skills//SKILL.md` 를 작성 (YAML frontmatter 에 `name`, `description` 필수) +2. PR 을 올리고 팀 리뷰 +3. 머지 후 각 프로젝트에서 아래 실행 + ```bash + git submodule update --remote .claude/common + bash .claude/common/scripts/link-skills.sh # 새로 추가된 skill 이 자동 링크됨 + git add .gitmodules .claude + git commit -m "chore: sync fe-common-rules" + ``` + +--- + ## ✍️ 공통 지침 수정 프로세스 1. 이 저장소를 별도로 clone 합니다. diff --git a/examples/sample-nuxt-project/.claude/common/CLAUDE.md b/examples/sample-nuxt-project/.claude/common/CLAUDE.md new file mode 100644 index 0000000..2299cd0 --- /dev/null +++ b/examples/sample-nuxt-project/.claude/common/CLAUDE.md @@ -0,0 +1,39 @@ +# 팀 공통 Claude 지침 (fe-common-rules) + +이 파일은 팀 전체에서 공통으로 사용하는 Claude 작업 지침의 **엔트리 포인트**입니다. +각 프로젝트의 `CLAUDE.md`에서 `@.claude/common/CLAUDE.md` 형태로 참조하여 사용합니다. + +## 적용 범위 + +- 팀 내 모든 프론트엔드 프로젝트 +- Claude Code / Claude 기반 자동화 작업 전반 + +## 포함된 지침 + +아래 문서들은 Claude가 이 파일을 읽을 때 자동으로 함께 로드됩니다. + +@rules/coding-conventions.md + +@rules/framework-rules.md + +@rules/commit-pr.md + +@rules/claude-workflow.md + +## 우선순위 + +1. 프로젝트 `CLAUDE.md`에 명시된 **프로젝트 지침**이 최우선입니다. +2. 이 공통 지침은 프로젝트 지침과 충돌하지 않는 범위 내에서 항상 적용됩니다. +3. 충돌이 발생하면 프로젝트 지침을 따르되, 차이를 사용자에게 알려주세요. + +## 공통 Skill + +공통 저장소는 `skills/` 폴더에 팀 공용 Claude skill 들을 함께 관리합니다. +프로젝트는 `scripts/link-skills.sh` 로 `.claude/skills/` 에 심볼릭 링크하여 사용합니다. +자세한 내용은 `skills/README.md` 를 참고하세요. + +## 업데이트 + +- 공통 지침은 이 레파지토리(`fe-common-rules`)에서만 수정합니다. +- 각 프로젝트는 `scripts/update.sh`(또는 `git submodule update --remote`)로 최신 버전을 받아갑니다. +- 수정 제안은 PR로 받습니다. 자세한 내용은 루트 `README.md` 참고. diff --git a/examples/sample-nuxt-project/.claude/common/rules/claude-workflow.md b/examples/sample-nuxt-project/.claude/common/rules/claude-workflow.md new file mode 100644 index 0000000..680a759 --- /dev/null +++ b/examples/sample-nuxt-project/.claude/common/rules/claude-workflow.md @@ -0,0 +1,62 @@ +# Claude 작업 방식 지침 + +이 문서는 Claude가 팀 프로젝트에서 작업할 때 따라야 할 일반적인 원칙을 정의합니다. + +## 기본 원칙 + +1. **기존 코드 존중**: 수정 전에 관련 파일과 주변 컨벤션을 먼저 파악합니다. +2. **최소 변경**: 요구사항을 충족하는 최소한의 변경만 수행합니다. 관련 없는 리팩토링은 별도 작업으로 분리합니다. +3. **가정 대신 질문**: 요구사항이 모호하면 추측하지 말고 사용자에게 확인합니다. +4. **근거 있는 수정**: 코드 변경의 이유를 설명할 수 있어야 합니다. + +## 작업 순서 + +1. **탐색 (Explore)** + - 관련 파일을 먼저 읽고 프로젝트 구조를 파악합니다. + - 유사한 패턴이 이미 존재하는지 확인합니다. + +2. **계획 (Plan)** + - 여러 파일을 수정하거나 복잡한 작업이면 할 일 목록을 만들어 공유합니다. + - 아키텍처에 영향을 주는 변경은 착수 전에 사용자 승인을 받습니다. + +3. **구현 (Implement)** + - 한 번에 하나의 논리적 변경에 집중합니다. + - 공통 지침과 프로젝트 지침을 모두 준수합니다. + +4. **검증 (Verify)** + - 린트 / 타입체크 / 빌드가 깨지지 않는지 확인합니다. + - 테스트가 있는 프로젝트라면 관련 테스트를 실행합니다. + - 수동 검증이 필요한 경우 확인 방법을 사용자에게 안내합니다. + +## 해서는 안 되는 것 + +- **임의 기능 추가 금지**: 사용자가 요청하지 않은 기능을 추가하지 않습니다. +- **기존 코드 대량 리팩토링 금지**: 요청 범위를 벗어나는 변경은 하지 않습니다. +- **주석 / 문서 임의 삭제 금지**: 불필요해 보여도 삭제 전 사용자에게 확인합니다. +- **비밀정보 출력 금지**: 환경변수, 키, 토큰 등은 코드에 하드코딩하지 않습니다. +- **의존성 버전 임의 변경 금지**: 요청이 없다면 `package.json`의 버전을 변경하지 않습니다. +- **강제 푸시 / 히스토리 재작성 금지**: `push --force`, `reset --hard` 등은 사용자의 명시적 요청 없이 실행하지 않습니다. + +## 커뮤니케이션 + +- 답변은 간결하게, 결론을 먼저 말합니다. +- 코드를 수정했다면 **어떤 파일을 어떻게 바꿨는지** 요약합니다. +- 불확실한 부분은 솔직하게 밝히고 대안을 제시합니다. +- 긴 설명보다 실제 결과물(코드/파일)을 우선합니다. + +## 파일 작업 원칙 + +- 새 파일 생성보다 **기존 파일 수정**을 우선합니다. +- README, 문서는 사용자가 명시적으로 요청했을 때만 생성합니다. +- 파일을 읽지 않고 수정하지 않습니다. +- 대량 변경 시에는 diff를 확인할 수 있도록 단계별로 진행합니다. + +## 질문이 필요한 상황 + +다음의 경우 반드시 사용자에게 확인을 요청합니다. + +- 요구사항의 일부가 불명확할 때 +- 여러 구현 방식이 있고 각각 장단점이 뚜렷할 때 +- 공통 지침과 프로젝트 지침이 충돌할 때 +- 파괴적 작업(파일 삭제, 데이터 마이그레이션, 스키마 변경 등)이 필요할 때 +- 외부 서비스 호출이나 결제 관련 작업일 때 diff --git a/examples/sample-nuxt-project/.claude/common/rules/coding-conventions.md b/examples/sample-nuxt-project/.claude/common/rules/coding-conventions.md new file mode 100644 index 0000000..1ecc347 --- /dev/null +++ b/examples/sample-nuxt-project/.claude/common/rules/coding-conventions.md @@ -0,0 +1,50 @@ +# 코딩 컨벤션 + +## 기본 원칙 + +- **가독성 우선**: 영리한 코드보다 읽기 쉬운 코드를 선호합니다. +- **일관성 유지**: 기존 코드의 스타일을 먼저 관찰하고 그에 맞춥니다. +- **작은 단위**: 함수와 파일은 한 가지 책임만 지도록 작게 유지합니다. + +## 포맷팅 + +- 들여쓰기: 스페이스 2칸 (탭 사용 금지) +- 문자열: 싱글 쿼터(`'`) 사용, JSX/템플릿 속성값은 더블 쿼터(`"`) +- 세미콜론: 생략하지 않고 항상 작성 +- 줄 끝 공백 제거, 파일 끝 개행 1줄 유지 +- 한 줄 최대 100자 (초과 시 줄바꿈) +- Prettier 설정 파일(`.prettierrc`)이 있는 경우 해당 설정을 우선합니다. + +## 네이밍 + +- **변수/함수**: `camelCase` (예: `userProfile`, `fetchUserData`) +- **상수**: `UPPER_SNAKE_CASE` (예: `MAX_RETRY_COUNT`) +- **컴포넌트/클래스/타입**: `PascalCase` (예: `UserCard`, `OrderStatus`) +- **파일명** + - Vue 컴포넌트: `PascalCase.vue` (예: `UserCard.vue`) + - Composable: `use` 접두사 + `camelCase` (예: `useAuth.ts`) + - 일반 TS 모듈: `kebab-case.ts` (예: `format-date.ts`) +- **이벤트 핸들러**: `handle` 또는 `on` 접두사 (예: `handleClick`, `onSubmit`) +- **불리언**: `is`, `has`, `can`, `should` 접두사 (예: `isLoading`, `hasError`) + +## 타입 + +- `any` 사용 금지. 불가피할 경우 주석으로 이유를 남기고 `unknown`을 먼저 고려합니다. +- 함수 시그니처에는 매개변수와 반환 타입을 명시합니다. +- 공개 API(타 모듈에서 import 되는 것)는 반드시 타입을 export 합니다. +- 유니온 타입은 `as const` 또는 별도 타입 alias로 관리합니다. + +## 주석 + +- "무엇을" 보다 "왜"를 설명합니다. +- TODO/FIXME 주석에는 작성자와 날짜 또는 이슈 번호를 포함합니다. +- 공개 함수/컴포넌트에는 JSDoc 한 줄 설명을 권장합니다. + +## import 순서 + +1. 외부 라이브러리 (예: `vue`, `nuxt`) +2. 내부 절대 경로 (예: `~/components/...`) +3. 상대 경로 (예: `./utils`) +4. 타입 only import는 각 그룹 내에서 별도 블록으로 분리 + +그룹 사이에는 빈 줄을 한 줄 둡니다. diff --git a/examples/sample-nuxt-project/.claude/common/rules/commit-pr.md b/examples/sample-nuxt-project/.claude/common/rules/commit-pr.md new file mode 100644 index 0000000..72a262a --- /dev/null +++ b/examples/sample-nuxt-project/.claude/common/rules/commit-pr.md @@ -0,0 +1,83 @@ +# 커밋 / PR 규칙 + +## 커밋 메시지 + +[Conventional Commits](https://www.conventionalcommits.org/)를 따릅니다. + +``` +(): + + + +