Skip to content
Back to skills

Setup

ASecurity

profile.json을 읽어 CLAUDE.md를 자동 생성한다. 프로젝트 스택에 맞는 모듈을 조합하여 Claude Code 환경을 세팅한다. 세션 시작 시 "code-forge updated" 또는 "version mismatch" 메시지가 보이면 사용자에게 재실행 여부를 물어본 후 이 스킬을 실행한다.

  • 13 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 28, 2026
developmenttypescriptpythongobashreactvueangularnextjsnodeexpress

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned May 28, 2026

npx -y skills add ggombee/code-forge --skill setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Setup
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ggombee-setup/badge)](https://www.skillsdirectory.com/skills/ggombee-setup)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: setup
description: profile.json을 읽어 CLAUDE.md를 자동 생성한다. 프로젝트 스택에 맞는 모듈을 조합하여 Claude Code 환경을 세팅한다. 세션 시작 시 "code-forge updated" 또는 "version mismatch" 메시지가 보이면 사용자에게 재실행 여부를 물어본 후 이 스킬을 실행한다.
category: setup
---

# /setup 스킬

프로젝트의 `.claude/profile.json`을 읽어 스택에 맞는 CLAUDE.md를 자동 생성한다.

---

## 동작 흐름

```
profile.json 존재 → Step 2로 바로 진행 (기존 파싱)
profile.json 없음 → Step 1 대화형 온보딩
```

---

## ARGUMENT 처리

```
$ARGUMENTS 없음     → .claude/profile.json 자동 탐색
$ARGUMENTS 있음     → 파일 경로로 인식 (예: /setup .claude/profile.json)
$ARGUMENTS --profile → 코딩 프로필 생성만 실행 (아래 "코딩 프로필" 섹션 참조)
```

---

## 코딩 프로필 (`/setup --profile`)

`/setup --profile` 또는 "코딩 스타일 분석해줘" 요청 시 실행. `/setup` 기본 흐름에서는 묻지 않는다.

**흐름:**
1. Step 1에서 감지한 스택 정보(또는 package.json 분석)를 기반으로 **분석 카테고리를 동적 선택**
2. 프로젝트 코드를 실제로 읽고 (주요 디렉토리에서 2-3개 파일 샘플링) 패턴 분석
3. 결과를 `.claude/coding-profile.md`에 저장
4. 사용자에게 결과 보여주고 수정 여부 확인

**스택별 분석 카테고리 (동적 선택):**

| 카테고리 | 적용 스택 | 분석 내용 |
|---------|----------|----------|
| **추상화 습관** | 모든 스택 | 중복 코드 추출 기준, 함수/모듈 분리 기준 |
| **모듈/컴포넌트 설계** | React/Vue → 컴포넌트, Python/Go → 모듈/클래스 | 분리 기준, 계층 구조 |
| **상태/데이터 관리** | React → hooks/Query, 백엔드 → ORM/캐시 | 데이터 흐름 |
| **타입/스키마** | TS → interface/type, Python → type hints, Go → struct | 엄격도 |
| **에러 처리** | 모든 스택 | try-catch 전략, 에러 계층 |
| **네이밍/스타일** | 모든 스택 | 네이밍, early return, 비동기 |
| **폴더 구조** | 모든 스택 | 기능별/레이어별 |
| **커밋 스타일** | 모든 스택 | git log 분석 |
| **테스트 전략** | 모든 스택 | 단위/통합/E2E 비율 |
| **프레임워크 특화** | 감지된 것만 | Next.js→SSR, Django→view, Go→interface 등 |

**감지 못한 스택이면:** 범용 카테고리(추상화, 에러, 네이밍, 폴더, 커밋)만 분석 + Claude가 코드를 읽고 해당 언어에 맞는 질문 동적 생성

**참조 템플릿:** `${CLAUDE_PLUGIN_ROOT}/.candidate/code-analysis-prompt.md` (React/TS 예시)

**생성 경로:** `.claude/coding-profile.md` (local) 또는 `~/.claude/coding-profile.md` (global)

---

## 선택 UI 규칙

**모든 선택은 `AskUserQuestion` 도구를 사용하여 인터랙티브 선택 UI로 제시한다.** 텍스트로 `>` 커서를 출력하거나 숫자/Y/n 입력을 받지 않는다.

### 구현 방식

1. **`AskUserQuestion` 도구를 호출**하여 클릭 가능한 선택지를 보여준다
2. 감지된 항목이 있으면 해당 옵션의 label에 `(Recommended)` 를 붙여 첫 번째에 배치한다
3. `options`에 없는 선택은 사용자가 "Other"를 통해 자유 입력할 수 있다 (자동 제공됨)
4. 한 번에 최대 4개 질문까지 묶을 수 있지만, 의존 관계가 있으면 순차적으로 묻는다

### 예시

```
AskUserQuestion({
  questions: [{
    question: "이 설정을 어디에 적용할까요?",
    header: "설치 위치",
    options: [
      { label: "이 프로젝트에만 (.claude/)", description: "현재 프로젝트에만 적용" },
      { label: "전역 설정 (~/.claude/)", description: "모든 프로젝트에 적용" }
    ],
    multiSelect: false
  }]
})
```

**핵심: 한 번에 하나만 묻고, 응답을 받은 후 다음으로 넘어간다. 반드시 AskUserQuestion 도구를 사용한다.**

---

## Step 1: 대화형 온보딩 (profile.json 없을 때)

`.claude/profile.json`이 없으면 아래 서브스텝을 순차 진행한다.
**한 번에 하나씩 질문하고, 사용자 응답을 받은 후 다음으로 넘어간다.**

> **참고:** 아래의 `> 옵션` 형식 예시들은 AskUserQuestion 도구에 전달할 옵션 내용의 참고 자료이다. 실제 구현 시 반드시 AskUserQuestion 도구를 호출하여 인터랙티브 선택 UI로 표시한다. 텍스트로 `>` 커서를 출력하지 않는다.

### 1-0. 설치 위치 선택

```
code-forge 설정을 시작합니다.

이 설정을 어디에 적용할까요?

> 이 프로젝트에만 (.claude/)
  전역 설정 (~/.claude/)
```

| 선택 | installTarget | profile.json 경로 | CLAUDE.md 경로 |
|------|--------------|-------------------|---------------|
| 이 프로젝트에만 | `local` | `.claude/profile.json` | `./CLAUDE.md` |
| 전역 설정 | `global` | `~/.claude/profile.json` | `~/.claude/CLAUDE.md` |

### 1-1. package.json 자동 감지 + 프로젝트 유형 판별

`package.json`이 존재하면 dependencies를 분석하여 스택을 자동 추론한다.

**프로젝트 유형 판별:**

먼저 프로젝트가 프론트엔드 서비스인지 판별한다.

| 조건 | 유형 | 스택 설정 |
|------|------|----------|
| `react`, `next`, `vue`, `angular` 등 UI 프레임워크 존재 | **서비스** | 스택 설정 진행 |
| `bin` 필드 존재 + UI 프레임워크 없음 | **CLI/도구** | 스택 설정 건너뛰기 |
| `main`/`exports` 필드 + UI 프레임워크 없음 | **라이브러리** | 스택 설정 건너뛰기 |
| `package.json` 없음 | **기타** | 스택 설정 건너뛰기 |
| UI 프레임워크 없지만 판단 불확실 | **확인 필요** | 사용자에게 질문 |

**서비스가 아닌 경우:**

```
이 프로젝트는 프론트엔드 서비스가 아닌 것 같습니다.
(감지: CLI 도구 / 라이브러리 / 스택 미감지)

스택 모듈 설정이 필요한가요?

> 건너뛰기 (명령어 + 기능 설정만)
  아니요, 스택 설정도 할게요
```

→ "건너뛰기" 선택 시: 1-2, 1-3을 건너뛰고 1-4(프로젝트 정보)로 직행
→ "스택 설정도 할게요" 선택 시: 정상 진행

**감지 규칙 (서비스인 경우):**

| dependency / 파일 | 추론 모듈 |
|-----------|----------|
| `next` | framework: `react-nextjs-pages` 또는 `react-nextjs-app` |
| `react` (next 없음) | framework: `react-spa` |
| `jotai` + `@tanstack/react-query` | state: `jotai-tanstack` |
| `zustand` + `@tanstack/react-query` | state: `zustand-tanstack` |
| `@reduxjs/toolkit` | state: `redux-rtk` |
| `@emotion/styled` 또는 `@emotion/react` | styling: `emotion` |
| `tailwindcss` | styling: `tailwind` |
| `styled-components` | styling: `styled-components` |
| `@mui/material` | design-system: `mui` |
| `antd` | design-system: `ant-design` |
| `jest` | testing: `jest` |
| `vitest` | testing: `vitest` |
| `fastapi` in requirements.txt/pyproject.toml | framework: `python-fastapi` |
| `django` in requirements.txt/pyproject.toml | framework: `python-django` |
| `express` in package.json | framework: `node-express` |
| `go.mod` 존재 | framework: `go-standard` |

**추가 감지:**

| 조건 | 추론 |
|------|------|
| `app/layout.tsx` 존재 | App Router |
| `pages/_app.tsx` 존재 | Pages Router |
| `tailwind.config.*` 존재 | styling: `tailwind` |
| `jest.config.*` 존재 | testing: `jest` |
| `vitest.config.*` 존재 | testing: `vitest` |

**미매칭 라이브러리 감지:**

감지 규칙에 매칭되지 않는 관련 라이브러리가 있으면 해당 카테고리의 "기타" 옵션으로 자동 추가한다.

예시:
- `recoil` 감지 → State 카테고리에 `recoil (감지됨)` 옵션 동적 추가
- `sass` 감지 → Styling 카테고리에 `sass (감지됨)` 옵션 동적 추가
- `@testing-library/react` 있지만 jest/vitest 없음 → Testing에 해당 정보 표시

**카테고리별 감지 확장 규칙:**

| 카테고리 | 추가 감지 대상 |
|---------|--------------|
| Framework | `vue`, `angular`, `svelte`, `solid-js`, `remix`, `gatsby` |
| State | `recoil`, `mobx`, `valtio`, `xstate`, `swr` (TanStack Query 대체) |
| Styling | `sass`/`scss`, `less`, `vanilla-extract`, `panda-css`, `linaria` |
| Design System | `chakra-ui`, `radix-ui`, `shadcn`, `mantine` |
| Testing | `playwright`, `cypress`, `storybook` |

감지되면 해당 카테고리 옵션 목록에 `{라이브러리명} (감지됨)` 형태로 자동 삽입한다.

**프로젝트 정보 자동 추출:**

`package.json`의 `scripts`에서 `dev`, `build`, `lint`, `test` 명령어를 추출한다.
패키지 매니저는 lock 파일로 판단: `yarn.lock` → yarn, `pnpm-lock.yaml` → pnpm, 그 외 → npm.

```
package.json을 분석합니다...

감지된 스택:
  Framework:     next (14.2.x) → react-nextjs-app
  State:         jotai (2.x) + @tanstack/react-query (5.x) → jotai-tanstack
  Styling:       @emotion/styled (11.x) → emotion
  Testing:       vitest (1.x) → vitest
  Design System: 감지 안 됨

감지된 명령어:
  dev:   yarn dev
  build: yarn build
  lint:  yarn lint
  test:  yarn test
```

package.json이 없으면 이 단계를 건너뛰고 1-3으로 직행한다.

### 1-2. 프리셋 매칭 및 제안

감지 결과를 기존 프리셋과 비교한다.

**매칭 알고리즘:**
- 감지된 modules와 preset.json의 modules를 비교
- 모든 필드 일치 → "일치합니다"
- 80%+ 일치 → "유사합니다 (차이: X)"
- 그 외 → "매칭 없음"

**프리셋 매칭 시:**

```
감지 결과가 "standard" 프리셋과 일치합니다.

  standard: Pages Router + Jotai + Emotion + Jest

> standard 프리셋으로 진행
  직접 선택할게요
```

→ "standard 프리셋으로 진행" 선택 시: 1-4로 건너뜀 (프로젝트 정보 확인)
→ "직접 선택할게요" 선택 시: 1-3으로 진행

**프리셋 매칭 안 될 때:**

```
사용 가능한 프리셋:

> standard — Pages Router + Jotai + Emotion + Jest
  modern-stack — MUI + App Router + Zustand + Tailwind + Vitest
  backend-api — Node.js Express + TypeScript + Jest
  직접 선택 (감지 결과 기반)
```

### 1-3. 카테고리별 순차 질문

직접 선택 시 한 번에 한 카테고리씩 질문한다.
자동 감지 결과가 있으면 해당 항목에 `>` 커서를 놓는다 (기본 선택).

**각 카테고리마다 "기타" 옵션이 있다.** 감지되었지만 옵션에 없는 라이브러리는 자동으로 옵션에 추가된다.

```
[1/5] Framework

> react-nextjs-app — Next.js App Router     ← 감지됨
  react-nextjs-pages — Next.js Pages Router
  react-spa — React SPA (Vite/CRA)
  기타 (직접 입력)
```

```
[2/5] Design System

> 없음
  mui — Material UI
  ant-design — Ant Design
  기타 (직접 입력)
```

```
[3/5] State Management

> jotai-tanstack — Jotai + TanStack Query   ← 감지됨
  zustand-tanstack — Zustand + TanStack Query
  redux-rtk — Redux Toolkit + RTK Query
  기타 (직접 입력)
```

감지되었지만 옵션에 없는 경우 (예: recoil 감지):

```
[3/5] State Management

> recoil — Recoil                            ← 감지됨
  jotai-tanstack — Jotai + TanStack Query
  zustand-tanstack — Zustand + TanStack Query
  redux-rtk — Redux Toolkit + RTK Query
  기타 (직접 입력)
```

```
[4/5] Styling

> emotion — Emotion (@emotion/styled)       ← 감지됨
  tailwind — Tailwind CSS
  styled-components — Styled Components
  기타 (직접 입력)
```

```
[5/5] Testing

> vitest — Vitest                            ← 감지됨
  jest — Jest
  기타 (직접 입력)
```

**"기타" 선택 시 동작:**

```
[3/5] State Management

사용 중인 상태 관리 라이브러리를 입력해 주세요:
> recoil
```

입력값은 `modules.state`에 문자열로 저장된다. 대응하는 모듈 SKILL.md가 없으면 규칙 참조에서 제외되지만, profile.json에는 기록되어 CLAUDE.md 스택 섹션에 표시된다.

### 1-4. 프로젝트 정보 확인

자동 감지된 명령어를 보여주고 확인받는다.

```
[프로젝트 정보]

  프로젝트명: my-app (package.json name)
  dev:   yarn dev
  build: yarn build
  lint:  yarn lint
  test:  yarn test

> 이대로 진행
  수정할게요
```

→ "수정할게요" 선택 시: 각 항목을 하나씩 다시 질문

package.json이 없었으면 각 항목을 직접 물어본다:

```
[프로젝트 정보]

프로젝트 이름을 입력해 주세요:
>

개발 서버 명령어 (예: yarn dev):
>

빌드 명령어 (예: yarn build):
>

린트 명령어 (예: yarn lint):
>

테스트 명령어 (예: yarn test):
>
```

### 1-5. 최종 확인

```
설정 요약

  설치 위치:     이 프로젝트 (.claude/)
  프리셋:        없음 (커스텀)

  Framework:     react-nextjs-app     → Next.js App Router
  Design System: 없음
  State:         jotai-tanstack       → Jotai + TanStack Query v5
  Styling:       emotion              → Emotion (@emotion/styled)
  Testing:       vitest               → Vitest

  프로젝트명: my-app
  dev:   yarn dev
  build: yarn build
  lint:  yarn lint
  test:  yarn test

> 생성
  처음부터 다시
```

→ "생성": profile.json 생성 후 Step 2로 진행
→ "처음부터 다시": 1-0부터 재시작

### 파일이 있는 경우 — 파싱

```jsonc
// .claude/profile.json 예시
{
  "installTarget": "local",          // "local" | "global" (기본: "local")
  "projectType": "service",          // "service" | "library" | "cli" | "other"
  "preset": "standard",              // 프리셋 사용 (선택)
  "modules": {                       // 개별 모듈 직접 선택 (선택)
    "framework": "react-nextjs-pages",
    "state": "jotai-tanstack",
    "styling": "emotion",
    "testing": "jest"
  },
  "project": {                       // 프로젝트 기본 정보 (선택)
    "name": "my-project",
    "dev": "yarn dev",
    "build": "yarn build",
    "lint": "yarn lint",
    "test": "yarn test"
  },
  "overrides": {}                    // 앱별 오버라이드 (선택)
}
```

---

## Step 2: 모듈 해석

### 프리셋 우선순위 규칙

1. `preset` 필드가 있으면 `${CLAUDE_PLUGIN_ROOT}/presets/{preset}.json` 로드
2. preset의 `modules`를 기본값으로 설정
3. profile.json의 `modules` 명시값으로 덮어씀
4. `overrides` 병합

### 커스텀 모듈 처리

`modules`의 값이 알려진 모듈 목록에 없으면 (예: `"state": "recoil"`):
- 대응하는 SKILL.md가 없으므로 규칙 참조에서 제외
- CLAUDE.md 스택 섹션에는 입력값 그대로 표시 (예: `State: recoil`)
- 에러 없이 정상 진행

### 모듈 → SKILL.md 경로 매핑

| 모듈 키          | 값                  | SKILL.md 경로                                          |
| ---------------- | ------------------- | ------------------------------------------------------ |
| `framework`      | react-nextjs-pages  | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/react-nextjs-pages/SKILL.md` |
| `framework`      | react-nextjs-app    | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/react-nextjs-app/SKILL.md` |
| `framework`      | react-spa           | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/react-spa/SKILL.md` |
| `framework`      | python-fastapi      | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/python-fastapi/SKILL.md` |
| `framework`      | python-django       | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/python-django/SKILL.md` |
| `framework`      | node-express        | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/node-express/SKILL.md` |
| `framework`      | go-standard         | `${CLAUDE_PLUGIN_ROOT}/modules/frameworks/go-standard/SKILL.md` |
| `design-system`  | mui                 | `${CLAUDE_PLUGIN_ROOT}/modules/design-systems/mui/SKILL.md` |
| `design-system`  | ant-design          | `${CLAUDE_PLUGIN_ROOT}/modules/design-systems/ant-design/SKILL.md` |
| `state`          | jotai-tanstack      | `${CLAUDE_PLUGIN_ROOT}/modules/state/jotai-tanstack/SKILL.md` |
| `state`          | zustand-tanstack    | `${CLAUDE_PLUGIN_ROOT}/modules/state/zustand-tanstack/SKILL.md` |
| `state`          | redux-rtk           | `${CLAUDE_PLUGIN_ROOT}/modules/state/redux-rtk/SKILL.md` |
| `styling`        | emotion             | `${CLAUDE_PLUGIN_ROOT}/modules/styling/emotion/SKILL.md` |
| `styling`        | tailwind            | `${CLAUDE_PLUGIN_ROOT}/modules/styling/tailwind/SKILL.md` |
| `styling`        | styled-components   | `${CLAUDE_PLUGIN_ROOT}/modules/styling/styled-components/SKILL.md` |
| `testing`        | jest                | `${CLAUDE_PLUGIN_ROOT}/modules/testing/jest/SKILL.md` |
| `testing`        | vitest              | `${CLAUDE_PLUGIN_ROOT}/modules/testing/vitest/SKILL.md` |

---

## Step 3: CLAUDE.md 생성

아래 템플릿으로 50줄 이내의 CLAUDE.md를 생성한다.
`installTarget`에 따라 생성 경로가 달라진다.

모듈 컨벤션 상세는 CLAUDE.md에 포함하지 않는다.
에이전트는 `@${CLAUDE_PLUGIN_ROOT}/modules/...` 참조로 직접 읽는다.

| installTarget | CLAUDE.md 경로 |
|--------------|---------------|
| `local` | `./CLAUDE.md` |
| `global` | `~/.claude/CLAUDE.md` |

### CLAUDE.md 템플릿

```markdown
# {project.name} CLAUDE.md

> 자동 생성: /setup 스킬 | 수정 시 profile.json을 변경 후 /setup 재실행

## 스택

- Framework: {framework 설명}
- Design System: {design-system 설명}
- State: {state 설명}
- Styling: {styling 설명}
- Testing: {testing 설명}

## 명령어

```bash
# 개발
{project.dev}

# 빌드
{project.build}

# 린트
{project.lint}

# 테스트
{project.test}
```

## 규칙 참조

@{CLAUDE_PLUGIN_ROOT}/modules/frameworks/{framework}/SKILL.md
@{CLAUDE_PLUGIN_ROOT}/modules/design-systems/{design-system}/SKILL.md
@{CLAUDE_PLUGIN_ROOT}/modules/state/{state}/SKILL.md
@{CLAUDE_PLUGIN_ROOT}/modules/styling/{styling}/SKILL.md
@{CLAUDE_PLUGIN_ROOT}/modules/testing/{testing}/SKILL.md
```

**projectType이 "service"가 아닌 경우:**
- 스택 섹션과 규칙 참조 섹션을 생략
- 명령어 섹션만 포함

### 스택 설명 매핑

| 모듈값              | 설명                          |
| ------------------- | ----------------------------- |
| react-nextjs-pages  | Next.js 14 Pages Router       |
| react-nextjs-app    | Next.js App Router            |
| react-spa           | React SPA (Vite/CRA)          |
| mui                 | Material UI                   |
| ant-design          | Ant Design                    |
| jotai-tanstack      | Jotai + TanStack Query v5     |
| zustand-tanstack    | Zustand + TanStack Query v5   |
| redux-rtk           | Redux Toolkit + RTK Query     |
| emotion             | Emotion (@emotion/styled)     |
| tailwind            | Tailwind CSS                  |
| styled-components   | Styled Components             |
| jest                | Jest                          |
| vitest              | Vitest                        |

매핑에 없는 값 (커스텀 입력)은 입력값 그대로 표시한다.

---

## Step 3-2: AGENTS.md 생성 (Codex/멀티툴 호환)

CLAUDE.md와 동일한 경로에 `AGENTS.md`를 생성한다.
Codex CLI, GitHub Copilot 등 AGENTS.md를 읽는 도구에 사고모델 핵심을 전파한다.

| installTarget | 경로 |
|--------------|------|
| `local` | `./AGENTS.md` |
| `global` | `~/.claude/AGENTS.md` |

기존 AGENTS.md가 있으면 **건드리지 않는다** (사용자 커스텀 존중).

### AGENTS.md 템플릿

```markdown
# {project.name} AGENTS.md

> 자동 생성: code-forge /setup | CLAUDE.md와 함께 사용

## Working Protocol

모든 코드 작업에 아래 규칙을 따른다:

1. **읽기 우선** — 수정 전 반드시 파일을 읽는다. 기억에서 추론하지 않는다
2. **패턴 준수** — 기존 코드의 구조, 네이밍, 스타일을 따른다
3. **정책 보존** — 비즈니스 로직을 임의 변경하지 않는다
4. **최소 변경** — 요청받은 것만 수정한다
5. **스코프 준수** — 대상 외 파일은 명시 요청 없이 수정하지 않는다

작업 루프: GROUND(맥락 파악) → APPLY(구현) → VERIFY(검증) → ADAPT(실패 시 조정)

## Project Conventions

Read CLAUDE.md for stack-specific rules, commands, and module references.
```

**projectType이 "service"가 아닌 경우에도 동일하게 생성한다** (사고모델은 스택 무관).

---

## Step 4: 결과 요약 출력

```
/setup 완료

프로젝트: {project.name}
설치 위치: {installTarget}
스택:
  Framework:     react-nextjs-app   → Next.js App Router
  State:         jotai-tanstack     → Jotai + TanStack Query v5
  Styling:       emotion            → Emotion (@emotion/styled)
  Testing:       vitest             → Vitest

생성된 파일:
  CLAUDE.md (47줄)
  AGENTS.md (사고모델 핵심 — Codex/멀티툴 호환)
  .claude/profile.json

참조 모듈 (4개):
  @{CLAUDE_PLUGIN_ROOT}/modules/frameworks/react-nextjs-app/SKILL.md
  @{CLAUDE_PLUGIN_ROOT}/modules/state/jotai-tanstack/SKILL.md
  @{CLAUDE_PLUGIN_ROOT}/modules/styling/emotion/SKILL.md
  @{CLAUDE_PLUGIN_ROOT}/modules/testing/vitest/SKILL.md

다음 단계:
  - CLAUDE.md 내용을 확인하세요
  - 빌드/린트 명령어가 올바른지 확인하세요
  - profile.json의 overrides로 앱별 설정을 추가할 수 있습니다
```

## Step 5: code-forge.local.md 생성

CLAUDE.md 생성 완료 후, 프로젝트 로컬 설정 파일을 생성한다.
이미 존재하면 `version` 필드만 업데이트한다.

`plugin.json`에서 현재 버전을 읽어온다: `${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json` → `version` 필드.

| installTarget | 경로 |
|--------------|------|
| `local` | `.claude/code-forge.local.md` |
| `global` | `~/.claude/code-forge.local.md` |

```markdown
---
version: {plugin.json의 version}
plugins:
  smith:
    enabled: false
---
```

- `version`: 이 프로젝트에 적용된 code-forge 버전. 플러그인 업데이트 후 `/setup` 재실행 시 버전 차이를 감지하여 CLAUDE.md를 재생성한다.
- `plugins.smith`: `/code-forge:smith-setup`에서 확장한다. 초기값은 `enabled: false`.

## Step 6: Smith 활성화 여부

스택 설정 완료 후, 프로젝트 전용 에이전트 생성 여부만 묻는다.
**Whetstone/Bellows는 묻지 않고 기본값으로 세팅** — 나중에 `code-forge.local.md`에서 직접 편집 가능.

```
Smith (프로젝트 전용 에이전트)
프로젝트를 분석하여 레포 맞춤 에이전트를 자동 생성합니다.

> 사용 (권장)
  사용 안 함
```

### 설정 결과 저장

응답에 따라 `code-forge.local.md`에 저장:

```yaml
plugins:
  smith:
    enabled: true     # 사용자 선택 반영
  whetstone:
    enabled: false    # 기본 off (별도 레포, 원하면 직접 true로)
  bellows:
    enabled: true     # 기본 on (로컬 사용량 로깅, $HOME/.code-forge/usage.jsonl)
```

## Step 7: Smith 자동 호출 (orchestrator)

Smith가 활성화된 경우 **setup 스킬 내부에서 즉시 다음 서브 스킬을 실행**한다.
사용자에게 추가 질문하지 않는다. 사용자가 Step 6에서 "사용"을 선택한 것이 곧 실행 동의다.

### Smith enabled = true인 경우

**[즉시 실행] Skill 도구로 `code-forge:smith-create-agent`를 호출한다.**

- 호출 전 안내 1줄: `Smith 에이전트를 생성합니다...`
- smith-create-agent는 이미 생성된 `profile.json`을 재사용 (Step 5 결과물)
- 생성 완료 후 setup으로 복귀해 Step 8 요약 출력
- 호출이 실패하면 안내 1줄만 출력하고 setup 전체는 성공 처리:
  ```
  Smith 에이전트 생성 중 오류. 수동으로 /code-forge:smith-create-agent 재시도하세요.
  ```

### Smith enabled = false인 경우

다음 안내만 출력하고 Step 8로 진행:

```
(나중에 Smith를 쓰려면 /code-forge:smith-create-agent 실행)
```

## Step 8: 설정 완료 안내

```
설정이 완료되었습니다.

이 설정은 code-forge.local.md에 저장됩니다.
나중에 변경하려면:
  /code-forge:smith-setup    → Smith on/off
  code-forge.local.md        → 직접 편집 (whetstone/bellows 토글)
```

---

## CLAUDE.md 백업 안내

기존 CLAUDE.md가 있는 경우:

```
기존 CLAUDE.md가 발견되었습니다.

> 백업 후 새로 생성 (기존 → .claude/CLAUDE.md.bak)
  기존 내용과 합치기 (하단에 code-forge 설정 추가)
  취소
```

| 선택 | 동작 |
|------|------|
| 백업 후 새로 생성 | 기존 파일을 `.claude/CLAUDE.md.bak`으로 이동 후 새로 생성 |
| 기존 내용과 합치기 | 기존 CLAUDE.md 하단에 `---` 구분선 + code-forge 설정 추가 |
| 취소 | 아무것도 하지 않고 종료 |

"기존 내용과 합치기" 선택 시 기존 내용을 보존하면서 스택/명령어/모듈 참조만 추가한다.

---

## 에러 처리

| 상황                          | 대응                                             |
| ----------------------------- | ------------------------------------------------ |
| package.json 없음             | 프로젝트 유형을 "기타"로 판별, 스택 설정 건너뛰기 제안 |
| package.json에서 스택 감지 불가 | "감지된 스택이 없습니다" 출력 후 수동 선택       |
| preset 파일 없음              | 오류 출력 후 알려진 프리셋 목록 안내             |
| 모듈 SKILL.md 없음            | 경고 출력 후 해당 모듈 참조 제외하고 계속 진행   |
| profile.json JSON 파싱 실패   | 오류 내용 출력 후 수정 요청                      |
| CLAUDE.md 이미 존재           | CLAUDE.md 백업 안내 참조 |
| 전역 profile.json 이미 존재   | 기존 설정 보여주고 덮어쓰기 확인                 |
| 로컬 + 전역 모두 존재         | 로컬 우선 적용, 전역은 fallback임을 안내         |
| 커스텀 모듈값 (옵션에 없는 값) | 정상 처리, SKILL.md 참조만 제외                  |

---

## 알려진 프리셋

| 프리셋명           | 스택                                          |
| ------------------ | --------------------------------------------- |
| standard           | Pages Router + Jotai + Emotion + Jest         |
| modern-stack       | MUI + App Router + Zustand + Tailwind + Vitest |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.