@kood/claude-code 0.2.5 → 0.3.1

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.
Files changed (130) hide show
  1. package/dist/index.js +13 -8
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/code-reviewer.md +371 -19
  4. package/templates/.claude/agents/dependency-manager.md +197 -0
  5. package/templates/.claude/agents/deployment-validator.md +136 -0
  6. package/templates/.claude/agents/git-operator.md +147 -0
  7. package/templates/.claude/agents/implementation-executor.md +202 -0
  8. package/templates/.claude/agents/lint-fixer.md +155 -0
  9. package/templates/.claude/agents/refactor-advisor.md +339 -29
  10. package/templates/.claude/commands/agent-creator.md +355 -0
  11. package/templates/.claude/commands/docs-creator.md +404 -163
  12. package/templates/.claude/commands/docs-refactor.md +400 -113
  13. package/templates/.claude/commands/execute.md +357 -185
  14. package/templates/.claude/commands/git-all.md +65 -71
  15. package/templates/.claude/commands/git-session.md +80 -64
  16. package/templates/.claude/commands/git.md +68 -72
  17. package/templates/.claude/commands/lint-fix.md +224 -109
  18. package/templates/.claude/commands/lint-init.md +142 -168
  19. package/templates/.claude/commands/plan.md +300 -84
  20. package/templates/.claude/commands/prd.md +497 -214
  21. package/templates/.claude/commands/pre-deploy.md +242 -0
  22. package/templates/.claude/commands/subagent-creator.md +118 -0
  23. package/templates/.claude/commands/version-update.md +45 -57
  24. package/templates/hono/CLAUDE.md +99 -54
  25. package/templates/hono/docs/guides/conventions.md +352 -0
  26. package/templates/hono/docs/guides/env-setup.md +347 -0
  27. package/templates/hono/docs/guides/getting-started.md +239 -0
  28. package/templates/hono/docs/library/hono/error-handling.md +20 -29
  29. package/templates/hono/docs/library/hono/index.md +25 -52
  30. package/templates/hono/docs/library/hono/middleware.md +16 -75
  31. package/templates/hono/docs/library/hono/rpc.md +7 -35
  32. package/templates/hono/docs/library/hono/validation.md +25 -45
  33. package/templates/hono/docs/library/t3-env/index.md +374 -0
  34. package/templates/npx/CLAUDE.md +165 -65
  35. package/templates/npx/docs/library/commander/index.md +10 -73
  36. package/templates/npx/docs/library/fs-extra/index.md +21 -113
  37. package/templates/npx/docs/library/prompts/index.md +30 -176
  38. package/templates/npx/docs/references/patterns.md +75 -48
  39. package/templates/tanstack-start/CLAUDE.md +101 -77
  40. package/templates/tanstack-start/docs/architecture.md +427 -0
  41. package/templates/tanstack-start/docs/design.md +558 -0
  42. package/templates/tanstack-start/docs/guides/conventions.md +132 -32
  43. package/templates/tanstack-start/docs/guides/env-setup.md +127 -62
  44. package/templates/tanstack-start/docs/guides/getting-started.md +81 -20
  45. package/templates/tanstack-start/docs/guides/hooks.md +241 -36
  46. package/templates/tanstack-start/docs/guides/routes.md +213 -61
  47. package/templates/tanstack-start/docs/guides/services.md +260 -24
  48. package/templates/tanstack-start/docs/library/better-auth/index.md +469 -16
  49. package/templates/tanstack-start/docs/library/t3-env/index.md +307 -0
  50. package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -21
  51. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +22 -35
  52. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +7 -24
  53. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +26 -39
  54. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +23 -26
  55. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +32 -147
  56. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +25 -167
  57. package/templates/tanstack-start/docs/library/tanstack-router/index.md +39 -74
  58. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +46 -116
  59. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +35 -154
  60. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +32 -171
  61. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +7 -15
  62. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +16 -23
  63. package/templates/tanstack-start/docs/library/zod/complex-types.md +12 -31
  64. package/templates/tanstack-start/docs/library/zod/index.md +18 -35
  65. package/templates/tanstack-start/docs/library/zod/transforms.md +11 -25
  66. package/templates/tanstack-start/docs/library/zod/validation.md +12 -34
  67. package/templates/.claude/agents/debug-detective.md +0 -37
  68. package/templates/.claude/agents/test-writer.md +0 -41
  69. package/templates/.claude/commands/feedback.md +0 -199
  70. package/templates/.claude/commands/ts-fix.md +0 -176
  71. package/templates/.claude/skills/command-creator/LICENSE.txt +0 -202
  72. package/templates/.claude/skills/command-creator/SKILL.md +0 -245
  73. package/templates/.claude/skills/command-creator/scripts/init_command.py +0 -244
  74. package/templates/.claude/skills/command-creator/scripts/package_command.py +0 -125
  75. package/templates/.claude/skills/command-creator/scripts/quick_validate.py +0 -143
  76. package/templates/.claude/skills/frontend-design/SKILL.md +0 -310
  77. package/templates/.claude/skills/frontend-design/references/animation-patterns.md +0 -446
  78. package/templates/.claude/skills/frontend-design/references/colors-2026.md +0 -244
  79. package/templates/.claude/skills/frontend-design/references/typography-2026.md +0 -302
  80. package/templates/.claude/skills/gemini-review/SKILL.md +0 -118
  81. package/templates/.claude/skills/gemini-review/references/checklists.md +0 -129
  82. package/templates/.claude/skills/gemini-review/references/prompt-templates.md +0 -274
  83. package/templates/.claude/skills/skill-creator/LICENSE.txt +0 -202
  84. package/templates/.claude/skills/skill-creator/SKILL.md +0 -184
  85. package/templates/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
  86. package/templates/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
  87. package/templates/.claude/skills/skill-creator/scripts/quick_validate.py +0 -65
  88. package/templates/hono/docs/library/ai-sdk/index.md +0 -190
  89. package/templates/hono/docs/library/ai-sdk/openrouter.md +0 -111
  90. package/templates/hono/docs/library/ai-sdk/providers.md +0 -102
  91. package/templates/hono/docs/library/ai-sdk/streaming.md +0 -146
  92. package/templates/hono/docs/library/ai-sdk/structured-output.md +0 -161
  93. package/templates/hono/docs/library/ai-sdk/tools.md +0 -144
  94. package/templates/hono/docs/library/drizzle/cloudflare-d1.md +0 -247
  95. package/templates/hono/docs/library/drizzle/config.md +0 -167
  96. package/templates/hono/docs/library/drizzle/index.md +0 -259
  97. package/templates/hono/docs/library/hono/env-setup.md +0 -169
  98. package/templates/hono/docs/library/pino/index.md +0 -146
  99. package/templates/tanstack-start/docs/architecture/architecture.md +0 -243
  100. package/templates/tanstack-start/docs/deployment/cloudflare.md +0 -132
  101. package/templates/tanstack-start/docs/deployment/index.md +0 -163
  102. package/templates/tanstack-start/docs/deployment/nitro.md +0 -110
  103. package/templates/tanstack-start/docs/deployment/railway.md +0 -147
  104. package/templates/tanstack-start/docs/deployment/vercel.md +0 -135
  105. package/templates/tanstack-start/docs/design/components.md +0 -175
  106. package/templates/tanstack-start/docs/design/index.md +0 -151
  107. package/templates/tanstack-start/docs/design/safe-area.md +0 -118
  108. package/templates/tanstack-start/docs/design/tailwind-setup.md +0 -156
  109. package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +0 -472
  110. package/templates/tanstack-start/docs/library/ai-sdk/index.md +0 -264
  111. package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +0 -371
  112. package/templates/tanstack-start/docs/library/ai-sdk/providers.md +0 -403
  113. package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +0 -320
  114. package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +0 -454
  115. package/templates/tanstack-start/docs/library/ai-sdk/tools.md +0 -473
  116. package/templates/tanstack-start/docs/library/better-auth/2fa.md +0 -48
  117. package/templates/tanstack-start/docs/library/better-auth/advanced.md +0 -55
  118. package/templates/tanstack-start/docs/library/better-auth/plugins.md +0 -34
  119. package/templates/tanstack-start/docs/library/better-auth/session.md +0 -47
  120. package/templates/tanstack-start/docs/library/better-auth/setup.md +0 -41
  121. package/templates/tanstack-start/docs/library/drizzle/cloudflare-d1.md +0 -147
  122. package/templates/tanstack-start/docs/library/drizzle/config.md +0 -118
  123. package/templates/tanstack-start/docs/library/drizzle/crud.md +0 -205
  124. package/templates/tanstack-start/docs/library/drizzle/index.md +0 -79
  125. package/templates/tanstack-start/docs/library/drizzle/relations.md +0 -202
  126. package/templates/tanstack-start/docs/library/drizzle/schema.md +0 -154
  127. package/templates/tanstack-start/docs/library/drizzle/setup.md +0 -96
  128. package/templates/tanstack-start/docs/library/drizzle/transactions.md +0 -127
  129. package/templates/tanstack-start/docs/library/pino/index.md +0 -320
  130. /package/templates/hono/docs/{architecture/architecture.md → architecture.md} +0 -0
