---
name: client-scaffold
description: |
  Days 프로젝트의 TCA DependencyClient 보일러플레이트를 생성한다. 사용자가 `/client-scaffold Keyword` 형태로 명령어를 입력하면 즉시 실행한다.
  Client/{Keyword}Client/ 폴더를 만들고 {Keyword}Client.swift, {Keyword}Client+Live.swift 파일을 생성한다.
  "client scaffold", "client 만들어", "Client 생성", "dependency client 스캐폴드", "클라이언트 만들어" 같은 표현에도 반응한다.
---

# Client Scaffold

Days 프로젝트의 TCA DependencyClient 모듈 구조를 빠르게 생성하는 스킬이다.

## 사용법

```
/client-scaffold Keyword
```

예시:
- `/client-scaffold Weather` → `Client/WeatherClient/WeatherClient.swift`, `Client/WeatherClient/WeatherClient+Live.swift` 생성
- `/client-scaffold Location` → `Client/LocationClient/LocationClient.swift`, `Client/LocationClient/LocationClient+Live.swift` 생성

## 실행 순서

1. **Keyword 파악**: 사용자 메시지에서 `/client-scaffold` 뒤에 오는 단어를 Keyword로 사용한다. Keyword는 PascalCase여야 한다 (예: `Weather`, `Location`, `Music`).

2. **스크립트 실행**: 프로젝트 루트를 찾은 뒤 scaffold 스크립트를 실행한다.

   프로젝트 루트는 `CLAUDE.md`가 있는 디렉토리다. Days 프로젝트 기준으로는 `/Users/journey/workspace/dev/Days`이다.

   ```bash
   python /path/to/skill/scripts/scaffold.py Keyword project_root
   ```

   스킬의 scripts/scaffold.py 경로는 이 SKILL.md 파일 기준 `scripts/scaffold.py`다.
   실제 경로는 시스템에 따라 다를 수 있으므로, 이 SKILL.md의 절대 경로를 기준으로 `scripts/scaffold.py`를 찾아 실행한다.

3. **결과 보고**: 생성된 파일 목록을 사용자에게 알려준다.

## 생성되는 파일 구조

```
Days/
└── Client/
    └── {Keyword}Client/
        ├── {Keyword}Client.swift        ← @DependencyClient 정의 + DependencyValues extension
        └── {Keyword}Client+Live.swift   ← DependencyKey liveValue 구현
```

### {Keyword}Client.swift 템플릿

```swift
//
//  {Keyword}Client.swift
//  Days
//
//  Created by Jiyeon on {오늘날짜}
//

import ComposableArchitecture

@DependencyClient
struct {Keyword}Client: Sendable {
  var fetch{Keyword}: @Sendable () async throws -> Void
  
}

extension DependencyValues {
  var {keyword}Client: {Keyword}Client {
    get { self[{Keyword}Client.self] }
    set { self[{Keyword}Client.self] = newValue }
  }
}
```

> `{keyword}` = Keyword의 camelCase 버전 (예: `Weather` → `weather`, `Location` → `location`)

### {Keyword}Client+Live.swift 템플릿

```swift
//
//  {Keyword}Client+Live.swift
//  Days
//
//  Created by Jiyeon on {오늘날짜}
//

import ComposableArchitecture

extension {Keyword}Client: DependencyKey {
  public static var liveValue: {Keyword}Client {
    return .init(
      fetch{Keyword}: { }
    )
  }
}
```

## 주의사항

- Keyword는 반드시 PascalCase로 입력받는다. 소문자로 들어오면 자동으로 변환하지 말고 사용자에게 확인을 요청한다.
- `DependencyValues` extension의 프로퍼티 이름은 자동으로 camelCase로 변환된다 (첫 글자 소문자).
- 생성 후, `{Keyword}Reducer`에서 이 Client를 사용하려면 `@Dependency(\.{keyword}Client) var {keyword}Client` 형태로 주입하면 된다.
