@choblue/claude-code-toolkit 1.2.1 → 1.2.3

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.
@@ -1 +1 @@
1
- 72f0d82c6beeee9deaddcfec2329fc707c2667ec
1
+ 3b3477495f8b6aeafca6aa34cc433d15ccdd0622
package/.claude/CLAUDE.md CHANGED
@@ -46,10 +46,12 @@ TDD/Review를 생략하고 핵심 단계만 수행한다.
46
46
  3. **Commit**: `git-manager`로 커밋/PR 생성
47
47
 
48
48
  ### L 티어 (complex)
49
- 프로세스를 따른다.
50
- 1. **Planning**: 요구사항 정리 → `explore`로 탐색 → 사용자 승인
51
- 2. **Implementation + Test**: `implementer`에 구현+테스트 동시 위임 테스트 통과 확인
52
- 3. **Review**: `code-reviewer`로 리뷰`git-manager`로 커밋/PR
49
+ 파일 기반 설계 후 구현한다.
50
+ 1. **Research**: `explore`로 탐색 → `research.md` 작성 (관련 코드 분석, 제약 조건)
51
+ 2. **Plan**: `plan.md` 작성 (접근 방식, 변경 파일, 트레이드 오프, 작업 순서)
52
+ 3. **주석 사이클**: 사용자가 plan.md에 메모 반영 → **승인 전까지 구현 금지**
53
+ 4. **Implementation + Test**: `implementer`에 plan.md 전달하여 구현+테스트 동시 위임
54
+ 5. **Review**: `code-reviewer`로 리뷰 → `git-manager`로 커밋/PR
53
55
 
54
56
  ### 풀스택 작업 (FE + BE 동시 변경)
55
57
  티어는 영향도 기준으로 판단하되, 위임 순서는 BE 선행 → FE 후행을 따른다.
@@ -13,32 +13,65 @@
13
13
  3. **설계 결정**: 새로운 아키텍처/패턴 도입이 필요한가? → Yes면 L
14
14
  4. **위 모두 No**: 파일 수와 변경 단순성으로 S/M 판단
15
15
 
16
- ## 2. 작업 분해 템플릿
16
+ ## 2. L 티어 Planning: 파일 기반 설계
17
17
 
18
- ### 요구사항 정리
19
- - [ ] 사용자가 원하는 최종 결과물은?
20
- - [ ] 변경되는 레이어는? (UI / API / Domain / DB)
21
- - [ ] 기존 코드에 영향을 주는 범위는?
18
+ L 티어는 채팅이 아닌 **파일 기반**으로 설계를 진행한다. 세션이 끝나도 기록이 남고, 사용자가 에디터에서 직접 수정할 수 있다.
22
19
 
23
- ### 작업 단위 분해
24
- 작업 단위는 **독립적으로 테스트 가능한 단위**로 나눈다:
25
- ```
26
- 1. [작업명] - [대상 파일/모듈] - [티어]
27
- 2. [작업명] - [대상 파일/모듈] - [티어]
20
+ ### Step 1: research.md 작성
21
+ 관련 코드베이스를 **깊이 분석**하여 파일로 작성한다.
22
+ ```markdown
23
+ # Research: [기능명]
24
+
25
+ ## 관련 코드 분석
26
+ - [파일경로]: [역할 및 현재 동작]
27
+
28
+ ## 기존 패턴
29
+ - [프로젝트에서 사용 중인 관련 패턴]
30
+
31
+ ## 제약 조건
32
+ - [기술적 제약, 호환성 이슈 등]
28
33
  ```
29
34
 
30
- ### 의존성 확인
31
- - [ ] 작업 간 순서 의존성이 있는가? (예: BE API 먼저 → FE 연동)
32
- - [ ] 외부 의존성이 있는가? (패키지 설치, DB 마이그레이션 등)
35
+ ### Step 2: plan.md 작성
36
+ research 기반으로 구현 계획을 작성한다.
37
+ ```markdown
38
+ # Plan: [기능명]
39
+
40
+ ## 접근 방식
41
+ - [선택한 방식과 이유]
42
+
43
+ ## 변경 파일
44
+ - `path/to/file.ts` - [변경 내용]
45
+
46
+ ## 트레이드 오프
47
+ - [장점] vs [단점]
33
48
 