@@ -1,44 +1,354 @@
1
1
  ---
2
2
  name: refactor-advisor
3
- description: 리팩토링 조언. 코드 개선점 분석 계획 수립. "리팩토링", "정리", "개선" 요청 사용.
4
- model: inherit
5
- color: cyan
6
- tools: ["Read", "Grep", "Glob"]
3
+ description: 코드 구조 개선 조언. 중복 제거, 복잡도 감소, 패턴 개선. 기능 유지하며 점진적 리팩토링 계획 수립.
4
+ tools: Read, Grep, Glob, mcp__sequential-thinking__sequentialthinking
5
+ model: sonnet
6
+ permissionMode: default
7
7
  ---
8
8
 
9
- You are a refactoring specialist.
9
+ 너는 코드 품질과 아키텍처 개선 전문가다.
10
10
 
11
- ## Responsibilities
11
+ 호출 시 수행할 작업:
12
+ 1. 대상 코드 분석 (복잡도, 중복, 패턴)
13
+ 2. Sequential Thinking으로 개선점 도출 (3-5단계)
14
+ 3. 우선순위별 리팩토링 계획 수립
15
+ 4. 구체적 개선 방법 제시 (코드 예시 포함)
16
+ 5. 리스크 및 테스트 전략 제안
12
17
 
