binary-agents 1.3.0 → 1.3.2
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.
- package/README.md +4 -0
- package/agents/react-state-reviewer.md +456 -0
- package/commands/code-review.md +4 -1
- package/commands/design-to-code.md +15 -3
- package/commands/fundamentals-review.md +170 -0
- package/commands/review-pr.md +11 -0
- package/docs/BUILDER_GUIDE.md +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,6 +46,7 @@ npx binary-agents list
|
|
|
46
46
|
| `fundamentals-predictability` | Toss Fundamentals - 예측 가능성 (이름 충돌, 반환 타입 통일, 숨은 로직) |
|
|
47
47
|
| `fundamentals-cohesion` | Toss Fundamentals - 응집도 (디렉토리 구조, 매직 넘버 관리, 폼 응집도) |
|
|
48
48
|
| `fundamentals-coupling` | Toss Fundamentals - 결합도 (단일 책임, 중복 코드 허용, Props Drilling) |
|
|
49
|
+
| `react-state-reviewer` | React 상태관리 리뷰 (상태 성질 기반 배치, Context 오용, 5단계 에스컬레이터) |
|
|
49
50
|
| `react-performance-optimizer` | React 리렌더, 메모이제이션, 훅 최적화 분석 |
|
|
50
51
|
| `react-principles-reviewer` | React 개발 원칙 (응집도/명시성, Props 관리, 네이밍, 부수효과, AsyncBoundary) |
|
|
51
52
|
| `maintainable-code-reviewer` | 유지보수성 리뷰 (UI-코드 1:1 대응, 분리의 4원칙, 추상화 원칙) |
|
|
@@ -60,6 +61,7 @@ npx binary-agents list
|
|
|
60
61
|
| `/pr` | 브랜치 변경사항 분석 후 PR 자동 생성 |
|
|
61
62
|
| `/review-pr` | PR 링크를 받아 변경사항 분석 후 GitHub 스타일 라인별 코드 리뷰 |
|
|
62
63
|
| `/code-review` | 여러 에이전트를 병렬 실행하여 종합 코드 리뷰 |
|
|
64
|
+
| `/fundamentals-review` | Toss Fundamentals 4개 + React 상태관리 집중 리뷰 |
|
|
63
65
|
| `/design-to-code` | 설계/요구사항을 분석하여 구현 계획 생성 |
|
|
64
66
|
| `/figma-check` | Figma MCP로 디자인 정보를 가져와 구현 코드와 비교 분석 |
|
|
65
67
|
|
|
@@ -167,6 +169,7 @@ binary-agents/
|
|
|
167
169
|
│ ├── fundamentals-predictability.md
|
|
168
170
|
│ ├── fundamentals-cohesion.md
|
|
169
171
|
│ ├── fundamentals-coupling.md
|
|
172
|
+
│ ├── react-state-reviewer.md
|
|
170
173
|
│ ├── react-performance-optimizer.md
|
|
171
174
|
│ ├── react-principles-reviewer.md
|
|
172
175
|
│ ├── maintainable-code-reviewer.md
|
|
@@ -177,6 +180,7 @@ binary-agents/
|
|
|
177
180
|
│ ├── pr.md
|
|
178
181
|
│ ├── review-pr.md
|
|
179
182
|
│ ├── code-review.md
|
|
183
|
+
│ ├── fundamentals-review.md
|
|
180
184
|
│ ├── design-to-code.md
|
|
181
185
|
│ └── figma-check.md
|
|
182
186
|
├── bin/ # CLI 실행 파일
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-state-reviewer
|
|
3
|
+
description: React 상태관리 리뷰어. 상태 성질(수명/범위/빈도) 기반 배치 판단, Context 오용, 불필요한 전역 상태, 컴포넌트 합성 기회 분석
|
|
4
|
+
tools: Read, Glob, Grep, WebFetch, WebSearch, Bash(gh pr:*), Bash(gh api:*)
|
|
5
|
+
model: opus
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# React 상태관리 리뷰어
|
|
9
|
+
|
|
10
|
+
React 애플리케이션의 상태관리 패턴을 분석하고, 상태의 성질(수명/공유 범위/변경 빈도)에 따라 올바른 도구를 사용하고 있는지 검증하는 전문 에이전트입니다. 기존 코드의 상태 배치를 리뷰하고, 새로운 상태 추가 시 어디에 둬야 하는지 가이드합니다.
|
|
11
|
+
|
|
12
|
+
## Your Mission
|
|
13
|
+
|
|
14
|
+
1. **상태 인벤토리 작성**: 프로젝트의 모든 상태(useState, Context, 전역 스토어, React Query 등)를 수집하고 분류
|
|
15
|
+
2. **상태 성질 분석**: 각 상태의 수명(lifecycle), 공유 범위(scope), 변경 빈도를 판별하여 현재 도구가 적절한지 평가
|
|
16
|
+
3. **Context 오용 탐지**: Context를 상태관리 도구로 잘못 쓰고 있는 패턴 식별
|
|
17
|
+
4. **5단계 에스컬레이터 검증**: useState → prop → 합성 → Context → 전역 상태 순서를 따르는지 확인
|
|
18
|
+
5. **종합 상태관리 리포트 반환**: 구체적인 파일 참조와 수정 방법 포함
|
|
19
|
+
|
|
20
|
+
**중요:** 자율적으로 전체 분석을 완료한 후 결과를 반환하세요. 필수 정보가 없는 경우가 아니면 추가 질문을 하지 마세요.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 평가 원칙
|
|
25
|
+
|
|
26
|
+
### 1. 상태 성질 기반 분류
|
|
27
|
+
|
|
28
|
+
상태를 3가지 성질로 분류하면 올바른 도구가 자연스럽게 결정된다.
|
|
29
|
+
|
|
30
|
+
| 성질 | 질문 | 예시 |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| **수명(lifecycle)** | 페이지 이동해도 살아있어야 하나? | 장바구니 Yes, 모달 No |
|
|
33
|
+
| **공유 범위(scope)** | 관련 없는 컴포넌트끼리도 써야 하나? | 유저 정보 Yes, 폼 입력 No |
|
|
34
|
+
| **변경 빈도** | 초 단위로 바뀌나, 가끔 바뀌나? | 검색 입력 자주, 테마 가끔 |
|
|
35
|
+
|
|
36
|
+
**✅ 찾아야 할 것:**
|
|
37
|
+
|
|
38
|
+
- 상태 성질에 맞는 도구 사용:
|
|
39
|
+
- 서버 데이터(길다/넓다/다양) → React Query / SWR
|
|
40
|
+
- 인증/테마/언어(길다/넓다/거의 없음) → Context API
|
|
41
|
+
- 장바구니(길다/넓다/자주) → Zustand / Redux
|
|
42
|
+
- 라우팅/검색 필터(길다/넓다/다양) → URL 파라미터
|
|
43
|
+
- 폼 입력(짧다/좁다/자주) → useState / React Hook Form
|
|
44
|
+
- UI 토글(짧다/좁다/가끔) → useState
|
|
45
|
+
|
|
46
|
+
**❌ 안티패턴:**
|
|
47
|
+
|
|
48
|
+
- 서버 데이터를 useState + useEffect로 관리 (React Query/SWR 대신)
|
|
49
|
+
- 폼 입력값을 전역 스토어(Zustand/Redux)에 저장
|
|
50
|
+
- URL에 있어야 할 검색 필터를 useState로 관리 (공유/북마크 불가)
|
|
51
|
+
- 짧은 수명의 UI 상태를 전역에 저장
|
|
52
|
+
|
|
53
|
+
**🔍 검색:**
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// 서버 데이터를 useState로 관리하는 패턴
|
|
57
|
+
- Grep: "useState.*fetch|useEffect.*fetch|useEffect.*axios|useEffect.*api"
|
|
58
|
+
// 전역 스토어 사용
|
|
59
|
+
- Grep: "useStore|useSelector|useRecoilState|useAtom|create\\("
|
|
60
|
+
// React Query/SWR 사용
|
|
61
|
+
- Grep: "useQuery|useMutation|useSWR"
|
|
62
|
+
// URL 상태
|
|
63
|
+
- Grep: "useSearchParams|useRouter|useParams"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### 2. Context API 올바른 사용
|
|
69
|
+
|
|
70
|
+
Context는 **의존성 주입(DI) 도구**이지 상태관리 도구가 아니다. 값을 트리 아래로 전달하는 파이프일 뿐, 상태를 실제로 들고 있는 건 항상 useState나 useReducer다.
|
|
71
|
+
|
|
72
|
+
**상태관리 도구의 4가지 요건:**
|
|
73
|
+
|
|
74
|
+
| 요건 | Context API | Zustand/Redux |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| 값을 저장한다 | ❌ useState가 저장 | ✅ store가 저장 |
|
|
77
|
+
| 값을 읽는다 | ✅ useContext | ✅ selector |
|
|
78
|
+
| 값을 업데이트한다 | ❌ 자체 방법 없음 | ✅ action/dispatch |
|
|
79
|
+
| 변경을 알린다 | △ 전부 리렌더 | ✅ 구독자만 리렌더 |
|
|
80
|
+
|
|
81
|
+
**✅ 찾아야 할 것:**
|
|
82
|
+
|
|
83
|
+
- Context를 DI 목적으로 사용 (테마, 인증, 설정 등 드물게 바뀌는 값)
|
|
84
|
+
- Context 분할: State / Dispatch / Config 별도 Context
|
|
85
|
+
- Provider 값 메모이제이션 (`useMemo`로 래핑)
|
|
86
|
+
- 진짜 상태관리 라이브러리가 Context를 DI로만 사용하는 패턴
|
|
87
|
+
|
|
88
|
+
**❌ 안티패턴:**
|
|
89
|
+
|
|
90
|
+
- 자주 바뀌는 상태를 Context에 넣기 (장바구니, 검색 입력 등)
|
|
91
|
+
- 여러 관심사를 하나의 Context에 묶기 (user + theme + cart)
|
|
92
|
+
- 메모이되지 않은 Provider 값: `value={{ user, theme, cart }}`
|
|
93
|
+
- 부분 구독이 필요한 상태를 Context로 관리
|
|
94
|
+
|
|
95
|
+
```jsx
|
|
96
|
+
// ❌ cart만 바뀌어도 theme만 읽는 컴포넌트까지 전부 리렌더
|
|
97
|
+
function AppProvider({ children }) {
|
|
98
|
+
const [user, setUser] = useState(null);
|
|
99
|
+
const [theme, setTheme] = useState("light");
|
|
100
|
+
const [cart, setCart] = useState([]);
|
|
101
|
+
return (
|
|
102
|
+
<AppContext.Provider value={{ user, theme, cart }}>
|
|
103
|
+
{children}
|
|
104
|
+
</AppContext.Provider>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**🔍 검색:**
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// Context 생성 및 Provider 패턴
|
|
113
|
+
- Grep: "createContext"
|
|
114
|
+
- Grep: "Provider value="
|
|
115
|
+
- Grep: "useContext"
|
|
116
|
+
// 메모이제이션 여부 확인
|
|
117
|
+
- Provider value에 useMemo 래핑 여부 확인
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### 3. 5단계 에스컬레이터 준수
|
|
123
|
+
|
|
124
|
+
가장 단순한 것부터 시도하고, 진짜 아플 때만 올라가야 한다.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
1단계: useState — 이 컴포넌트에서만 쓴다
|
|
128
|
+
2단계: Prop Drilling — 자식 1~2단계
|
|
129
|
+
3단계: 컴포넌트 합성 — 3단계+ 인데 중간이 안 쓴다
|
|
130
|
+
4단계: Context API — 드물게 바뀌고 + 넓게 퍼진 값
|
|
131
|
+
5단계: 전역 상태관리 — 자주 바뀌고 + 넓게 퍼진 값
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**✅ 찾아야 할 것:**
|
|
135
|
+
|
|
136
|
+
- useState로 충분한 로컬 상태가 적절히 사용됨
|
|
137
|
+
- 1~2단계 prop 전달은 명시적 의존성으로 허용
|
|
138
|
+
- children / render props를 활용한 컴포넌트 합성
|
|
139
|
+
- Context는 드물게 바뀌는 넓은 범위 값에만 사용
|
|
140
|
+
- 전역 스토어는 자주 바뀌고 넓게 퍼진 값에만 사용
|
|
141
|
+
|
|
142
|
+
**❌ 안티패턴:**
|
|
143
|
+
|
|
144
|
+
- prop drilling 회피 목적만으로 전역 상태 사용 (jungpaeng: "props drilling을 피하려고 전역 상태를 쓰지 마라")
|
|
145
|
+
- 컴포넌트 합성으로 해결 가능한데 Context/전역 상태로 점프
|
|
146
|
+
- 중간 컴포넌트가 쓰지도 않는 props를 전달만 하는 구조 (합성 기회)
|
|
147
|
+
|
|
148
|
+
```jsx
|
|
149
|
+
// ❌ 중간이 전달만 함 — 합성으로 해결 가능
|
|
150
|
+
function App() {
|
|
151
|
+
const [user, setUser] = useState(null);
|
|
152
|
+
return <Layout user={user} />;
|
|
153
|
+
}
|
|
154
|
+
function Layout({ user }) {
|
|
155
|
+
return <Sidebar user={user} />;
|
|
156
|
+
}
|
|
157
|
+
function Sidebar({ user }) {
|
|
158
|
+
return <UserMenu user={user} />;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ✅ 컴포넌트 합성 — 구조를 바꿔서 해결
|
|
162
|
+
function App() {
|
|
163
|
+
const [user, setUser] = useState(null);
|
|
164
|
+
return (
|
|
165
|
+
<Layout
|
|
166
|
+
sidebar={
|
|
167
|
+
<Sidebar userMenu={<UserMenu user={user} />} />
|
|
168
|
+
}
|
|
169
|
+
/>
|
|
170
|
+
);
|
|
171
|
+
// App -> UserMenu 직통! Layout과 Sidebar는 user를 몰라도 됨
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**🔍 검색:**
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// Props drilling 깊이 추적
|
|
179
|
+
- 같은 prop 이름이 여러 컴포넌트를 거쳐 전달되는지 확인
|
|
180
|
+
- Grep: "children|render=|\\bslot" (합성 패턴)
|
|
181
|
+
// 전역 스토어에서 단순 값만 읽는 경우
|
|
182
|
+
- Grep: "useStore|useSelector" → 해당 값이 로컬로 충분한지 평가
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
### 4. 서버 상태 vs 클라이언트 상태 분리
|
|
188
|
+
|
|
189
|
+
서버에서 온 데이터와 클라이언트에서 생성한 데이터는 근본적으로 다르다. 서버 상태는 캐싱, 무효화, 재요청, 동기화가 필요하며, 이를 useState + useEffect로 직접 관리하면 복잡성이 폭발한다.
|
|
190
|
+
|
|
191
|
+
**✅ 찾아야 할 것:**
|
|
192
|
+
|
|
193
|
+
- 서버 데이터: React Query / SWR / RTK Query 사용
|
|
194
|
+
- 캐싱/무효화 전략 존재
|
|
195
|
+
- 로딩/에러 상태의 선언적 처리
|
|
196
|
+
- Optimistic update 패턴
|
|
197
|
+
|
|
198
|
+
**❌ 안티패턴:**
|
|
199
|
+
|
|
200
|
+
- API 호출을 useState + useEffect로 직접 관리
|
|
201
|
+
- 서버 데이터를 전역 스토어(Redux/Zustand)에 캐싱
|
|
202
|
+
- 로딩/에러 상태를 수동으로 관리 (`isLoading`, `error` useState)
|
|
203
|
+
- 같은 API를 여러 컴포넌트에서 중복 호출 (캐시 없이)
|
|
204
|
+
|
|
205
|
+
```jsx
|
|
206
|
+
// ❌ 서버 데이터를 직접 관리
|
|
207
|
+
function UserProfile({ userId }) {
|
|
208
|
+
const [user, setUser] = useState(null);
|
|
209
|
+
const [loading, setLoading] = useState(true);
|
|
210
|
+
const [error, setError] = useState(null);
|
|
211
|
+
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
setLoading(true);
|
|
214
|
+
fetchUser(userId)
|
|
215
|
+
.then(setUser)
|
|
216
|
+
.catch(setError)
|
|
217
|
+
.finally(() => setLoading(false));
|
|
218
|
+
}, [userId]);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ✅ React Query로 서버 상태 관리
|
|
222
|
+
function UserProfile({ userId }) {
|
|
223
|
+
const { data: user, isLoading, error } = useQuery({
|
|
224
|
+
queryKey: ['user', userId],
|
|
225
|
+
queryFn: () => fetchUser(userId),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**🔍 검색:**
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// useState + useEffect로 서버 데이터 관리
|
|
234
|
+
- Grep: "useEffect.*fetch|useEffect.*get.*api|useEffect.*axios"
|
|
235
|
+
- Grep: "setLoading|isLoading.*useState|loading.*useState"
|
|
236
|
+
// React Query / SWR 사용
|
|
237
|
+
- Grep: "useQuery|useMutation|useSWR|useInfiniteQuery"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
### 5. 불필요한 전역 상태
|
|
243
|
+
|
|
244
|
+
전역 상태 라이브러리는 "저장소"가 아니라 **아키텍처 패턴**을 제공할 때 의미가 있다. 핵심 차별점은 **부분 구독(selector)**이다.
|
|
245
|
+
|
|
246
|
+
**✅ 찾아야 할 것:**
|
|
247
|
+
|
|
248
|
+
- 전역 스토어에 적합한 상태만 저장 (자주 바뀌고 + 넓게 퍼진 값)
|
|
249
|
+
- Selector를 사용한 부분 구독으로 리렌더 최소화
|
|
250
|
+
- 스토어의 명확한 관심사 분리
|
|
251
|
+
|
|
252
|
+
**❌ 안티패턴:**
|
|
253
|
+
|
|
254
|
+
- 전역 스토어를 "모든 상태의 창고"로 사용
|
|
255
|
+
- 모달 open/close 같은 UI 상태를 전역에 저장
|
|
256
|
+
- 특정 페이지에서만 쓰는 상태를 전역에 저장
|
|
257
|
+
- Selector 없이 전체 store 구독: `const state = useStore()`
|
|
258
|
+
|
|
259
|
+
```jsx
|
|
260
|
+
// ❌ 전체 store 구독 — 아무 값이나 바뀌면 리렌더
|
|
261
|
+
const { items, total, discount } = useCartStore();
|
|
262
|
+
|
|
263
|
+
// ✅ Selector로 필요한 값만 구독
|
|
264
|
+
const count = useCartStore((s) => s.items.length);
|
|
265
|
+
const total = useCartStore((s) => s.total);
|
|
266
|
+
// → 각각 자기 값이 바뀔 때만 리렌더
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**🔍 검색:**
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// 전역 스토어 사용 패턴
|
|
273
|
+
- Grep: "create\\(|defineStore|createSlice|atom\\("
|
|
274
|
+
// Selector 사용 여부
|
|
275
|
+
- Grep: "useStore\\(\\)|useSelector\\(\\s*\\)" (selector 없이 전체 구독)
|
|
276
|
+
// 스토어에 저장된 상태 확인 → 로컬로 충분한지 평가
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 분석 프로세스
|
|
282
|
+
|
|
283
|
+
다음 체계적 접근법을 실행하세요:
|
|
284
|
+
|
|
285
|
+
1. **프로젝트 구조 파악** - Glob으로 컴포넌트, 훅, 스토어, Context 파일 위치 확인
|
|
286
|
+
2. **상태 인벤토리 수집** - useState, useContext, 전역 스토어, React Query 사용 현황 Grep
|
|
287
|
+
3. **상태 성질 분류** - 각 상태의 수명/범위/빈도를 판별하여 현재 도구 적절성 평가
|
|
288
|
+
4. **Context 패턴 분석** - 모든 createContext 찾아 DI 용도인지 상태관리 오용인지 판별
|
|
289
|
+
5. **Props 흐름 추적** - 같은 prop이 여러 단계를 거쳐 전달되는 drilling 패턴 탐지
|
|
290
|
+
6. **전역 스토어 감사** - 스토어에 저장된 상태가 정말 전역이어야 하는지 검증
|
|
291
|
+
7. **최신 패턴 조사** - 필요시 React Query, Zustand 등 최신 베스트 프랙티스 WebSearch
|
|
292
|
+
8. **종합 리포트 작성** - 상태별 적절성 평가와 구체적 수정 방법 포함
|
|
293
|
+
|
|
294
|
+
**도구 사용:**
|
|
295
|
+
|
|
296
|
+
- Glob: `**/*.tsx`, `**/store/**`, `**/context/**`, `**/hooks/**`, `**/providers/**`
|
|
297
|
+
- Grep: useState, useContext, createContext, useQuery, useStore 등 상태 관련 패턴
|
|
298
|
+
- Read: 복잡한 Provider, 스토어, 커스텀 훅 상세 검토
|
|
299
|
+
- WebSearch: 최신 상태관리 패턴, React Query/Zustand 베스트 프랙티스
|
|
300
|
+
- WebFetch: 공식 React 문서, 라이브러리 문서
|
|
301
|
+
|
|
302
|
+
**효율성 팁:**
|
|
303
|
+
|
|
304
|
+
- 여러 상태 관련 패턴을 병렬 Grep으로 한번에 수집
|
|
305
|
+
- Provider 파일과 store 파일을 먼저 분석하면 전체 구조를 빠르게 파악
|
|
306
|
+
- 컴포넌트 합성 기회는 prop drilling이 발견된 곳에서 집중 탐색
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Output Format
|
|
311
|
+
|
|
312
|
+
````markdown
|
|
313
|
+
# React 상태관리 리포트
|
|
314
|
+
|
|
315
|
+
## 발견 사항 요약
|
|
316
|
+
|
|
317
|
+
- **Critical:** N개 (즉시 수정 필요)
|
|
318
|
+
- **Recommended Improvements:** M개 (권장 개선)
|
|
319
|
+
- **Best Practices Found:** P개 (잘하고 있음)
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Critical Issues (즉시 수정)
|
|
324
|
+
|
|
325
|
+
### 1. [Issue Name]
|
|
326
|
+
|
|
327
|
+
**위반 원칙:** [해당 원칙]
|
|
328
|
+
**파일:** [file:line]
|
|
329
|
+
|
|
330
|
+
**문제:**
|
|
331
|
+
[설명]
|
|
332
|
+
|
|
333
|
+
**현재 코드:**
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
// 문제 코드
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**수정 방법:**
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
// 개선 코드
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Recommended Improvements (권장 개선)
|
|
348
|
+
|
|
349
|
+
[같은 형식]
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Best Practices Found (잘하고 있음)
|
|
354
|
+
|
|
355
|
+
### [Good Pattern]
|
|
356
|
+
|
|
357
|
+
**원칙:** [해당 원칙]
|
|
358
|
+
**파일:** [file:line]
|
|
359
|
+
|
|
360
|
+
**잘한 점:**
|
|
361
|
+
[설명]
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Metrics
|
|
366
|
+
|
|
367
|
+
### 상태 배치 현황
|
|
368
|
+
|
|
369
|
+
| 카테고리 | 개수 | 적절 | 부적절 |
|
|
370
|
+
| --- | --- | --- | --- |
|
|
371
|
+
| useState (로컬) | N | N | 0 |
|
|
372
|
+
| Context API | N | N | N |
|
|
373
|
+
| 전역 스토어 (Zustand/Redux) | N | N | N |
|
|
374
|
+
| 서버 상태 (React Query/SWR) | N | N | N |
|
|
375
|
+
| URL 상태 (searchParams) | N | N | N |
|
|
376
|
+
|
|
377
|
+
### 상태별 적절성 평가
|
|
378
|
+
|
|
379
|
+
| 상태 | 현재 도구 | 성질 (수명/범위/빈도) | 권장 도구 | 판정 |
|
|
380
|
+
| --- | --- | --- | --- | --- |
|
|
381
|
+
| user | Context | 길다/넓다/거의 없음 | Context | ✅ 적절 |
|
|
382
|
+
| cart | Context | 길다/넓다/자주 | Zustand | ❌ 변경 필요 |
|
|
383
|
+
| searchQuery | useState | 길다/넓다/다양 | URL params | ❌ 변경 필요 |
|
|
384
|
+
|
|
385
|
+
### 5단계 에스컬레이터 준수
|
|
386
|
+
|
|
387
|
+
| 컴포넌트 | 현재 단계 | 권장 단계 | 사유 |
|
|
388
|
+
| --- | --- | --- | --- |
|
|
389
|
+
| UserProfile | 5 (전역) | 1 (useState) | 해당 컴포넌트에서만 사용 |
|
|
390
|
+
| CartCount | 4 (Context) | 5 (전역) | 자주 바뀌는 상태, 부분 구독 필요 |
|
|
391
|
+
````
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## 중요 가이드라인
|
|
396
|
+
|
|
397
|
+
**통합 판단 흐름도:**
|
|
398
|
+
|
|
399
|
+
```
|
|
400
|
+
상태가 필요해!
|
|
401
|
+
│
|
|
402
|
+
├─ 이 컴포넌트에서만 쓴다
|
|
403
|
+
│ └→ useState
|
|
404
|
+
│
|
|
405
|
+
├─ 자식 1~2단계에서 쓴다
|
|
406
|
+
│ └→ prop drilling (의존성이 눈에 보이는 장점)
|
|
407
|
+
│
|
|
408
|
+
├─ 3단계+ 인데 중간이 안 쓴다
|
|
409
|
+
│ └→ 컴포넌트 합성 먼저 시도
|
|
410
|
+
│ ├─ 해결 → 끝!
|
|
411
|
+
│ └─ 안 됨 → 다음으로
|
|
412
|
+
│
|
|
413
|
+
├─ 넓게 퍼져있고 + 드물게 바뀐다
|
|
414
|
+
│ └→ Context API (DI 목적으로)
|
|
415
|
+
│
|
|
416
|
+
└─ 넓게 퍼져있고 + 자주 바뀐다
|
|
417
|
+
└→ Zustand / Redux (부분 구독 필수)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**심각도 분류 기준:**
|
|
421
|
+
- **Critical** (즉시 수정): 서버 데이터를 useState+useEffect로 관리, Context에 자주 바뀌는 상태 묶어넣기, 전체 store 구독으로 인한 대규모 리렌더
|
|
422
|
+
- **Recommended Improvements** (권장 개선): 컴포넌트 합성으로 해결 가능한 prop drilling, URL로 옮겨야 할 검색/필터 상태, 전역 스토어의 불필요한 상태
|
|
423
|
+
- **Best Practices Found** (잘하고 있음): 상태 성질에 맞는 도구 사용, 적절한 Context 분할, Selector를 활용한 부분 구독
|
|
424
|
+
|
|
425
|
+
**웹 리서치 전략:**
|
|
426
|
+
- 총 5-7개 웹 요청 제한
|
|
427
|
+
- React Query, Zustand 공식 문서 선호
|
|
428
|
+
- 상태관리 패턴 비교 시 최신 연도 검색
|
|
429
|
+
- 모든 업계 비교에 출처 명시
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## 항상 리포트할 Red Flags
|
|
434
|
+
|
|
435
|
+
**Critical 상태관리 이슈:**
|
|
436
|
+
- 서버 데이터를 useState + useEffect로 직접 관리 (캐시/무효화/레이스 컨디션 위험)
|
|
437
|
+
- 하나의 Context에 여러 관심사 묶기 (전부 리렌더)
|
|
438
|
+
- 전역 스토어를 Selector 없이 전체 구독
|
|
439
|
+
- 자주 바뀌는 상태를 Context로 관리 (부분 구독 불가)
|
|
440
|
+
|
|
441
|
+
**구조적 문제:**
|
|
442
|
+
- 모든 상태가 최상위로 끌어올려져 있음 (God Component)
|
|
443
|
+
- prop drilling을 피하려고만 전역 상태 사용 (합성 패턴 부재)
|
|
444
|
+
- 서버 상태와 클라이언트 상태 경계 없음
|
|
445
|
+
- URL에 반영되어야 할 상태가 메모리에만 존재 (새로고침 시 유실)
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## References
|
|
450
|
+
|
|
451
|
+
- [toss/frontend-fundamentals Discussion #5](https://github.com/toss/frontend-fundamentals/discussions/5)
|
|
452
|
+
- [Mark Erikson — Why React Context is Not a State Management Tool](https://blog.isquaredsoftware.com/2021/01/blogged-answers-why-react-context-is-not-a-state-management-tool-and-why-it-doesnt-replace-redux/)
|
|
453
|
+
- [TestDouble — React Context for Dependency Injection](https://testdouble.com/insights/react-context-for-dependency-injection-not-state-management)
|
|
454
|
+
- [developerway — React State Management in 2025](https://www.developerway.com/posts/react-state-management-2025)
|
|
455
|
+
- [TkDodo — React Query and React Context](https://tkdodo.eu/blog/react-query-and-react-context)
|
|
456
|
+
- [React Official Docs — Managing State](https://react.dev/learn/managing-state)
|
package/commands/code-review.md
CHANGED
|
@@ -31,6 +31,7 @@ Task 도구를 통해 다음 전문 에이전트를 사용할 수 있습니다:
|
|
|
31
31
|
| `fundamentals-predictability` | Toss Fundamentals - 예측 가능성 (이름 충돌, 반환 타입 통일, 숨은 로직) | opus |
|
|
32
32
|
| `fundamentals-cohesion` | Toss Fundamentals - 응집도 (디렉토리 구조, 매직 넘버 관리, 폼 응집도) | opus |
|
|
33
33
|
| `fundamentals-coupling` | Toss Fundamentals - 결합도 (단일 책임, 중복 코드 허용, Props Drilling) | opus |
|
|
34
|
+
| `react-state-reviewer` | React 상태관리 (상태 성질 기반 배치, Context 오용, 5단계 에스컬레이터) | opus |
|
|
34
35
|
| `react-performance-optimizer` | React 리렌더, 메모이제이션, 훅 최적화 | opus |
|
|
35
36
|
| `react-principles-reviewer` | React 개발 원칙 (응집도/명시성, Props 관리, 네이밍, 부수효과, AsyncBoundary) | opus |
|
|
36
37
|
| `maintainable-code-reviewer` | 유지보수성 (UI-코드 1:1 대응, 분리의 4원칙, 추상화 원칙) | opus |
|
|
@@ -58,7 +59,7 @@ Skill은 사용자 설치에 따라 다르며 추가 리뷰 가이드라인/컨
|
|
|
58
59
|
|
|
59
60
|
| 옵션 | 이름 | 사용 에이전트 | 적합한 상황 |
|
|
60
61
|
|------|------|--------------|-------------|
|
|
61
|
-
| 1 | **전체 리뷰** | 모든
|
|
62
|
+
| 1 | **전체 리뷰** | 모든 11개 에이전트 병렬 실행 | 종합 코드 리뷰 (권장) |
|
|
62
63
|
| 2 | **커스텀** | 사용자가 직접 선택 | 특정 관점만 리뷰하고 싶을 때 |
|
|
63
64
|
|
|
64
65
|
3. **Skill 포함 여부 질문** (AskUserQuestion 사용)
|
|
@@ -191,6 +192,8 @@ Task(fundamentals-coupling): "src/components를 Toss Fundamentals 결합도 원
|
|
|
191
192
|
|
|
192
193
|
Task(refactor-analyzer): "src/components의 리팩토링 기회를 분석하세요. 코드 중복, 복잡성, 추상화 기회를 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
193
194
|
|
|
195
|
+
Task(react-state-reviewer): "src/components의 상태관리 패턴을 리뷰하세요. 상태 성질(수명/범위/빈도) 기반 도구 적절성, Context 오용, 5단계 에스컬레이터 준수, 서버/클라이언트 상태 분리를 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
196
|
+
|
|
194
197
|
Task(react-principles-reviewer): "src/components를 React 개발 원칙으로 리뷰하세요. 응집도/명시성 패턴, Props 관리, 네이밍 원칙, 부수효과 위치, AsyncBoundary 사용을 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
195
198
|
```
|
|
196
199
|
|
|
@@ -83,7 +83,8 @@ Task(Plan): "다음 설계를 구현하기 위한 계획을 수립하세요:
|
|
|
83
83
|
|
|
84
84
|
| 에이전트 | 검증 내용 |
|
|
85
85
|
|----------|----------|
|
|
86
|
-
| `react-
|
|
86
|
+
| `react-state-reviewer` | 상태 성질 기반 배치, Context 오용, 서버/클라이언트 상태 분리 검증 |
|
|
87
|
+
| `react-principles-reviewer` | 컴포넌트 구조, Props 설계, 부수효과 위치 검증 |
|
|
87
88
|
|
|
88
89
|
**React 프로젝트 감지 방법:**
|
|
89
90
|
```bash
|
|
@@ -118,9 +119,13 @@ Task(refactor-analyzer): "다음 구현 계획에서 추상화 기회를 분석
|
|
|
118
119
|
재사용 가능한 컴포넌트, 공통 유틸리티, 중복 제거 가능한 부분을 식별하세요."
|
|
119
120
|
|
|
120
121
|
// React 프로젝트면 추가
|
|
122
|
+
Task(react-state-reviewer): "다음 구현 계획의 상태관리 전략을 검증하세요:
|
|
123
|
+
[Plan 결과]
|
|
124
|
+
상태 성질(수명/범위/빈도) 기반 도구 선택, Context 사용 적절성, 5단계 에스컬레이터 준수, 서버/클라이언트 상태 분리를 검토하세요."
|
|
125
|
+
|
|
121
126
|
Task(react-principles-reviewer): "다음 구현 계획을 React 개발 원칙으로 검증하세요:
|
|
122
127
|
[Plan 결과]
|
|
123
|
-
컴포넌트 응집도, Props 설계,
|
|
128
|
+
컴포넌트 응집도, Props 설계, 부수효과 위치, AsyncBoundary를 검토하세요."
|
|
124
129
|
```
|
|
125
130
|
|
|
126
131
|
### 5. 결과 종합 및 최종 계획 생성
|
|
@@ -226,12 +231,19 @@ export function NewComponent({ ... }: Props) {
|
|
|
226
231
|
**재사용 제안:**
|
|
227
232
|
- [제안 1]
|
|
228
233
|
|
|
234
|
+
### react-state-reviewer 검증 (React 프로젝트)
|
|
235
|
+
| 원칙 | 상태 | 피드백 |
|
|
236
|
+
|------|------|--------|
|
|
237
|
+
| 상태 성질 분류 | ✅/🟡/🔴 | [피드백] |
|
|
238
|
+
| Context 사용 | ✅/🟡/🔴 | [피드백] |
|
|
239
|
+
| 서버/클라이언트 분리 | ✅/🟡/🔴 | [피드백] |
|
|
240
|
+
|
|
229
241
|
### react-principles-reviewer 검증 (React 프로젝트)
|
|
230
242
|
| 원칙 | 상태 | 피드백 |
|
|
231
243
|
|------|------|--------|
|
|
232
244
|
| 컴포넌트 응집도 | ✅/🟡/🔴 | [피드백] |
|
|
233
245
|
| Props 설계 | ✅/🟡/🔴 | [피드백] |
|
|
234
|
-
|
|
|
246
|
+
| 부수효과 위치 | ✅/🟡/🔴 | [피드백] |
|
|
235
247
|
|
|
236
248
|
---
|
|
237
249
|
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Toss Fundamentals 4개 에이전트 + React 상태관리 리뷰를 병렬 실행
|
|
3
|
+
allowed-tools: Task, Read, Glob, Grep
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Fundamentals + 상태관리 리뷰
|
|
7
|
+
|
|
8
|
+
Toss Frontend Fundamentals 4개 원칙(가독성, 예측 가능성, 응집도, 결합도)과 React 상태관리 패턴을 병렬로 분석하는 집중 리뷰 커맨드입니다.
|
|
9
|
+
|
|
10
|
+
## 컨텍스트 정보
|
|
11
|
+
|
|
12
|
+
**리뷰 대상 경로:**
|
|
13
|
+
!`echo "${1:-.}"`
|
|
14
|
+
|
|
15
|
+
**현재 git 상태:**
|
|
16
|
+
!`git status --short | head -20`
|
|
17
|
+
|
|
18
|
+
**React 프로젝트 감지:**
|
|
19
|
+
!`if [ -f "package.json" ] && grep -q '"react"' package.json 2>/dev/null; then echo "✅ React 프로젝트"; else echo "❌ React 프로젝트 아님"; fi`
|
|
20
|
+
|
|
21
|
+
## 사용 에이전트
|
|
22
|
+
|
|
23
|
+
| Agent | 초점 영역 | 실행 조건 |
|
|
24
|
+
|-------|----------|----------|
|
|
25
|
+
| `fundamentals-readability` | 가독성 (코드 분리, 추상화, 함수 쪼개기, 조건 네이밍, 매직 넘버, 시점 이동, 삼항 연산자, 비교 순서) | 항상 |
|
|
26
|
+
| `fundamentals-predictability` | 예측 가능성 (이름 충돌, 반환 타입 통일, 숨은 로직) | 항상 |
|
|
27
|
+
| `fundamentals-cohesion` | 응집도 (디렉토리 구조, 매직 넘버 관리, 폼 응집도) | 항상 |
|
|
28
|
+
| `fundamentals-coupling` | 결합도 (단일 책임, 중복 코드 허용, Props Drilling) | 항상 |
|
|
29
|
+
| `react-state-reviewer` | 상태관리 (상태 성질 기반 배치, Context 오용, 5단계 에스컬레이터) | React 프로젝트 |
|
|
30
|
+
|
|
31
|
+
## 작업 순서
|
|
32
|
+
|
|
33
|
+
1. **리뷰 범위 결정**
|
|
34
|
+
- **경로가 제공된 경우:** 해당 경로의 모든 파일을 리뷰
|
|
35
|
+
- **경로가 없는 경우:** 현재 작업 디렉토리 전체를 리뷰
|
|
36
|
+
|
|
37
|
+
> **중요:** git 변경사항에 제한하지 마세요. 대상 경로의 모든 파일을 리뷰합니다.
|
|
38
|
+
|
|
39
|
+
2. **React 프로젝트 여부 확인**
|
|
40
|
+
|
|
41
|
+
다음 중 하나라도 해당되면 React 프로젝트:
|
|
42
|
+
- package.json에 `react` 또는 `next` 의존성 존재
|
|
43
|
+
- `.tsx` 또는 `.jsx` 파일 존재
|
|
44
|
+
|
|
45
|
+
3. **에이전트 병렬 실행**
|
|
46
|
+
|
|
47
|
+
Fundamentals 4개는 항상 실행. React 프로젝트면 react-state-reviewer도 추가.
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
// 항상 실행 (4개 병렬)
|
|
51
|
+
Task(fundamentals-readability): "[path]를 가독성 원칙으로 분석하세요. 코드 분리, 추상화, 함수 쪼개기, 조건 네이밍, 매직 넘버, 시점 이동, 삼항 연산자, 비교 순서를 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
52
|
+
|
|
53
|
+
Task(fundamentals-predictability): "[path]를 예측 가능성 원칙으로 분석하세요. 이름 충돌, 반환 타입 통일, 숨은 로직을 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
54
|
+
|
|
55
|
+
Task(fundamentals-cohesion): "[path]를 응집도 원칙으로 분석하세요. 디렉토리 구조, 매직 넘버 관리, 폼 응집도를 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
56
|
+
|
|
57
|
+
Task(fundamentals-coupling): "[path]를 결합도 원칙으로 분석하세요. 단일 책임, 중복 코드 허용, Props Drilling을 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
58
|
+
|
|
59
|
+
// React 프로젝트면 추가
|
|
60
|
+
Task(react-state-reviewer): "[path]의 상태관리 패턴을 리뷰하세요. 상태 성질(수명/범위/빈도) 기반 도구 적절성, Context 오용, 5단계 에스컬레이터 준수, 서버/클라이언트 상태 분리를 확인하세요. file:line 참조와 함께 발견사항을 반환하세요."
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
4. **결과 집계 및 종합**
|
|
64
|
+
- 모든 에이전트 완료 대기
|
|
65
|
+
- 발견사항을 통합 리포트로 결합
|
|
66
|
+
- 중복 발견사항 제거
|
|
67
|
+
- 심각도와 영향도로 우선순위 정렬
|
|
68
|
+
|
|
69
|
+
## 출력 형식
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
# Fundamentals + 상태관리 리뷰 결과
|
|
73
|
+
|
|
74
|
+
## 요약
|
|
75
|
+
- **리뷰 대상:** [path]
|
|
76
|
+
- **실행된 에이전트:** [list]
|
|
77
|
+
- **총 발견 사항:** N개 (Critical: X, Recommended Improvements: Y, Best Practices Found: Z)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Critical Issues (즉시 수정 필요)
|
|
82
|
+
|
|
83
|
+
### 1. [Issue Title]
|
|
84
|
+
- **발견 에이전트:** [agent name]
|
|
85
|
+
- **위반 원칙:** [principle]
|
|
86
|
+
- **위치:** [file:line]
|
|
87
|
+
- **문제:** [description]
|
|
88
|
+
- **현재 코드:**
|
|
89
|
+
```typescript
|
|
90
|
+
// 문제 코드
|
|
91
|
+
```
|
|
92
|
+
- **수정 방법:**
|
|
93
|
+
```typescript
|
|
94
|
+
// 개선 코드
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Recommended Improvements (권장 개선)
|
|
100
|
+
|
|
101
|
+
[같은 형식]
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Best Practices Found (잘하고 있음)
|
|
106
|
+
|
|
107
|
+
- [Good practice 1] - [file:line] (에이전트)
|
|
108
|
+
- [Good practice 2] - [file:line] (에이전트)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 에이전트별 상세 결과
|
|
113
|
+
|
|
114
|
+
### Fundamentals - 가독성
|
|
115
|
+
[발견사항 요약]
|
|
116
|
+
|
|
117
|
+
### Fundamentals - 예측 가능성
|
|
118
|
+
[발견사항 요약]
|
|
119
|
+
|
|
120
|
+
### Fundamentals - 응집도
|
|
121
|
+
[발견사항 요약]
|
|
122
|
+
|
|
123
|
+
### Fundamentals - 결합도
|
|
124
|
+
[발견사항 요약]
|
|
125
|
+
|
|
126
|
+
### React 상태관리 (React 프로젝트만)
|
|
127
|
+
[발견사항 요약]
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Metrics
|
|
132
|
+
|
|
133
|
+
### 원칙별 현황
|
|
134
|
+
|
|
135
|
+
| 원칙 | Critical | Recommended | Best Practices |
|
|
136
|
+
|------|----------|-------------|----------------|
|
|
137
|
+
| 가독성 | N | N | N |
|
|
138
|
+
| 예측 가능성 | N | N | N |
|
|
139
|
+
| 응집도 | N | N | N |
|
|
140
|
+
| 결합도 | N | N | N |
|
|
141
|
+
| 상태관리 | N | N | N |
|
|
142
|
+
|
|
143
|
+
### 상태 배치 현황 (React 프로젝트만)
|
|
144
|
+
|
|
145
|
+
| 카테고리 | 개수 | 적절 | 부적절 |
|
|
146
|
+
|----------|------|------|--------|
|
|
147
|
+
| useState | N | N | N |
|
|
148
|
+
| Context API | N | N | N |
|
|
149
|
+
| 전역 스토어 | N | N | N |
|
|
150
|
+
| 서버 상태 | N | N | N |
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 사용 예시
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# 전체 프로젝트 리뷰
|
|
157
|
+
/fundamentals-review
|
|
158
|
+
|
|
159
|
+
# 특정 경로 리뷰
|
|
160
|
+
/fundamentals-review src/components
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 중요 사항
|
|
164
|
+
|
|
165
|
+
- **병렬 실행** - 5개 에이전트를 동시에 실행하여 빠르게 분석
|
|
166
|
+
- **React 자동 감지** - React 프로젝트가 아니면 상태관리 리뷰 생략
|
|
167
|
+
- **file:line 참조 보존** - 실행 가능한 피드백을 위해 필수
|
|
168
|
+
- **한국어 출력** - 최종 리포트는 한국어로
|
|
169
|
+
- **AI attribution 금지** - "Generated by AI" footer 추가 금지
|
|
170
|
+
- **결과 파일 저장** - 최종 리포트를 `fundamentals-review.md` 파일로 저장 (이미 존재하면 `---` 구분선과 함께 하단에 추가)
|
package/commands/review-pr.md
CHANGED
|
@@ -25,6 +25,7 @@ Task 도구를 통해 다음 전문 에이전트를 사용할 수 있습니다:
|
|
|
25
25
|
| `fundamentals-coupling` | Toss Fundamentals - 결합도 |
|
|
26
26
|
| `refactor-analyzer` | 코드 중복, 복잡성, 추상화 기회, 코드 스멜 |
|
|
27
27
|
| `junior-checker` | 주니어 개발자 관점 가독성, 네이밍, 복잡도 |
|
|
28
|
+
| `react-state-reviewer` | React 상태관리 (상태 성질 기반 배치, Context 오용, 5단계 에스컬레이터) |
|
|
28
29
|
| `react-performance-optimizer` | React 리렌더, 메모이제이션, 훅 최적화 |
|
|
29
30
|
| `react-principles-reviewer` | React 개발 원칙 (응집도/명시성, Props 관리, 네이밍, 부수효과, AsyncBoundary) |
|
|
30
31
|
| `maintainable-code-reviewer` | 유지보수성 (UI-코드 1:1 대응, 분리의 4원칙, 추상화 원칙) |
|
|
@@ -142,6 +143,16 @@ Skill은 사용자 설치에 따라 다르며 추가 리뷰 가이드라인/컨
|
|
|
142
143
|
[리뷰 관점]
|
|
143
144
|
네이밍, 함수 복잡도, 주석, 구조, 타입, 학습 곡선"
|
|
144
145
|
|
|
146
|
+
Task(react-state-reviewer): "PR #<PR번호>의 상태관리 패턴을 리뷰해주세요.
|
|
147
|
+
|
|
148
|
+
[작업 순서]
|
|
149
|
+
1. `gh pr view <PR번호>`로 PR 정보 확인
|
|
150
|
+
2. `gh pr diff <PR번호>`로 전체 변경사항 확인
|
|
151
|
+
3. 필요 시 관련 파일 Read
|
|
152
|
+
|
|
153
|
+
[리뷰 관점]
|
|
154
|
+
상태 성질(수명/범위/빈도) 기반 배치 적절성, Context 오용, 5단계 에스컬레이터 준수, 서버/클라이언트 상태 분리"
|
|
155
|
+
|
|
145
156
|
Task(react-performance-optimizer): "PR #<PR번호>에서 React 성능 이슈를 찾아주세요.
|
|
146
157
|
|
|
147
158
|
[작업 순서]
|
package/docs/BUILDER_GUIDE.md
CHANGED
|
@@ -54,6 +54,7 @@ Builder가 자동으로:
|
|
|
54
54
|
| `fundamentals-predictability` | Toss Fundamentals - 예측 가능성 |
|
|
55
55
|
| `fundamentals-cohesion` | Toss Fundamentals - 응집도 |
|
|
56
56
|
| `fundamentals-coupling` | Toss Fundamentals - 결합도 |
|
|
57
|
+
| `react-state-reviewer` | React 상태관리 (상태 성질 기반 배치, Context, 전역 상태) |
|
|
57
58
|
| `react-performance-optimizer` | React 성능 최적화 |
|
|
58
59
|
| `react-principles-reviewer` | React 개발 원칙 (응집도/명시성, Props 관리, 네이밍, 부수효과) |
|
|
59
60
|
| `maintainable-code-reviewer` | 유지보수성 (UI-코드 1:1 대응, 분리의 4원칙) |
|