34
- ## 3. 계획 출력 형식
49
+ ## 작업 순서
50
+ 1. [작업] → [담당 에이전트]
51
+ 2. [작업] → [담당 에이전트]
52
+ ```
35
53
 
36
- 사용자에게 계획을 제시할 다음 형식을 따른다:
54
+ ### Step 3: 주석 사이클
55
+ 1. 사용자가 plan.md를 에디터에서 열어 메모/수정을 남긴다
56
+ 2. Claude가 메모를 반영하여 plan.md를 업데이트한다
57
+ 3. **사용자가 승인할 때까지 구현하지 않는다**
58
+ 4. 승인 후 implementer 에이전트에 plan.md를 전달하여 구현한다
37
59
 
60
+ ## 3. M 티어 Planning: 채팅 기반
61
+
62
+ M 티어는 파일 없이 채팅에서 간단히 계획을 제시한다:
38
63
  ```
39
- **티어**: S / M / L
64
+ **티어**: M
40
65
  **변경 범위**: [레이어 목록]
41
66
  **작업 목록**:
42
67
  1. [작업] → [담당 에이전트]
43
68
  2. [작업] → [담당 에이전트]
44
- ```
69
+ ```
70
+
71
+ ## 4. 작업 분해 체크리스트
72
+
73
+ - [ ] 사용자가 원하는 최종 결과물은?
74
+ - [ ] 변경되는 레이어는? (UI / API / Domain / DB)
75
+ - [ ] 기존 코드에 영향을 주는 범위는?
76
+ - [ ] 작업 간 순서 의존성이 있는가?
77
+ - [ ] 외부 의존성이 있는가? (패키지 설치, DB 마이그레이션 등)
@@ -253,7 +253,67 @@ function UserContent({ isLoading, error, data }: UserContentProps) {
253
253
 
254
254
  ---
255
255
 
256
- ## 8. 금지 사항
256
+ ## 8. 에러 처리
257
+
258
+ ### 원칙: 에러 처리를 각 함수/컴포넌트에 흩뿌리지 않는다
259
+ - 각 함수마다 try-catch를 덕지덕지 붙이지 않는다
260
+ - `useState`로 에러 상태를 직접 관리하지 않는다 (TanStack Query가 제공)
261
+ - 에러 처리는 **경계(Boundary)**에서 한 번에 처리한다
262
+
263
+ ### API 에러: 서버 상태 라이브러리에 위임
264
+
265
+ ```typescript
266
+ // Bad - useState + useEffect로 에러 직접 관리
267
+ function UserList() {
268
+ const [error, setError] = useState<Error | null>(null);
269
+ const [data, setData] = useState(null);
270
+ const [loading, setLoading] = useState(false);
271
+
272
+ useEffect(() => {
273
+ setLoading(true);
274
+ fetchUsers()
275
+ .then(setData)
276
+ .catch(setError)
277
+ .finally(() => setLoading(false));
278
+ }, []);
279
+ }
280
+
281
+ // Good - 서버 상태 라이브러리가 에러를 관리
282
+ function UserList() {
283
+ const { data: users, isLoading, error } = useUserList();
284
+ if (error) return <ErrorDisplay error={error} />;
285
+ }
286
+ ```
287
+
288
+ ### 렌더링 에러: Error Boundary
289
+
290
+ ```typescript
291
+ <ErrorBoundary fallback={<ErrorFallback />}>
292
+ <UserContent />
293
+ </ErrorBoundary>
294
+ ```
295
+
296
+ ### 전역 API 에러: interceptor 또는 라이브러리 설정에서 일괄 처리
297
+ - axios interceptor, QueryClient defaultOptions 등 프로젝트 설정에 따른다
298
+ - 개별 컴포넌트가 아닌 앱 수준에서 에러 알림(toast 등)을 처리한다
299
+
300
+ ### 에러 UI 분기: early return 패턴
301
+
302
+ ```typescript
303
+ function UserPage({ userId }: UserPageProps) {
304
+ const { data: user, isLoading, error } = useUser(userId);
305
+
306
+ if (isLoading) return <Skeleton />;
307
+ if (error) return <ErrorDisplay error={error} />;
308
+ if (!user) return <EmptyState />;
309
+
310
+ return <UserContent user={user} />;
311
+ }
312
+ ```
313
+
314
+ ---
315
+
316
+ ## 9. 금지 사항
257
317
 
258
318
  - `any` 타입 사용 금지
259
319
  - 인라인 스타일(`style={{}}`) 사용 금지 - 프로젝트 스타일링 방식을 따른다
@@ -263,4 +323,6 @@ function UserContent({ isLoading, error, data }: UserContentProps) {
263
323
  - `React.FC` 사용 금지
264
324
  - 배열 인덱스를 `key`로 사용 금지 (정적 리스트 제외)
265
325
  - `useEffect` 내에서 상태 동기화 로직 작성 금지 (파생값으로 처리)
266
- - Props drilling이 3단계 이상일 때 Context 또는 상태 관리 라이브러리 미사용 금지
326
+ - Props drilling이 3단계 이상일 때 Context 또는 상태 관리 라이브러리 미사용 금지
327
+ - 서버 상태(API 데이터)를 `useState` + `useEffect`로 관리 금지 (서버 상태 라이브러리 사용)
328
+ - 각 함수/컴포넌트마다 try-catch 남발 금지 (에러 경계에서 일괄 처리)
@@ -237,7 +237,56 @@ const queryClient = new QueryClient({
237
237
 
238
238
  ---
239
239
 
240
- ## 9. 금지 사항
240
+ ## 9. 캐시 전략 가이드
241
+
242
+ 데이터 특성에 따라 `staleTime`을 다르게 설정한다.
243
+
244
+ | 데이터 유형 | staleTime | 예시 |
245
+ |------------|-----------|------|
246
+ | 거의 안 바뀜 | `Infinity` | 코드 테이블, 카테고리 목록, 약관 |
247
+ | 가끔 바뀜 | `10~30분` | 사용자 프로필, 설정 |
248
+ | 자주 바뀜 | `1~5분` | 게시글 목록, 댓글 |
249
+ | 실시간 필요 | `0` | 채팅, 알림, 재고 수량 |
250
+
251
+ ### 도메인별 staleTime 설정
252
+
253
+ ```typescript
254
+ // queryKey 팩토리에서 기본 옵션을 함께 관리
255
+ export const categoryKeys = {
256
+ all: ['categories'] as const,
257
+ list: () => [...categoryKeys.all, 'list'] as const,
258
+ };
259
+
260
+ // 거의 안 바뀌는 데이터
261
+ useQuery({
262
+ queryKey: categoryKeys.list(),
263
+ queryFn: fetchCategories,
264
+ staleTime: Infinity,
265
+ });
266
+
267
+ // 자주 바뀌는 데이터
268
+ useQuery({
269
+ queryKey: postKeys.list(filters),
270
+ queryFn: () => fetchPosts(filters),
271
+ staleTime: 1000 * 60, // 1분
272
+ });
273
+ ```
274
+
275
+ ### 실시간 데이터: refetchInterval 사용
276
+
277
+ ```typescript
278
+ // 폴링 방식 (WebSocket이 없을 때)
279
+ useQuery({
280
+ queryKey: ['notifications'],
281
+ queryFn: fetchNotifications,
282
+ staleTime: 0,
283
+ refetchInterval: 1000 * 30, // 30초마다 재요청
284
+ });
285
+ ```
286
+
287
+ ---
288
+
289
+ ## 10. 금지 사항
241
290
 
242
291
  - `useEffect`로 데이터 페칭 금지 - TanStack Query를 사용한다
243
292
  - queryKey 하드코딩 금지 - queryKey 팩토리 패턴을 사용한다
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@choblue/claude-code-toolkit",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "Claude Code 서브에이전트 위임 툴킷 - npx로 바로 설치",
5
5
  "bin": {
6
6
  "claude-code-toolkit": "bin/cli.js"