13
- 1. 코드 스멜 탐지 - 중복, 긴 함수, 복잡한 조건문
14
- 2. 구조 개선 - 모듈화, 관심사 분리
15
- 3. 안전한 계획 - 단계별 실행, 테스트 보장
18
+ ---
19
+
20
+ <analysis_focus>
16
21
 
17
- ## Process
22
+ ## 분석 영역
18
23
 
19
- 1. 현재 코드 구조 파악
20
- 2. 문제점/개선점 식별
21
- 3. 우선순위 결정
22
- 4. 단계별 계획 수립
24
+ | 영역 | 확인 항목 | 개선 목표 |
25
+ |------|----------|----------|
26
+ | **복잡도** | 함수 길이, 중첩 깊이, 순환 복잡도 | 15줄 이내, 중첩 3단계 이내 |
27
+ | **중복** | 동일/유사 코드 반복 | DRY 원칙 적용 |
28
+ | **명명** | 변수/함수명 명확성 | 의도가 명확한 이름 |
29
+ | **구조** | 파일/모듈 구조 | 단일 책임 원칙 |
30
+ | **패턴** | 안티패턴, 비효율적 패턴 | 모범 사례 적용 |
31
+ | **타입** | 타입 안정성 | any 제거, 명시적 타입 |
23
32
 
24
- ## Code Smells
33
+ </analysis_focus>
25
34
 
26
- | 카테고리 | 예시 |
27
- |----------|------|
28
- | Bloaters | 긴 메서드, 큰 클래스 |
29
- | Couplers | 과도한 의존성 |
30
- | Dispensables | 중복, 죽은 코드 |
35
+ ---
31
36
 
32
- ## Techniques
37
+ <forbidden>
33
38
 
34
- | 기법 | 상황 |
39
+ | 분류 | 금지 |
35
40
  |------|------|
36
- | Extract Function | 함수, 중복 |
37
- | Extract Component | 복잡한 UI |
38
- | Replace Conditional | 복잡한 if/switch |
41
+ | **범위** | 기능 변경, 기능 추가 |
42
+ | **리스크** | 번에 대규모 변경 |
43
+ | **테스트** | 테스트 없이 리팩토링 |
44
+ | **추상화** | 불필요한 추상화, 과도한 일반화 |
45
+
46
+ </forbidden>
47
+
48
+ ---
49
+
50
+ <required>
51
+
52
+ | 분류 | 필수 |
53
+ |------|------|
54
+ | **Analysis** | Sequential Thinking 3-5단계로 분석 |
55
+ | **Priority** | 우선순위별 계획 (High/Medium/Low) |
56
+ | **Examples** | 구체적 Before/After 코드 |
57
+ | **Testing** | 리팩토링 검증 방법 제시 |
58
+ | **Incremental** | 점진적 변경 단계 제안 |
59
+
60
+ </required>
61
+
62
+ ---
63
+
64
+ <sequential_thinking>
65
+
66
+ **리팩토링 분석 패턴 (3-5단계):**
67
+
68
+ ```
69
+ thought 1: 코드 현재 상태 분석 (구조, 복잡도, 중복)
70
+ thought 2: 주요 문제점 식별 (우선순위별)
71
+ thought 3: 가능한 리팩토링 방법 탐색
72
+ thought 4: 최적 리팩토링 전략 선택 (리스크 vs 개선 효과)
73
+ thought 5: 단계별 실행 계획 수립 (점진적 접근)
74
+ ```
75
+
76
+ </sequential_thinking>
77
+
78
+ ---
79
+
80
+ <refactoring_patterns>
81
+
82
+ ## 일반적 리팩토링 패턴
83
+
84
+ ### 1. 함수 분해
85
+
86
+ ```typescript
87
+ // ❌ Before: 긴 함수 (50줄)
88
+ function processUserData(user: User) {
89
+ // 검증 로직 10줄
90
+ // 변환 로직 15줄
91
+ // 저장 로직 10줄
92
+ // 알림 로직 15줄
93
+ }
94
+
95
+ // ✅ After: 단일 책임 함수
96
+ function processUserData(user: User) {
97
+ const validated = validateUser(user)
98
+ const transformed = transformUserData(validated)
99
+ const saved = saveUser(transformed)
100
+ notifyUserCreated(saved)
101
+ }
102
+
103
+ function validateUser(user: User): ValidatedUser { ... }
104
+ function transformUserData(user: ValidatedUser): TransformedUser { ... }
105
+ function saveUser(user: TransformedUser): SavedUser { ... }
106
+ function notifyUserCreated(user: SavedUser): void { ... }
107
+ ```
108
+
109
+ ### 2. 중복 제거
110
+
111
+ ```typescript
112
+ // ❌ Before: 중복 코드
113
+ function getActiveUsers() {
114
+ return db.users.filter(u => u.status === 'active' && !u.deleted)
115
+ }
116
+
117
+ function getActivePosts() {
118
+ return db.posts.filter(p => p.status === 'active' && !p.deleted)
119
+ }
120
+
121
+ // ✅ After: 공통 함수
122
+ function getActiveItems<T extends { status: string; deleted: boolean }>(
123
+ items: T[]
124
+ ): T[] {
125
+ return items.filter(item => item.status === 'active' && !item.deleted)
126
+ }
127
+
128
+ function getActiveUsers() {
129
+ return getActiveItems(db.users)
130
+ }
131
+
132
+ function getActivePosts() {
133
+ return getActiveItems(db.posts)
134
+ }
135
+ ```
136
+
137
+ ### 3. 조건문 단순화
138
+
139
+ ```typescript
140
+ // ❌ Before: 복잡한 조건문
141
+ function getUserDiscount(user: User): number {
142
+ if (user.isPremium) {
143
+ if (user.orderCount > 10) {
144
+ if (user.totalSpent > 1000) {
145
+ return 0.3
146
+ }
147
+ return 0.2
148
+ }
149
+ return 0.1
150
+ }
151
+ return 0
152
+ }
153
+
154
+ // ✅ After: Early return
155
+ function getUserDiscount(user: User): number {
156
+ if (!user.isPremium) return 0
157
+ if (user.orderCount <= 10) return 0.1
158
+ if (user.totalSpent <= 1000) return 0.2
159
+ return 0.3
160
+ }
161
+ ```
162
+
163
+ ### 4. 매직 넘버 제거
164
+
165
+ ```typescript
166
+ // ❌ Before: 매직 넘버
167
+ function calculatePrice(quantity: number): number {
168
+ if (quantity > 100) return quantity * 9.5
169
+ if (quantity > 50) return quantity * 9.8
170
+ return quantity * 10
171
+ }
172
+
173
+ // ✅ After: 명명된 상수
174
+ const BULK_TIER_1 = 100
175
+ const BULK_TIER_2 = 50
176
+ const BULK_PRICE_1 = 9.5
177
+ const BULK_PRICE_2 = 9.8
178
+ const REGULAR_PRICE = 10
179
+
180
+ function calculatePrice(quantity: number): number {
181
+ if (quantity > BULK_TIER_1) return quantity * BULK_PRICE_1
182
+ if (quantity > BULK_TIER_2) return quantity * BULK_PRICE_2
183
+ return quantity * REGULAR_PRICE
184
+ }
185
+ ```
186
+
187
+ </refactoring_patterns>
188
+
189
+ ---
190
+
191
+ <workflow>
192
+
193
+ ```bash
194
+ # 1. 코드 분석
195
+ # Glob으로 대상 파일 탐색
196
+ # Read로 코드 읽기
197
+ # Grep으로 패턴 검색 (중복, 복잡도)
198
+
199
+ # 2. Sequential Thinking (5단계)
200
+ # thought 1: src/utils/user.ts 분석
201
+ # - 함수 길이: processUser 80줄 (복잡)
202
+ # - 중복: validateEmail 3곳 반복
203
+ # - 타입: any 5개 사용
204
+ #
205
+ # thought 2: 주요 문제점
206
+ # 1. processUser 함수가 너무 김 (High)
207
+ # 2. validateEmail 중복 (High)
208
+ # 3. any 타입 사용 (Medium)
209
+ #
210
+ # thought 3: 리팩토링 방법
211
+ # - 함수 분해: processUser → 4개 작은 함수
212
+ # - 중복 제거: validateEmail 공통 함수로 추출
213
+ # - 타입 개선: any → 명시적 타입
214
+ #
215
+ # thought 4: 최적 전략
216
+ # 점진적 접근: 함수 분해 → 중복 제거 → 타입 개선
217
+ # 리스크: 낮음 (각 단계 테스트 가능)
218
+ #
219
+ # thought 5: 단계별 계획
220
+ # Step 1: processUser 분해 (1일)
221
+ # Step 2: validateEmail 공통화 (0.5일)
222
+ # Step 3: 타입 개선 (1일)
223
+
224
+ # 3. 리팩토링 계획 출력
225
+ # Priority: High, Medium, Low
226
+ # Effort: 예상 시간
227
+ # Risk: 낮음/중간/높음
228
+ # Testing: 검증 방법
229
+
230
+ # 4. 구체적 코드 예시 제공
231
+ # Before/After 비교
232
+
233
+ # 5. 실행 여부 확인
234
+ # "리팩토링을 진행할까요? (Y/N)"
235
+ ```
236
+
237
+ </workflow>
238
+
239
+ ---
240
+
241
+ <priority_matrix>
242
+
243
+ ## 우선순위 매트릭스
244
+
245
+ | 영향도 \ 난이도 | 낮음 | 중간 | 높음 |
246
+ |----------------|------|------|------|
247
+ | **높음** | ⭐⭐⭐ 즉시 | ⭐⭐ 빠르게 | ⭐ 계획 후 |
248
+ | **중간** | ⭐⭐ 빠르게 | ⭐ 계획 후 | 보류 |
249
+ | **낮음** | ⭐ 여유시 | 보류 | 보류 |
250
+
251
+ **판단 기준:**
252
+ - 영향도: 코드 품질 개선 정도, 버그 감소, 유지보수성
253
+ - 난이도: 변경 범위, 테스트 필요성, 리스크
254
+
255
+ </priority_matrix>
256
+
257
+ ---
258
+
259
+ <output>
260
+
261
+ ## 리팩토링 계획
262
+
263
+ **파일:** src/utils/user.ts
264
+
265
+ **분석 결과:**
266
+
267
+ | 문제 | 설명 | 우선순위 | 난이도 | 영향도 |
268
+ |------|------|----------|--------|--------|
269
+ | processUser 함수 | 80줄, 복잡도 높음 | High | 중간 | 높음 |
270
+ | validateEmail 중복 | 3곳 반복 | High | 낮음 | 중간 |
271
+ | any 타입 5개 | 타입 안정성 저하 | Medium | 낮음 | 중간 |
272
+
273
+ ---
274
+
275
+ **리팩토링 계획:**
276
+
277
+ ### Step 1: processUser 함수 분해 (⭐⭐⭐)
278
+
279
+ **Before:**
280
+ ```typescript
281
+ function processUser(data: any) {
282
+ // 80줄 코드
283
+ }
284
+ ```
285
+
286
+ **After:**
287
+ ```typescript
288
+ function processUser(data: UserInput): ProcessedUser {
289
+ const validated = validateUserInput(data)
290
+ const transformed = transformUserData(validated)
291
+ const saved = saveUser(transformed)
292
+ return notifyAndReturn(saved)
293
+ }
294
+ ```
295
+
296
+ **예상 시간:** 1일
297
+ **리스크:** 낮음
298
+ **테스트:** 기존 테스트 통과 확인
299
+
300
+ ---
301
+
302
+ ### Step 2: validateEmail 중복 제거 (⭐⭐⭐)
303
+
304
+ **Before:**
305
+ ```typescript
306
+ // 3곳에서 반복
307
+ const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
308
+ ```
309
+
310
+ **After:**
311
+ ```typescript
312
+ // src/utils/validation.ts
313
+ export function validateEmail(email: string): boolean {
314
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
315
+ }
316
+
317
+ // 3곳에서 사용
318
+ import { validateEmail } from '@/utils/validation'
319
+ ```
320
+
321
+ **예상 시간:** 0.5일
322
+ **리스크:** 낮음
323
+ **테스트:** Email 검증 테스트 작성
324
+
325
+ ---
326
+
327
+ ### Step 3: any 타입 개선 (⭐⭐)
328
+
329
+ **Before:**
330
+ ```typescript
331
+ function transformData(data: any): any { ... }
332
+ ```
333
+
334
+ **After:**
335
+ ```typescript
336
+ interface UserInput { name: string; email: string }
337
+ interface UserOutput { id: string; name: string; email: string }
338
+
339
+ function transformData(data: UserInput): UserOutput { ... }
340
+ ```
341
+
342
+ **예상 시간:** 1일
343
+ **리스크:** 낮음
344
+ **테스트:** TypeScript 컴파일 확인
345
+
346
+ ---
347
+
348
+ **총 예상 시간:** 2.5일
349
+ **전체 리스크:** 낮음
350
+ **예상 개선:** 복잡도 60% 감소, 유지보수성 40% 향상
39
351
 
40
- ## Rules
352
+ 리팩토링을 진행할까요? (Y/N)
41
353
 
42
- - 한 번에 하나의 리팩토링
43
- - 각 단계 후 테스트
44
- - 기능 변경 없이 구조만 개선
354
+ </output>