bitbucket-gemini-action 1.0.0
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/.claude/settings.local.json +8 -0
- package/.prettierrc +8 -0
- package/CLAUDE.md +150 -0
- package/README.md +375 -0
- package/bitbucket-pipelines.yml +95 -0
- package/bun.lock +227 -0
- package/dist/prepare.js +7111 -0
- package/examples/bitbucket-pipelines-full.yml +157 -0
- package/examples/bitbucket-pipelines-minimal.yml +22 -0
- package/package.json +33 -0
- package/src/bitbucket/api/client.ts +406 -0
- package/src/bitbucket/context.ts +196 -0
- package/src/bitbucket/data/fetcher.ts +195 -0
- package/src/bitbucket/data/formatter.ts +221 -0
- package/src/bitbucket/operations/comments.ts +236 -0
- package/src/bitbucket/types.ts +262 -0
- package/src/bitbucket/validation/permissions.ts +154 -0
- package/src/bitbucket/validation/trigger.ts +175 -0
- package/src/entrypoints/execute.ts +349 -0
- package/src/entrypoints/prepare.ts +216 -0
- package/src/gemini/client.ts +263 -0
- package/src/gemini/presets.ts +2130 -0
- package/src/gemini/prompts.ts +331 -0
- package/src/gemini/tools.ts +226 -0
- package/src/index.ts +71 -0
- package/src/modes/agent/index.ts +119 -0
- package/src/modes/registry.ts +118 -0
- package/src/modes/tag/index.ts +172 -0
- package/src/modes/types.ts +95 -0
- package/src/utils/env.ts +190 -0
- package/src/utils/retry.ts +149 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,2130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review Presets
|
|
3
|
+
* Predefined review configurations for different contexts, experience levels, and frameworks
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface ReviewPreset {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
tags: string[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type PresetCategory =
|
|
14
|
+
| "experience"
|
|
15
|
+
| "perspective"
|
|
16
|
+
| "framework"
|
|
17
|
+
| "domain"
|
|
18
|
+
| "language"
|
|
19
|
+
| "quality"
|
|
20
|
+
| "ai";
|
|
21
|
+
|
|
22
|
+
export interface PresetRegistry {
|
|
23
|
+
[key: string]: ReviewPreset;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Experience Level Presets
|
|
28
|
+
* 개발자 경험 수준별 리뷰
|
|
29
|
+
*/
|
|
30
|
+
export const EXPERIENCE_PRESETS: PresetRegistry = {
|
|
31
|
+
junior: {
|
|
32
|
+
name: "주니어 개발자용",
|
|
33
|
+
description: "초보 개발자가 성장할 수 있도록 친절하고 교육적인 리뷰",
|
|
34
|
+
tags: ["experience", "beginner"],
|
|
35
|
+
prompt: `주니어 개발자를 위한 교육적인 코드 리뷰를 제공해주세요:
|
|
36
|
+
|
|
37
|
+
## 리뷰 스타일
|
|
38
|
+
- 친절하고 격려하는 톤 사용
|
|
39
|
+
- 모든 피드백에 "왜"를 설명
|
|
40
|
+
- 기본 개념이 부족해 보이면 간단히 설명 추가
|
|
41
|
+
- 좋은 부분도 칭찬하여 자신감 부여
|
|
42
|
+
|
|
43
|
+
## 중점 검토 사항
|
|
44
|
+
1. **기본기 확인**
|
|
45
|
+
- 변수/함수 네이밍이 명확한가?
|
|
46
|
+
- 코드 가독성이 좋은가?
|
|
47
|
+
- 주석이 적절한가?
|
|
48
|
+
|
|
49
|
+
2. **일반적인 실수 체크**
|
|
50
|
+
- null/undefined 처리
|
|
51
|
+
- 에러 핸들링 누락
|
|
52
|
+
- 하드코딩된 값
|
|
53
|
+
- 중복 코드
|
|
54
|
+
|
|
55
|
+
3. **학습 기회 제공**
|
|
56
|
+
- 더 나은 패턴 소개 (이유와 함께)
|
|
57
|
+
- 관련 문서/자료 링크 제안
|
|
58
|
+
- 단계별 개선 방법 제시
|
|
59
|
+
|
|
60
|
+
## 피드백 형식
|
|
61
|
+
- ✅ 잘한 점: [구체적 칭찬]
|
|
62
|
+
- 📚 학습 포인트: [개념 설명 + 개선 방향]
|
|
63
|
+
- 💡 팁: [실무에서 유용한 조언]`,
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
middle: {
|
|
67
|
+
name: "미들급 개발자용",
|
|
68
|
+
description: "중급 개발자의 성장을 위한 심화 리뷰",
|
|
69
|
+
tags: ["experience", "intermediate"],
|
|
70
|
+
prompt: `중급 개발자를 위한 심화 코드 리뷰를 제공해주세요:
|
|
71
|
+
|
|
72
|
+
## 리뷰 스타일
|
|
73
|
+
- 동등한 개발자로서 토론하는 톤
|
|
74
|
+
- 트레이드오프 관점에서 분석
|
|
75
|
+
- 대안 제시 시 각각의 장단점 설명
|
|
76
|
+
|
|
77
|
+
## 중점 검토 사항
|
|
78
|
+
1. **설계 패턴 및 원칙**
|
|
79
|
+
- SOLID 원칙 준수 여부
|
|
80
|
+
- 적절한 디자인 패턴 사용
|
|
81
|
+
- 의존성 관리 및 결합도
|
|
82
|
+
|
|
83
|
+
2. **코드 품질 심화**
|
|
84
|
+
- 테스트 용이성 (Testability)
|
|
85
|
+
- 확장성 고려
|
|
86
|
+
- 재사용 가능성
|
|
87
|
+
|
|
88
|
+
3. **성능 및 최적화**
|
|
89
|
+
- 알고리즘 복잡도
|
|
90
|
+
- 메모리 사용 패턴
|
|
91
|
+
- 불필요한 연산 제거
|
|
92
|
+
|
|
93
|
+
4. **실무 관점**
|
|
94
|
+
- 유지보수성
|
|
95
|
+
- 팀 협업 시 가독성
|
|
96
|
+
- 문서화 필요성
|
|
97
|
+
|
|
98
|
+
## 피드백 형식
|
|
99
|
+
- 🔍 분석: [현재 코드의 특성]
|
|
100
|
+
- 🎯 제안: [개선 방향 + 이유]
|
|
101
|
+
- ⚖️ 트레이드오프: [대안들의 장단점]`,
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
senior: {
|
|
105
|
+
name: "시니어 개발자용",
|
|
106
|
+
description: "고급 아키텍처 및 전략적 관점의 리뷰",
|
|
107
|
+
tags: ["experience", "advanced"],
|
|
108
|
+
prompt: `시니어 개발자를 위한 고급 코드 리뷰를 제공해주세요:
|
|
109
|
+
|
|
110
|
+
## 리뷰 스타일
|
|
111
|
+
- 간결하고 핵심적인 피드백
|
|
112
|
+
- 아키텍처 수준의 인사이트
|
|
113
|
+
- 장기적 관점의 제안
|
|
114
|
+
|
|
115
|
+
## 중점 검토 사항
|
|
116
|
+
1. **아키텍처 영향도**
|
|
117
|
+
- 시스템 전체에 미치는 영향
|
|
118
|
+
- 기존 아키텍처와의 일관성
|
|
119
|
+
- 기술 부채 발생 가능성
|
|
120
|
+
|
|
121
|
+
2. **확장성 및 유연성**
|
|
122
|
+
- 향후 요구사항 변경 대응력
|
|
123
|
+
- 모듈화 및 경계 설정
|
|
124
|
+
- 인터페이스 설계
|
|
125
|
+
|
|
126
|
+
3. **운영 관점**
|
|
127
|
+
- 모니터링/로깅 적절성
|
|
128
|
+
- 장애 복구 고려
|
|
129
|
+
- 배포 전략 영향
|
|
130
|
+
|
|
131
|
+
4. **팀/조직 영향**
|
|
132
|
+
- 코드 컨벤션 준수
|
|
133
|
+
- 온보딩 용이성
|
|
134
|
+
- 지식 공유 관점
|
|
135
|
+
|
|
136
|
+
## 피드백 형식
|
|
137
|
+
- 🏗️ 아키텍처: [시스템 관점 분석]
|
|
138
|
+
- ⚠️ 리스크: [잠재적 문제점]
|
|
139
|
+
- 🚀 전략: [장기적 개선 방향]`,
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
lead: {
|
|
143
|
+
name: "테크 리드용",
|
|
144
|
+
description: "팀 리딩 관점의 전략적 리뷰",
|
|
145
|
+
tags: ["experience", "leadership"],
|
|
146
|
+
prompt: `테크 리드 관점의 전략적 코드 리뷰를 제공해주세요:
|
|
147
|
+
|
|
148
|
+
## 리뷰 스타일
|
|
149
|
+
- 팀 전체 관점에서 분석
|
|
150
|
+
- 멘토링 기회 식별
|
|
151
|
+
- 프로세스 개선점 도출
|
|
152
|
+
|
|
153
|
+
## 중점 검토 사항
|
|
154
|
+
1. **팀 역량 관점**
|
|
155
|
+
- 주니어 멤버 학습 기회
|
|
156
|
+
- 코드 리뷰 문화 개선점
|
|
157
|
+
- 페어 프로그래밍 필요성
|
|
158
|
+
|
|
159
|
+
2. **표준화 및 일관성**
|
|
160
|
+
- 팀 컨벤션 준수
|
|
161
|
+
- 공통 패턴 적용
|
|
162
|
+
- 문서화 표준
|
|
163
|
+
|
|
164
|
+
3. **기술 부채 관리**
|
|
165
|
+
- 즉시 수정 필요 사항
|
|
166
|
+
- 백로그 등록 필요 사항
|
|
167
|
+
- 리팩토링 계획 제안
|
|
168
|
+
|
|
169
|
+
4. **프로젝트 영향**
|
|
170
|
+
- 일정 영향도
|
|
171
|
+
- 리스크 평가
|
|
172
|
+
- 다른 팀과의 인터페이스`,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Perspective Presets
|
|
178
|
+
* 리뷰 관점별 프리셋
|
|
179
|
+
*/
|
|
180
|
+
export const PERSPECTIVE_PRESETS: PresetRegistry = {
|
|
181
|
+
architecture: {
|
|
182
|
+
name: "아키텍처/설계",
|
|
183
|
+
description: "소프트웨어 설계 및 아키텍처 관점 리뷰",
|
|
184
|
+
tags: ["perspective", "design"],
|
|
185
|
+
prompt: `소프트웨어 아키텍처 관점에서 코드를 리뷰해주세요:
|
|
186
|
+
|
|
187
|
+
## 검토 항목
|
|
188
|
+
|
|
189
|
+
### 1. 설계 원칙
|
|
190
|
+
- **SOLID 원칙**
|
|
191
|
+
- Single Responsibility: 클래스/함수의 단일 책임
|
|
192
|
+
- Open/Closed: 확장에 열림, 수정에 닫힘
|
|
193
|
+
- Liskov Substitution: 하위 타입 치환 가능성
|
|
194
|
+
- Interface Segregation: 인터페이스 분리
|
|
195
|
+
- Dependency Inversion: 의존성 역전
|
|
196
|
+
|
|
197
|
+
- **기타 원칙**
|
|
198
|
+
- DRY (Don't Repeat Yourself)
|
|
199
|
+
- KISS (Keep It Simple, Stupid)
|
|
200
|
+
- YAGNI (You Ain't Gonna Need It)
|
|
201
|
+
|
|
202
|
+
### 2. 아키텍처 패턴
|
|
203
|
+
- 레이어 분리 적절성
|
|
204
|
+
- 도메인 모델 설계
|
|
205
|
+
- 의존성 방향 (안쪽으로 향하는지)
|
|
206
|
+
- 경계 컨텍스트 식별
|
|
207
|
+
|
|
208
|
+
### 3. 모듈화
|
|
209
|
+
- 응집도 (Cohesion) - 높을수록 좋음
|
|
210
|
+
- 결합도 (Coupling) - 낮을수록 좋음
|
|
211
|
+
- 인터페이스 정의
|
|
212
|
+
- 캡슐화 수준
|
|
213
|
+
|
|
214
|
+
### 4. 확장 포인트
|
|
215
|
+
- 플러그인/확장 가능한 구조
|
|
216
|
+
- 설정의 외부화
|
|
217
|
+
- 전략 패턴 적용 가능성`,
|
|
218
|
+
},
|
|
219
|
+
|
|
220
|
+
security: {
|
|
221
|
+
name: "보안",
|
|
222
|
+
description: "보안 취약점 및 안전한 코딩 관점 리뷰",
|
|
223
|
+
tags: ["perspective", "security"],
|
|
224
|
+
prompt: `보안 관점에서 코드를 철저히 리뷰해주세요:
|
|
225
|
+
|
|
226
|
+
## 검토 항목
|
|
227
|
+
|
|
228
|
+
### 1. 입력 검증
|
|
229
|
+
- 모든 사용자 입력 검증 여부
|
|
230
|
+
- 화이트리스트 vs 블랙리스트 접근
|
|
231
|
+
- 입력 길이/형식 제한
|
|
232
|
+
- 파일 업로드 검증
|
|
233
|
+
|
|
234
|
+
### 2. 인젝션 공격
|
|
235
|
+
- **SQL Injection**: 파라미터화된 쿼리 사용
|
|
236
|
+
- **XSS**: 출력 인코딩, CSP 헤더
|
|
237
|
+
- **Command Injection**: 셸 명령 실행 검증
|
|
238
|
+
- **LDAP/XML Injection**: 특수문자 처리
|
|
239
|
+
|
|
240
|
+
### 3. 인증/인가
|
|
241
|
+
- 인증 로직 우회 가능성
|
|
242
|
+
- 권한 검사 누락
|
|
243
|
+
- 세션 관리 취약점
|
|
244
|
+
- JWT/토큰 처리 안전성
|
|
245
|
+
|
|
246
|
+
### 4. 민감 데이터
|
|
247
|
+
- 비밀번호 평문 저장 여부
|
|
248
|
+
- API 키/시크릿 노출
|
|
249
|
+
- 로그에 민감정보 출력
|
|
250
|
+
- 암호화 적절성 (알고리즘, 키 관리)
|
|
251
|
+
|
|
252
|
+
### 5. 기타 보안
|
|
253
|
+
- CSRF 방어
|
|
254
|
+
- 안전하지 않은 직접 객체 참조 (IDOR)
|
|
255
|
+
- 레이스 컨디션
|
|
256
|
+
- 에러 메시지 정보 노출
|
|
257
|
+
|
|
258
|
+
## 심각도 표시
|
|
259
|
+
- 🔴 Critical: 즉시 수정 필요
|
|
260
|
+
- 🟠 High: 배포 전 수정 필요
|
|
261
|
+
- 🟡 Medium: 조속한 수정 권장
|
|
262
|
+
- 🟢 Low: 개선 권장`,
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
performance: {
|
|
266
|
+
name: "성능",
|
|
267
|
+
description: "성능 최적화 관점 리뷰",
|
|
268
|
+
tags: ["perspective", "optimization"],
|
|
269
|
+
prompt: `성능 최적화 관점에서 코드를 리뷰해주세요:
|
|
270
|
+
|
|
271
|
+
## 검토 항목
|
|
272
|
+
|
|
273
|
+
### 1. 알고리즘 복잡도
|
|
274
|
+
- 시간 복잡도 (Big O)
|
|
275
|
+
- 공간 복잡도
|
|
276
|
+
- 더 효율적인 알고리즘 존재 여부
|
|
277
|
+
- 불필요한 반복/재계산
|
|
278
|
+
|
|
279
|
+
### 2. 데이터베이스
|
|
280
|
+
- **N+1 쿼리 문제**
|
|
281
|
+
- 인덱스 활용 여부
|
|
282
|
+
- 불필요한 SELECT *
|
|
283
|
+
- 트랜잭션 범위 적절성
|
|
284
|
+
- 커넥션 풀 관리
|
|
285
|
+
|
|
286
|
+
### 3. 메모리 관리
|
|
287
|
+
- 메모리 누수 가능성
|
|
288
|
+
- 대용량 데이터 처리 방식
|
|
289
|
+
- 객체 생성 최소화
|
|
290
|
+
- 캐싱 전략
|
|
291
|
+
|
|
292
|
+
### 4. 네트워크
|
|
293
|
+
- API 호출 최소화
|
|
294
|
+
- 배치 처리 가능성
|
|
295
|
+
- 압축 사용
|
|
296
|
+
- 연결 재사용
|
|
297
|
+
|
|
298
|
+
### 5. 비동기 처리
|
|
299
|
+
- 블로킹 코드 식별
|
|
300
|
+
- 병렬 처리 가능성
|
|
301
|
+
- 적절한 타임아웃 설정
|
|
302
|
+
- 백프레셔 처리
|
|
303
|
+
|
|
304
|
+
### 6. 프론트엔드 (해당 시)
|
|
305
|
+
- 번들 사이즈
|
|
306
|
+
- 레이지 로딩
|
|
307
|
+
- 메모이제이션
|
|
308
|
+
- 리렌더링 최소화`,
|
|
309
|
+
},
|
|
310
|
+
|
|
311
|
+
testing: {
|
|
312
|
+
name: "테스트",
|
|
313
|
+
description: "테스트 품질 및 전략 관점 리뷰",
|
|
314
|
+
tags: ["perspective", "quality"],
|
|
315
|
+
prompt: `테스트 관점에서 코드를 리뷰해주세요:
|
|
316
|
+
|
|
317
|
+
## 검토 항목
|
|
318
|
+
|
|
319
|
+
### 1. 테스트 커버리지
|
|
320
|
+
- 핵심 로직 테스트 여부
|
|
321
|
+
- 엣지 케이스 커버
|
|
322
|
+
- 에러 케이스 테스트
|
|
323
|
+
- 경계값 테스트
|
|
324
|
+
|
|
325
|
+
### 2. 테스트 품질
|
|
326
|
+
- **AAA 패턴**: Arrange, Act, Assert
|
|
327
|
+
- 테스트 독립성
|
|
328
|
+
- 테스트 가독성
|
|
329
|
+
- 테스트 이름의 명확성
|
|
330
|
+
|
|
331
|
+
### 3. 테스트 유형
|
|
332
|
+
- 단위 테스트 적절성
|
|
333
|
+
- 통합 테스트 필요성
|
|
334
|
+
- E2E 테스트 시나리오
|
|
335
|
+
- 스냅샷 테스트 (UI)
|
|
336
|
+
|
|
337
|
+
### 4. 모킹 전략
|
|
338
|
+
- 적절한 모킹 수준
|
|
339
|
+
- 과도한 모킹 여부
|
|
340
|
+
- 테스트 더블 사용 (Stub, Mock, Spy)
|
|
341
|
+
- 외부 의존성 격리
|
|
342
|
+
|
|
343
|
+
### 5. 테스트 유지보수
|
|
344
|
+
- 테스트 코드 중복
|
|
345
|
+
- 테스트 헬퍼/유틸리티
|
|
346
|
+
- 픽스처 관리
|
|
347
|
+
- 테스트 데이터 관리
|
|
348
|
+
|
|
349
|
+
### 6. 테스트 가능성
|
|
350
|
+
- 코드의 테스트 용이성
|
|
351
|
+
- 의존성 주입 활용
|
|
352
|
+
- 순수 함수 분리`,
|
|
353
|
+
},
|
|
354
|
+
|
|
355
|
+
accessibility: {
|
|
356
|
+
name: "접근성 (a11y)",
|
|
357
|
+
description: "웹 접근성 관점 리뷰",
|
|
358
|
+
tags: ["perspective", "a11y", "frontend"],
|
|
359
|
+
prompt: `웹 접근성(a11y) 관점에서 코드를 리뷰해주세요:
|
|
360
|
+
|
|
361
|
+
## 검토 항목
|
|
362
|
+
|
|
363
|
+
### 1. 시맨틱 HTML
|
|
364
|
+
- 적절한 HTML 태그 사용
|
|
365
|
+
- 헤딩 계층 구조
|
|
366
|
+
- 랜드마크 영역 (header, nav, main, footer)
|
|
367
|
+
- 리스트/테이블 구조
|
|
368
|
+
|
|
369
|
+
### 2. ARIA
|
|
370
|
+
- aria-label, aria-labelledby 사용
|
|
371
|
+
- aria-live 영역 (동적 콘텐츠)
|
|
372
|
+
- role 속성 적절성
|
|
373
|
+
- aria-hidden 처리
|
|
374
|
+
|
|
375
|
+
### 3. 키보드 접근성
|
|
376
|
+
- 모든 인터랙티브 요소 키보드 접근 가능
|
|
377
|
+
- 포커스 순서 논리적
|
|
378
|
+
- 포커스 표시 visible
|
|
379
|
+
- 키보드 트랩 방지
|
|
380
|
+
|
|
381
|
+
### 4. 시각적 접근성
|
|
382
|
+
- 색상 대비 (WCAG 기준)
|
|
383
|
+
- 색상만으로 정보 전달 X
|
|
384
|
+
- 텍스트 크기 조절 가능
|
|
385
|
+
- 애니메이션 제어 (prefers-reduced-motion)
|
|
386
|
+
|
|
387
|
+
### 5. 폼 접근성
|
|
388
|
+
- label과 input 연결
|
|
389
|
+
- 에러 메시지 명확
|
|
390
|
+
- 필수 필드 표시
|
|
391
|
+
- 자동완성 속성
|
|
392
|
+
|
|
393
|
+
### 6. 이미지/미디어
|
|
394
|
+
- alt 텍스트 적절성
|
|
395
|
+
- 장식 이미지 처리
|
|
396
|
+
- 비디오 자막
|
|
397
|
+
- 오디오 대체 텍스트`,
|
|
398
|
+
},
|
|
399
|
+
|
|
400
|
+
errorHandling: {
|
|
401
|
+
name: "에러 핸들링",
|
|
402
|
+
description: "에러 처리 및 예외 관리 관점 리뷰",
|
|
403
|
+
tags: ["perspective", "reliability"],
|
|
404
|
+
prompt: `에러 핸들링 관점에서 코드를 리뷰해주세요:
|
|
405
|
+
|
|
406
|
+
## 검토 항목
|
|
407
|
+
|
|
408
|
+
### 1. 예외 처리 기본
|
|
409
|
+
- try-catch 적절한 범위
|
|
410
|
+
- 구체적인 예외 타입 사용
|
|
411
|
+
- 빈 catch 블록 금지
|
|
412
|
+
- finally 블록 활용
|
|
413
|
+
|
|
414
|
+
### 2. 에러 전파
|
|
415
|
+
- 에러 래핑 및 컨텍스트 추가
|
|
416
|
+
- 에러 체이닝
|
|
417
|
+
- 적절한 추상화 수준의 에러
|
|
418
|
+
- 호출자에게 유용한 정보 제공
|
|
419
|
+
|
|
420
|
+
### 3. 사용자 피드백
|
|
421
|
+
- 사용자 친화적 에러 메시지
|
|
422
|
+
- 기술적 세부사항 숨김
|
|
423
|
+
- 복구 방법 안내
|
|
424
|
+
- 일관된 에러 형식
|
|
425
|
+
|
|
426
|
+
### 4. 로깅 및 모니터링
|
|
427
|
+
- 적절한 로그 레벨
|
|
428
|
+
- 에러 컨텍스트 로깅
|
|
429
|
+
- 스택 트레이스 보존
|
|
430
|
+
- 알림 설정 고려
|
|
431
|
+
|
|
432
|
+
### 5. 복구 전략
|
|
433
|
+
- 재시도 로직
|
|
434
|
+
- 폴백 메커니즘
|
|
435
|
+
- 서킷 브레이커 패턴
|
|
436
|
+
- 그레이스풀 디그레이데이션
|
|
437
|
+
|
|
438
|
+
### 6. 비동기 에러
|
|
439
|
+
- Promise rejection 처리
|
|
440
|
+
- async/await 에러 처리
|
|
441
|
+
- 이벤트 에러 핸들링
|
|
442
|
+
- 스트림 에러 처리`,
|
|
443
|
+
},
|
|
444
|
+
|
|
445
|
+
codeStyle: {
|
|
446
|
+
name: "코드 스타일/컨벤션",
|
|
447
|
+
description: "코드 스타일 및 일관성 관점 리뷰",
|
|
448
|
+
tags: ["perspective", "style"],
|
|
449
|
+
prompt: `코드 스타일과 컨벤션 관점에서 리뷰해주세요:
|
|
450
|
+
|
|
451
|
+
## 검토 항목
|
|
452
|
+
|
|
453
|
+
### 1. 네이밍
|
|
454
|
+
- 변수/함수/클래스 이름의 명확성
|
|
455
|
+
- 일관된 네이밍 컨벤션 (camelCase, PascalCase 등)
|
|
456
|
+
- 축약어 사용 최소화
|
|
457
|
+
- 의미 있는 이름 사용
|
|
458
|
+
|
|
459
|
+
### 2. 코드 구조
|
|
460
|
+
- 함수 길이 (20-30줄 이하 권장)
|
|
461
|
+
- 파일 길이 적절성
|
|
462
|
+
- 들여쓰기 일관성
|
|
463
|
+
- 빈 줄 사용으로 논리적 분리
|
|
464
|
+
|
|
465
|
+
### 3. 주석
|
|
466
|
+
- 필요한 곳에 주석 존재
|
|
467
|
+
- 불필요한 주석 제거
|
|
468
|
+
- TODO/FIXME 적절한 사용
|
|
469
|
+
- JSDoc/TSDoc 문서화
|
|
470
|
+
|
|
471
|
+
### 4. 가독성
|
|
472
|
+
- 복잡한 조건문 단순화
|
|
473
|
+
- 매직 넘버 상수화
|
|
474
|
+
- 깊은 중첩 피하기
|
|
475
|
+
- Early return 패턴
|
|
476
|
+
|
|
477
|
+
### 5. 일관성
|
|
478
|
+
- 팀 컨벤션 준수
|
|
479
|
+
- 기존 코드베이스와 일관성
|
|
480
|
+
- import 순서
|
|
481
|
+
- 파일 구조`,
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Framework Presets
|
|
487
|
+
* 프레임워크별 프리셋
|
|
488
|
+
*/
|
|
489
|
+
export const FRAMEWORK_PRESETS: PresetRegistry = {
|
|
490
|
+
react: {
|
|
491
|
+
name: "React",
|
|
492
|
+
description: "React 베스트 프랙티스 기반 리뷰",
|
|
493
|
+
tags: ["framework", "frontend", "react"],
|
|
494
|
+
prompt: `React 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
495
|
+
|
|
496
|
+
## 검토 항목
|
|
497
|
+
|
|
498
|
+
### 1. 컴포넌트 설계
|
|
499
|
+
- 단일 책임 원칙
|
|
500
|
+
- 컴포넌트 크기 적절성
|
|
501
|
+
- Presentational vs Container 분리
|
|
502
|
+
- 합성(Composition) 활용
|
|
503
|
+
|
|
504
|
+
### 2. Hooks 사용
|
|
505
|
+
- **useState**: 적절한 상태 분리
|
|
506
|
+
- **useEffect**: 의존성 배열 정확성, 클린업 함수
|
|
507
|
+
- **useMemo/useCallback**: 필요한 곳에만 사용
|
|
508
|
+
- **useRef**: DOM 접근 vs 값 저장 구분
|
|
509
|
+
- 커스텀 훅 추출 기회
|
|
510
|
+
|
|
511
|
+
### 3. 상태 관리
|
|
512
|
+
- 로컬 vs 전역 상태 구분
|
|
513
|
+
- 상태 끌어올리기 적절성
|
|
514
|
+
- 불필요한 상태 제거
|
|
515
|
+
- 파생 상태 계산
|
|
516
|
+
|
|
517
|
+
### 4. 성능 최적화
|
|
518
|
+
- 불필요한 리렌더링 방지
|
|
519
|
+
- React.memo 적절한 사용
|
|
520
|
+
- 키(key) 올바른 사용
|
|
521
|
+
- 코드 스플리팅
|
|
522
|
+
|
|
523
|
+
### 5. 패턴
|
|
524
|
+
- Controlled vs Uncontrolled 컴포넌트
|
|
525
|
+
- Render Props / HOC / Hooks 선택
|
|
526
|
+
- Error Boundary 사용
|
|
527
|
+
- Suspense 활용
|
|
528
|
+
|
|
529
|
+
### 6. TypeScript (해당 시)
|
|
530
|
+
- Props 타입 정의
|
|
531
|
+
- 제네릭 컴포넌트
|
|
532
|
+
- 이벤트 타입`,
|
|
533
|
+
},
|
|
534
|
+
|
|
535
|
+
nextjs: {
|
|
536
|
+
name: "Next.js",
|
|
537
|
+
description: "Next.js App Router 베스트 프랙티스 기반 리뷰",
|
|
538
|
+
tags: ["framework", "frontend", "nextjs", "react"],
|
|
539
|
+
prompt: `Next.js (App Router) 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
540
|
+
|
|
541
|
+
## 검토 항목
|
|
542
|
+
|
|
543
|
+
### 1. Server vs Client Components
|
|
544
|
+
- 'use client' 지시어 최소화
|
|
545
|
+
- 서버 컴포넌트에서 데이터 페칭
|
|
546
|
+
- 클라이언트 컴포넌트 경계 설정
|
|
547
|
+
- 인터리빙 패턴
|
|
548
|
+
|
|
549
|
+
### 2. Data Fetching
|
|
550
|
+
- **Server Components**: async/await 직접 사용
|
|
551
|
+
- **Server Actions**: 폼 처리, 뮤테이션
|
|
552
|
+
- fetch 캐싱 전략 (cache, revalidate)
|
|
553
|
+
- 병렬 데이터 페칭
|
|
554
|
+
|
|
555
|
+
### 3. 라우팅
|
|
556
|
+
- 파일 기반 라우팅 구조
|
|
557
|
+
- 동적 라우트 적절성
|
|
558
|
+
- Route Groups 활용
|
|
559
|
+
- Parallel/Intercepting Routes
|
|
560
|
+
|
|
561
|
+
### 4. 메타데이터
|
|
562
|
+
- generateMetadata 사용
|
|
563
|
+
- 동적 OG 이미지
|
|
564
|
+
- sitemap, robots.txt
|
|
565
|
+
|
|
566
|
+
### 5. 최적화
|
|
567
|
+
- **Image**: next/image 사용, sizes 속성
|
|
568
|
+
- **Font**: next/font 사용
|
|
569
|
+
- **Script**: next/script 전략
|
|
570
|
+
- Static vs Dynamic 렌더링
|
|
571
|
+
|
|
572
|
+
### 6. 캐싱 전략
|
|
573
|
+
- Full Route Cache
|
|
574
|
+
- Data Cache
|
|
575
|
+
- Router Cache
|
|
576
|
+
- revalidatePath/revalidateTag
|
|
577
|
+
|
|
578
|
+
### 7. 에러 처리
|
|
579
|
+
- error.tsx 바운더리
|
|
580
|
+
- not-found.tsx
|
|
581
|
+
- loading.tsx 스켈레톤`,
|
|
582
|
+
},
|
|
583
|
+
|
|
584
|
+
vue: {
|
|
585
|
+
name: "Vue.js",
|
|
586
|
+
description: "Vue 3 Composition API 베스트 프랙티스 기반 리뷰",
|
|
587
|
+
tags: ["framework", "frontend", "vue"],
|
|
588
|
+
prompt: `Vue 3 (Composition API) 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
589
|
+
|
|
590
|
+
## 검토 항목
|
|
591
|
+
|
|
592
|
+
### 1. Composition API
|
|
593
|
+
- setup() 또는 <script setup> 사용
|
|
594
|
+
- ref vs reactive 적절한 선택
|
|
595
|
+
- computed 활용
|
|
596
|
+
- watch/watchEffect 사용
|
|
597
|
+
|
|
598
|
+
### 2. 컴포넌트 설계
|
|
599
|
+
- Props 정의 (타입, 기본값, 검증)
|
|
600
|
+
- Emits 정의
|
|
601
|
+
- v-model 커스텀
|
|
602
|
+
- Slots 활용
|
|
603
|
+
|
|
604
|
+
### 3. Composables
|
|
605
|
+
- 재사용 가능한 로직 추출
|
|
606
|
+
- 네이밍 컨벤션 (use 접두사)
|
|
607
|
+
- 반응성 유지
|
|
608
|
+
- 클린업 처리
|
|
609
|
+
|
|
610
|
+
### 4. 성능
|
|
611
|
+
- v-show vs v-if 선택
|
|
612
|
+
- v-for 키 사용
|
|
613
|
+
- 컴포넌트 지연 로딩
|
|
614
|
+
- keep-alive 활용
|
|
615
|
+
|
|
616
|
+
### 5. 상태 관리 (Pinia)
|
|
617
|
+
- Store 구조
|
|
618
|
+
- Actions vs Getters
|
|
619
|
+
- 구독 및 플러그인
|
|
620
|
+
|
|
621
|
+
### 6. TypeScript
|
|
622
|
+
- defineProps/defineEmits 타입
|
|
623
|
+
- 제네릭 컴포넌트`,
|
|
624
|
+
},
|
|
625
|
+
|
|
626
|
+
angular: {
|
|
627
|
+
name: "Angular",
|
|
628
|
+
description: "Angular 베스트 프랙티스 기반 리뷰",
|
|
629
|
+
tags: ["framework", "frontend", "angular"],
|
|
630
|
+
prompt: `Angular 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
631
|
+
|
|
632
|
+
## 검토 항목
|
|
633
|
+
|
|
634
|
+
### 1. 컴포넌트
|
|
635
|
+
- 스마트/덤 컴포넌트 분리
|
|
636
|
+
- ChangeDetectionStrategy.OnPush 사용
|
|
637
|
+
- 컴포넌트 크기 적절성
|
|
638
|
+
- Input/Output 데코레이터
|
|
639
|
+
|
|
640
|
+
### 2. 모듈 구조
|
|
641
|
+
- Feature 모듈 분리
|
|
642
|
+
- Shared 모듈 활용
|
|
643
|
+
- Lazy Loading 적용
|
|
644
|
+
- Standalone Components
|
|
645
|
+
|
|
646
|
+
### 3. 서비스 및 DI
|
|
647
|
+
- 싱글톤 vs 컴포넌트 스코프
|
|
648
|
+
- providedIn 설정
|
|
649
|
+
- 인터페이스 기반 설계
|
|
650
|
+
|
|
651
|
+
### 4. RxJS
|
|
652
|
+
- Observable 구독 관리
|
|
653
|
+
- takeUntil/async pipe 사용
|
|
654
|
+
- 에러 핸들링
|
|
655
|
+
- 적절한 오퍼레이터 선택
|
|
656
|
+
|
|
657
|
+
### 5. 폼
|
|
658
|
+
- Reactive Forms vs Template Forms
|
|
659
|
+
- 폼 검증 로직
|
|
660
|
+
- 커스텀 Validator
|
|
661
|
+
|
|
662
|
+
### 6. 성능
|
|
663
|
+
- TrackBy 함수
|
|
664
|
+
- 순수 Pipe
|
|
665
|
+
- Zone.js 최적화`,
|
|
666
|
+
},
|
|
667
|
+
|
|
668
|
+
nestjs: {
|
|
669
|
+
name: "NestJS",
|
|
670
|
+
description: "NestJS 베스트 프랙티스 기반 리뷰",
|
|
671
|
+
tags: ["framework", "backend", "nestjs", "node"],
|
|
672
|
+
prompt: `NestJS 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
673
|
+
|
|
674
|
+
## 검토 항목
|
|
675
|
+
|
|
676
|
+
### 1. 모듈 구조
|
|
677
|
+
- 모듈 경계 명확성
|
|
678
|
+
- 순환 의존성 방지
|
|
679
|
+
- Dynamic Modules 활용
|
|
680
|
+
- Global 모듈 최소화
|
|
681
|
+
|
|
682
|
+
### 2. 의존성 주입
|
|
683
|
+
- Provider 스코프 (DEFAULT, REQUEST, TRANSIENT)
|
|
684
|
+
- 커스텀 Provider
|
|
685
|
+
- 인터페이스 기반 주입
|
|
686
|
+
- useFactory/useClass/useValue
|
|
687
|
+
|
|
688
|
+
### 3. 컨트롤러
|
|
689
|
+
- REST 규칙 준수
|
|
690
|
+
- 라우트 네이밍
|
|
691
|
+
- HTTP 상태 코드 적절성
|
|
692
|
+
- API 버저닝
|
|
693
|
+
|
|
694
|
+
### 4. 서비스
|
|
695
|
+
- 비즈니스 로직 분리
|
|
696
|
+
- 트랜잭션 관리
|
|
697
|
+
- 캐싱 전략
|
|
698
|
+
|
|
699
|
+
### 5. 미들웨어/가드/인터셉터/파이프
|
|
700
|
+
- 적절한 레이어 선택
|
|
701
|
+
- Guard: 인증/인가
|
|
702
|
+
- Interceptor: 로깅, 변환
|
|
703
|
+
- Pipe: 검증, 변환
|
|
704
|
+
|
|
705
|
+
### 6. DTO 및 검증
|
|
706
|
+
- class-validator 데코레이터
|
|
707
|
+
- class-transformer 활용
|
|
708
|
+
- 화이트리스트 검증
|
|
709
|
+
- 커스텀 Validator
|
|
710
|
+
|
|
711
|
+
### 7. 예외 처리
|
|
712
|
+
- HttpException 활용
|
|
713
|
+
- 커스텀 Exception Filter
|
|
714
|
+
- 에러 응답 일관성
|
|
715
|
+
|
|
716
|
+
### 8. TypeORM/Prisma
|
|
717
|
+
- Repository 패턴
|
|
718
|
+
- 쿼리 최적화
|
|
719
|
+
- 마이그레이션 관리`,
|
|
720
|
+
},
|
|
721
|
+
|
|
722
|
+
express: {
|
|
723
|
+
name: "Express.js",
|
|
724
|
+
description: "Express.js 베스트 프랙티스 기반 리뷰",
|
|
725
|
+
tags: ["framework", "backend", "express", "node"],
|
|
726
|
+
prompt: `Express.js 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
727
|
+
|
|
728
|
+
## 검토 항목
|
|
729
|
+
|
|
730
|
+
### 1. 라우팅
|
|
731
|
+
- Router 모듈화
|
|
732
|
+
- RESTful 규칙 준수
|
|
733
|
+
- 라우트 네이밍 일관성
|
|
734
|
+
- 버저닝 전략
|
|
735
|
+
|
|
736
|
+
### 2. 미들웨어
|
|
737
|
+
- 미들웨어 순서
|
|
738
|
+
- 에러 핸들링 미들웨어
|
|
739
|
+
- 커스텀 미들웨어 구조
|
|
740
|
+
- async 미들웨어 처리
|
|
741
|
+
|
|
742
|
+
### 3. 보안
|
|
743
|
+
- helmet 사용
|
|
744
|
+
- CORS 설정
|
|
745
|
+
- Rate Limiting
|
|
746
|
+
- 입력 검증 (express-validator)
|
|
747
|
+
|
|
748
|
+
### 4. 에러 처리
|
|
749
|
+
- 중앙 집중식 에러 핸들러
|
|
750
|
+
- 커스텀 에러 클래스
|
|
751
|
+
- 운영/개발 에러 분리
|
|
752
|
+
- 비동기 에러 캐치
|
|
753
|
+
|
|
754
|
+
### 5. 구조
|
|
755
|
+
- MVC 또는 레이어드 아키텍처
|
|
756
|
+
- 설정 관리
|
|
757
|
+
- 환경 변수 처리
|
|
758
|
+
- 로깅 전략
|
|
759
|
+
|
|
760
|
+
### 6. 성능
|
|
761
|
+
- 압축 (compression)
|
|
762
|
+
- 캐싱 헤더
|
|
763
|
+
- 클러스터링
|
|
764
|
+
- 커넥션 풀링`,
|
|
765
|
+
},
|
|
766
|
+
|
|
767
|
+
fastify: {
|
|
768
|
+
name: "Fastify",
|
|
769
|
+
description: "Fastify 베스트 프랙티스 기반 리뷰",
|
|
770
|
+
tags: ["framework", "backend", "fastify", "node"],
|
|
771
|
+
prompt: `Fastify 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
772
|
+
|
|
773
|
+
## 검토 항목
|
|
774
|
+
|
|
775
|
+
### 1. 플러그인 시스템
|
|
776
|
+
- 플러그인 캡슐화
|
|
777
|
+
- fastify-plugin 사용
|
|
778
|
+
- 데코레이터 활용
|
|
779
|
+
- 플러그인 순서
|
|
780
|
+
|
|
781
|
+
### 2. 스키마 검증
|
|
782
|
+
- JSON Schema 정의
|
|
783
|
+
- 응답 스키마
|
|
784
|
+
- 쿼리/파라미터 스키마
|
|
785
|
+
- 공유 스키마 ($ref)
|
|
786
|
+
|
|
787
|
+
### 3. 직렬화
|
|
788
|
+
- fast-json-stringify 활용
|
|
789
|
+
- 응답 직렬화 최적화
|
|
790
|
+
|
|
791
|
+
### 4. 훅
|
|
792
|
+
- 라이프사이클 훅 활용
|
|
793
|
+
- onRequest, preHandler, onSend
|
|
794
|
+
- 에러 훅
|
|
795
|
+
|
|
796
|
+
### 5. 타입 안전성
|
|
797
|
+
- TypeBox 또는 Typebox
|
|
798
|
+
- 타입 프로바이더
|
|
799
|
+
- 제네릭 라우트`,
|
|
800
|
+
},
|
|
801
|
+
|
|
802
|
+
springboot: {
|
|
803
|
+
name: "Spring Boot",
|
|
804
|
+
description: "Spring Boot 베스트 프랙티스 기반 리뷰",
|
|
805
|
+
tags: ["framework", "backend", "java", "spring"],
|
|
806
|
+
prompt: `Spring Boot 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
807
|
+
|
|
808
|
+
## 검토 항목
|
|
809
|
+
|
|
810
|
+
### 1. 레이어 구조
|
|
811
|
+
- Controller → Service → Repository 분리
|
|
812
|
+
- DTO vs Entity 분리
|
|
813
|
+
- 도메인 로직 위치
|
|
814
|
+
|
|
815
|
+
### 2. 의존성 주입
|
|
816
|
+
- 생성자 주입 선호
|
|
817
|
+
- @Autowired 필드 주입 지양
|
|
818
|
+
- 인터페이스 기반 설계
|
|
819
|
+
|
|
820
|
+
### 3. REST API
|
|
821
|
+
- @RestController 사용
|
|
822
|
+
- ResponseEntity 활용
|
|
823
|
+
- HTTP 상태 코드
|
|
824
|
+
- API 버저닝
|
|
825
|
+
|
|
826
|
+
### 4. 검증
|
|
827
|
+
- @Valid, @Validated
|
|
828
|
+
- 커스텀 Validator
|
|
829
|
+
- BindingResult 처리
|
|
830
|
+
|
|
831
|
+
### 5. 예외 처리
|
|
832
|
+
- @ControllerAdvice
|
|
833
|
+
- @ExceptionHandler
|
|
834
|
+
- 커스텀 예외 클래스
|
|
835
|
+
|
|
836
|
+
### 6. JPA/Hibernate
|
|
837
|
+
- 지연 로딩 vs 즉시 로딩
|
|
838
|
+
- N+1 문제 해결 (fetch join, @EntityGraph)
|
|
839
|
+
- 트랜잭션 범위
|
|
840
|
+
- 영속성 컨텍스트
|
|
841
|
+
|
|
842
|
+
### 7. 보안
|
|
843
|
+
- Spring Security 설정
|
|
844
|
+
- 인증/인가 분리
|
|
845
|
+
- CSRF, CORS
|
|
846
|
+
|
|
847
|
+
### 8. 설정
|
|
848
|
+
- application.yml 구조
|
|
849
|
+
- 프로파일 관리
|
|
850
|
+
- 외부 설정`,
|
|
851
|
+
},
|
|
852
|
+
|
|
853
|
+
django: {
|
|
854
|
+
name: "Django",
|
|
855
|
+
description: "Django 베스트 프랙티스 기반 리뷰",
|
|
856
|
+
tags: ["framework", "backend", "python", "django"],
|
|
857
|
+
prompt: `Django 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
858
|
+
|
|
859
|
+
## 검토 항목
|
|
860
|
+
|
|
861
|
+
### 1. 프로젝트 구조
|
|
862
|
+
- 앱 분리 원칙
|
|
863
|
+
- 설정 파일 구조
|
|
864
|
+
- URL 라우팅
|
|
865
|
+
|
|
866
|
+
### 2. 모델
|
|
867
|
+
- 필드 타입 적절성
|
|
868
|
+
- 인덱스 설정
|
|
869
|
+
- Manager 커스터마이징
|
|
870
|
+
- 시그널 사용
|
|
871
|
+
|
|
872
|
+
### 3. 뷰
|
|
873
|
+
- CBV vs FBV 선택
|
|
874
|
+
- Mixin 활용
|
|
875
|
+
- 권한 처리
|
|
876
|
+
|
|
877
|
+
### 4. ORM
|
|
878
|
+
- QuerySet 최적화
|
|
879
|
+
- select_related/prefetch_related
|
|
880
|
+
- 집계 함수 활용
|
|
881
|
+
- Raw SQL 최소화
|
|
882
|
+
|
|
883
|
+
### 5. 폼
|
|
884
|
+
- ModelForm 활용
|
|
885
|
+
- 커스텀 검증
|
|
886
|
+
- 위젯 커스터마이징
|
|
887
|
+
|
|
888
|
+
### 6. 보안
|
|
889
|
+
- CSRF 보호
|
|
890
|
+
- XSS 방지
|
|
891
|
+
- SQL Injection 방지
|
|
892
|
+
- 인증/인가
|
|
893
|
+
|
|
894
|
+
### 7. Django REST Framework
|
|
895
|
+
- Serializer 설계
|
|
896
|
+
- ViewSet 활용
|
|
897
|
+
- 권한 클래스
|
|
898
|
+
- 페이지네이션`,
|
|
899
|
+
},
|
|
900
|
+
|
|
901
|
+
flask: {
|
|
902
|
+
name: "Flask",
|
|
903
|
+
description: "Flask 베스트 프랙티스 기반 리뷰",
|
|
904
|
+
tags: ["framework", "backend", "python", "flask"],
|
|
905
|
+
prompt: `Flask 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
906
|
+
|
|
907
|
+
## 검토 항목
|
|
908
|
+
|
|
909
|
+
### 1. 애플리케이션 팩토리
|
|
910
|
+
- create_app 패턴
|
|
911
|
+
- 설정 관리
|
|
912
|
+
- 확장 초기화
|
|
913
|
+
|
|
914
|
+
### 2. 블루프린트
|
|
915
|
+
- 모듈화 구조
|
|
916
|
+
- URL 프리픽스
|
|
917
|
+
- 에러 핸들러
|
|
918
|
+
|
|
919
|
+
### 3. 라우팅
|
|
920
|
+
- 데코레이터 사용
|
|
921
|
+
- URL 변수
|
|
922
|
+
- HTTP 메서드
|
|
923
|
+
|
|
924
|
+
### 4. 요청/응답
|
|
925
|
+
- request 객체 활용
|
|
926
|
+
- jsonify 사용
|
|
927
|
+
- 에러 응답
|
|
928
|
+
|
|
929
|
+
### 5. 데이터베이스
|
|
930
|
+
- Flask-SQLAlchemy 사용
|
|
931
|
+
- 세션 관리
|
|
932
|
+
- 마이그레이션 (Flask-Migrate)
|
|
933
|
+
|
|
934
|
+
### 6. 보안
|
|
935
|
+
- Flask-Login
|
|
936
|
+
- 비밀번호 해싱
|
|
937
|
+
- CSRF 보호`,
|
|
938
|
+
},
|
|
939
|
+
};
|
|
940
|
+
|
|
941
|
+
/**
|
|
942
|
+
* Domain Presets
|
|
943
|
+
* 도메인/영역별 프리셋
|
|
944
|
+
*/
|
|
945
|
+
export const DOMAIN_PRESETS: PresetRegistry = {
|
|
946
|
+
frontend: {
|
|
947
|
+
name: "프론트엔드 일반",
|
|
948
|
+
description: "프론트엔드 개발 전반 관점 리뷰",
|
|
949
|
+
tags: ["domain", "frontend"],
|
|
950
|
+
prompt: `프론트엔드 개발 관점에서 코드를 리뷰해주세요:
|
|
951
|
+
|
|
952
|
+
## 검토 항목
|
|
953
|
+
|
|
954
|
+
### 1. UI/UX
|
|
955
|
+
- 사용자 피드백 (로딩, 에러 상태)
|
|
956
|
+
- 인터랙션 일관성
|
|
957
|
+
- 폼 유효성 검사 UX
|
|
958
|
+
- 반응형 디자인
|
|
959
|
+
|
|
960
|
+
### 2. 상태 관리
|
|
961
|
+
- 로컬/전역 상태 분리
|
|
962
|
+
- 상태 정규화
|
|
963
|
+
- 캐싱 전략
|
|
964
|
+
- 낙관적 업데이트
|
|
965
|
+
|
|
966
|
+
### 3. API 통신
|
|
967
|
+
- 에러 핸들링
|
|
968
|
+
- 로딩 상태 관리
|
|
969
|
+
- 재시도 로직
|
|
970
|
+
- 요청 취소
|
|
971
|
+
|
|
972
|
+
### 4. 스타일링
|
|
973
|
+
- CSS 방법론 (BEM, CSS Modules, CSS-in-JS)
|
|
974
|
+
- 테마 시스템
|
|
975
|
+
- 반응형 브레이크포인트
|
|
976
|
+
- 다크모드 지원
|
|
977
|
+
|
|
978
|
+
### 5. 빌드/번들
|
|
979
|
+
- 트리 쉐이킹
|
|
980
|
+
- 코드 스플리팅
|
|
981
|
+
- 환경 변수 관리
|
|
982
|
+
- 소스맵
|
|
983
|
+
|
|
984
|
+
### 6. 브라우저 호환성
|
|
985
|
+
- Polyfill 필요성
|
|
986
|
+
- CSS 프리픽스
|
|
987
|
+
- Feature Detection`,
|
|
988
|
+
},
|
|
989
|
+
|
|
990
|
+
backend: {
|
|
991
|
+
name: "백엔드 일반",
|
|
992
|
+
description: "백엔드 개발 전반 관점 리뷰",
|
|
993
|
+
tags: ["domain", "backend"],
|
|
994
|
+
prompt: `백엔드 개발 관점에서 코드를 리뷰해주세요:
|
|
995
|
+
|
|
996
|
+
## 검토 항목
|
|
997
|
+
|
|
998
|
+
### 1. API 설계
|
|
999
|
+
- RESTful 원칙 준수
|
|
1000
|
+
- 엔드포인트 네이밍
|
|
1001
|
+
- HTTP 메서드 적절성
|
|
1002
|
+
- 상태 코드 사용
|
|
1003
|
+
- 버저닝 전략
|
|
1004
|
+
|
|
1005
|
+
### 2. 데이터베이스
|
|
1006
|
+
- 스키마 설계
|
|
1007
|
+
- 인덱스 전략
|
|
1008
|
+
- 쿼리 최적화
|
|
1009
|
+
- 트랜잭션 관리
|
|
1010
|
+
- 커넥션 풀링
|
|
1011
|
+
|
|
1012
|
+
### 3. 인증/인가
|
|
1013
|
+
- 인증 방식 (JWT, Session, OAuth)
|
|
1014
|
+
- 권한 체크 위치
|
|
1015
|
+
- 토큰 관리
|
|
1016
|
+
- 비밀번호 정책
|
|
1017
|
+
|
|
1018
|
+
### 4. 비동기 처리
|
|
1019
|
+
- 큐 시스템 활용
|
|
1020
|
+
- 백그라운드 작업
|
|
1021
|
+
- 이벤트 기반 처리
|
|
1022
|
+
|
|
1023
|
+
### 5. 캐싱
|
|
1024
|
+
- 캐시 전략 (Cache-Aside, Write-Through)
|
|
1025
|
+
- TTL 설정
|
|
1026
|
+
- 캐시 무효화
|
|
1027
|
+
- 분산 캐시
|
|
1028
|
+
|
|
1029
|
+
### 6. 로깅/모니터링
|
|
1030
|
+
- 로그 레벨
|
|
1031
|
+
- 구조화된 로깅
|
|
1032
|
+
- 요청 추적
|
|
1033
|
+
- 메트릭 수집`,
|
|
1034
|
+
},
|
|
1035
|
+
|
|
1036
|
+
fullstack: {
|
|
1037
|
+
name: "풀스택",
|
|
1038
|
+
description: "프론트엔드와 백엔드 전체 관점 리뷰",
|
|
1039
|
+
tags: ["domain", "fullstack"],
|
|
1040
|
+
prompt: `풀스택 관점에서 코드를 리뷰해주세요:
|
|
1041
|
+
|
|
1042
|
+
## 검토 항목
|
|
1043
|
+
|
|
1044
|
+
### 1. API 계약
|
|
1045
|
+
- 프론트-백 인터페이스 일관성
|
|
1046
|
+
- 타입 공유 (OpenAPI, GraphQL 스키마)
|
|
1047
|
+
- 에러 응답 형식 통일
|
|
1048
|
+
- 페이지네이션 표준
|
|
1049
|
+
|
|
1050
|
+
### 2. 데이터 흐름
|
|
1051
|
+
- 클라이언트-서버 데이터 동기화
|
|
1052
|
+
- 실시간 업데이트 처리
|
|
1053
|
+
- 캐싱 전략 일관성
|
|
1054
|
+
- 낙관적 업데이트
|
|
1055
|
+
|
|
1056
|
+
### 3. 인증 흐름
|
|
1057
|
+
- 토큰 저장 방식
|
|
1058
|
+
- 리프레시 토큰 처리
|
|
1059
|
+
- 세션 만료 UX
|
|
1060
|
+
- 로그아웃 처리
|
|
1061
|
+
|
|
1062
|
+
### 4. 환경 설정
|
|
1063
|
+
- 환경 변수 관리
|
|
1064
|
+
- 시크릿 관리
|
|
1065
|
+
- 설정 검증
|
|
1066
|
+
|
|
1067
|
+
### 5. 배포
|
|
1068
|
+
- 빌드 파이프라인
|
|
1069
|
+
- 환경별 설정
|
|
1070
|
+
- 마이그레이션 전략`,
|
|
1071
|
+
},
|
|
1072
|
+
|
|
1073
|
+
mobile: {
|
|
1074
|
+
name: "모바일 (React Native/Flutter)",
|
|
1075
|
+
description: "크로스 플랫폼 모바일 앱 관점 리뷰",
|
|
1076
|
+
tags: ["domain", "mobile"],
|
|
1077
|
+
prompt: `모바일 앱 개발 관점에서 코드를 리뷰해주세요:
|
|
1078
|
+
|
|
1079
|
+
## 검토 항목
|
|
1080
|
+
|
|
1081
|
+
### 1. 성능
|
|
1082
|
+
- 렌더링 최적화
|
|
1083
|
+
- 메모리 관리
|
|
1084
|
+
- 리스트 가상화
|
|
1085
|
+
- 이미지 최적화
|
|
1086
|
+
- 네이티브 모듈 사용
|
|
1087
|
+
|
|
1088
|
+
### 2. UX
|
|
1089
|
+
- 제스처 핸들링
|
|
1090
|
+
- 애니메이션 부드러움
|
|
1091
|
+
- 오프라인 지원
|
|
1092
|
+
- 딥링킹
|
|
1093
|
+
|
|
1094
|
+
### 3. 네이티브 연동
|
|
1095
|
+
- 플랫폼별 코드 분리
|
|
1096
|
+
- 권한 요청
|
|
1097
|
+
- 푸시 알림
|
|
1098
|
+
- 백그라운드 작업
|
|
1099
|
+
|
|
1100
|
+
### 4. 상태 관리
|
|
1101
|
+
- 로컬 저장소 활용
|
|
1102
|
+
- 상태 지속성
|
|
1103
|
+
- 네비게이션 상태
|
|
1104
|
+
|
|
1105
|
+
### 5. 테스트
|
|
1106
|
+
- 단위 테스트
|
|
1107
|
+
- 위젯/컴포넌트 테스트
|
|
1108
|
+
- E2E 테스트
|
|
1109
|
+
- 디바이스 테스트`,
|
|
1110
|
+
},
|
|
1111
|
+
|
|
1112
|
+
devops: {
|
|
1113
|
+
name: "DevOps/인프라",
|
|
1114
|
+
description: "CI/CD, 인프라 코드 관점 리뷰",
|
|
1115
|
+
tags: ["domain", "devops", "infrastructure"],
|
|
1116
|
+
prompt: `DevOps/인프라 관점에서 코드를 리뷰해주세요:
|
|
1117
|
+
|
|
1118
|
+
## 검토 항목
|
|
1119
|
+
|
|
1120
|
+
### 1. CI/CD
|
|
1121
|
+
- 파이프라인 구조
|
|
1122
|
+
- 테스트 단계
|
|
1123
|
+
- 빌드 최적화
|
|
1124
|
+
- 배포 전략 (Blue-Green, Canary)
|
|
1125
|
+
|
|
1126
|
+
### 2. IaC (Infrastructure as Code)
|
|
1127
|
+
- 모듈화
|
|
1128
|
+
- 상태 관리
|
|
1129
|
+
- 변수/시크릿 관리
|
|
1130
|
+
- 드리프트 방지
|
|
1131
|
+
|
|
1132
|
+
### 3. 컨테이너
|
|
1133
|
+
- Dockerfile 최적화
|
|
1134
|
+
- 이미지 크기
|
|
1135
|
+
- 레이어 캐싱
|
|
1136
|
+
- 보안 스캐닝
|
|
1137
|
+
|
|
1138
|
+
### 4. Kubernetes
|
|
1139
|
+
- 리소스 정의
|
|
1140
|
+
- 리소스 제한
|
|
1141
|
+
- 헬스 체크
|
|
1142
|
+
- 시크릿 관리
|
|
1143
|
+
|
|
1144
|
+
### 5. 모니터링
|
|
1145
|
+
- 메트릭 수집
|
|
1146
|
+
- 로그 집계
|
|
1147
|
+
- 알림 설정
|
|
1148
|
+
- 대시보드`,
|
|
1149
|
+
},
|
|
1150
|
+
|
|
1151
|
+
database: {
|
|
1152
|
+
name: "데이터베이스",
|
|
1153
|
+
description: "데이터베이스 스키마, 쿼리 최적화 관점 리뷰",
|
|
1154
|
+
tags: ["domain", "database"],
|
|
1155
|
+
prompt: `데이터베이스 관점에서 코드를 리뷰해주세요:
|
|
1156
|
+
|
|
1157
|
+
## 검토 항목
|
|
1158
|
+
|
|
1159
|
+
### 1. 스키마 설계
|
|
1160
|
+
- 정규화 수준 적절성
|
|
1161
|
+
- 관계 설정
|
|
1162
|
+
- 데이터 타입 선택
|
|
1163
|
+
- NULL 허용 여부
|
|
1164
|
+
|
|
1165
|
+
### 2. 인덱스
|
|
1166
|
+
- 인덱스 필요성
|
|
1167
|
+
- 복합 인덱스 순서
|
|
1168
|
+
- 인덱스 과다 사용
|
|
1169
|
+
- 커버링 인덱스
|
|
1170
|
+
|
|
1171
|
+
### 3. 쿼리 최적화
|
|
1172
|
+
- 실행 계획 분석
|
|
1173
|
+
- N+1 문제
|
|
1174
|
+
- 서브쿼리 vs JOIN
|
|
1175
|
+
- LIMIT/OFFSET 주의
|
|
1176
|
+
|
|
1177
|
+
### 4. 트랜잭션
|
|
1178
|
+
- 격리 수준
|
|
1179
|
+
- 데드락 방지
|
|
1180
|
+
- 트랜잭션 범위
|
|
1181
|
+
- 롤백 처리
|
|
1182
|
+
|
|
1183
|
+
### 5. 마이그레이션
|
|
1184
|
+
- 무중단 마이그레이션
|
|
1185
|
+
- 롤백 계획
|
|
1186
|
+
- 데이터 백필`,
|
|
1187
|
+
},
|
|
1188
|
+
};
|
|
1189
|
+
|
|
1190
|
+
/**
|
|
1191
|
+
* Language Presets
|
|
1192
|
+
* 프로그래밍 언어별 프리셋
|
|
1193
|
+
*/
|
|
1194
|
+
export const LANGUAGE_PRESETS: PresetRegistry = {
|
|
1195
|
+
typescript: {
|
|
1196
|
+
name: "TypeScript",
|
|
1197
|
+
description: "TypeScript 타입 시스템 및 베스트 프랙티스 리뷰",
|
|
1198
|
+
tags: ["language", "typescript"],
|
|
1199
|
+
prompt: `TypeScript 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1200
|
+
|
|
1201
|
+
## 검토 항목
|
|
1202
|
+
|
|
1203
|
+
### 1. 타입 정의
|
|
1204
|
+
- any 사용 최소화
|
|
1205
|
+
- unknown vs any 선택
|
|
1206
|
+
- 타입 추론 활용
|
|
1207
|
+
- 명시적 타입 필요 여부
|
|
1208
|
+
|
|
1209
|
+
### 2. 타입 안전성
|
|
1210
|
+
- null/undefined 처리
|
|
1211
|
+
- 타입 가드 사용
|
|
1212
|
+
- 타입 단언 최소화
|
|
1213
|
+
- never 타입 활용
|
|
1214
|
+
|
|
1215
|
+
### 3. 제네릭
|
|
1216
|
+
- 제네릭 활용 기회
|
|
1217
|
+
- 제네릭 제약 조건
|
|
1218
|
+
- 조건부 타입
|
|
1219
|
+
- 매핑된 타입
|
|
1220
|
+
|
|
1221
|
+
### 4. 인터페이스 vs 타입
|
|
1222
|
+
- 적절한 선택
|
|
1223
|
+
- 확장성 고려
|
|
1224
|
+
- 유니온/인터섹션 활용
|
|
1225
|
+
|
|
1226
|
+
### 5. 유틸리티 타입
|
|
1227
|
+
- Partial, Required, Pick, Omit
|
|
1228
|
+
- Record, Readonly
|
|
1229
|
+
- ReturnType, Parameters
|
|
1230
|
+
|
|
1231
|
+
### 6. 모듈
|
|
1232
|
+
- import/export 구조
|
|
1233
|
+
- 타입 전용 import
|
|
1234
|
+
- 배럴 파일`,
|
|
1235
|
+
},
|
|
1236
|
+
|
|
1237
|
+
javascript: {
|
|
1238
|
+
name: "JavaScript",
|
|
1239
|
+
description: "모던 JavaScript 베스트 프랙티스 리뷰",
|
|
1240
|
+
tags: ["language", "javascript"],
|
|
1241
|
+
prompt: `모던 JavaScript 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1242
|
+
|
|
1243
|
+
## 검토 항목
|
|
1244
|
+
|
|
1245
|
+
### 1. ES6+ 문법
|
|
1246
|
+
- const/let 사용 (var 지양)
|
|
1247
|
+
- 화살표 함수 적절한 사용
|
|
1248
|
+
- 템플릿 리터럴
|
|
1249
|
+
- 구조 분해 할당
|
|
1250
|
+
- 스프레드 연산자
|
|
1251
|
+
|
|
1252
|
+
### 2. 비동기 처리
|
|
1253
|
+
- async/await 패턴
|
|
1254
|
+
- Promise 체이닝
|
|
1255
|
+
- 에러 핸들링
|
|
1256
|
+
- 병렬 처리 (Promise.all)
|
|
1257
|
+
|
|
1258
|
+
### 3. 배열/객체 메서드
|
|
1259
|
+
- map, filter, reduce 활용
|
|
1260
|
+
- find, findIndex, includes
|
|
1261
|
+
- Object.entries/keys/values
|
|
1262
|
+
- Optional chaining (?.)
|
|
1263
|
+
- Nullish coalescing (??)
|
|
1264
|
+
|
|
1265
|
+
### 4. 모듈 시스템
|
|
1266
|
+
- ES Modules 사용
|
|
1267
|
+
- 동적 import
|
|
1268
|
+
- 네임드 vs 디폴트 export
|
|
1269
|
+
|
|
1270
|
+
### 5. 클로저 및 스코프
|
|
1271
|
+
- 클로저 이해
|
|
1272
|
+
- this 바인딩
|
|
1273
|
+
- 호이스팅 주의`,
|
|
1274
|
+
},
|
|
1275
|
+
|
|
1276
|
+
python: {
|
|
1277
|
+
name: "Python",
|
|
1278
|
+
description: "Python/PEP 스타일 가이드 기반 리뷰",
|
|
1279
|
+
tags: ["language", "python"],
|
|
1280
|
+
prompt: `Python (PEP 8) 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1281
|
+
|
|
1282
|
+
## 검토 항목
|
|
1283
|
+
|
|
1284
|
+
### 1. PEP 8 스타일
|
|
1285
|
+
- 네이밍 컨벤션 (snake_case)
|
|
1286
|
+
- 들여쓰기 (4 spaces)
|
|
1287
|
+
- 줄 길이 (79-120자)
|
|
1288
|
+
- import 순서
|
|
1289
|
+
|
|
1290
|
+
### 2. Pythonic 코드
|
|
1291
|
+
- List comprehension
|
|
1292
|
+
- Generator expression
|
|
1293
|
+
- Context manager (with)
|
|
1294
|
+
- f-string 포매팅
|
|
1295
|
+
|
|
1296
|
+
### 3. 타입 힌트
|
|
1297
|
+
- 함수 시그니처 타입
|
|
1298
|
+
- 변수 타입 힌트
|
|
1299
|
+
- typing 모듈 활용
|
|
1300
|
+
- mypy 호환성
|
|
1301
|
+
|
|
1302
|
+
### 4. 예외 처리
|
|
1303
|
+
- 구체적인 예외 타입
|
|
1304
|
+
- 예외 체이닝 (from)
|
|
1305
|
+
- 커스텀 예외
|
|
1306
|
+
|
|
1307
|
+
### 5. 클래스
|
|
1308
|
+
- @dataclass 활용
|
|
1309
|
+
- @property 데코레이터
|
|
1310
|
+
- __slots__ 최적화
|
|
1311
|
+
- ABC 추상 클래스
|
|
1312
|
+
|
|
1313
|
+
### 6. 함수형
|
|
1314
|
+
- 순수 함수
|
|
1315
|
+
- functools 활용
|
|
1316
|
+
- 불변성 선호`,
|
|
1317
|
+
},
|
|
1318
|
+
|
|
1319
|
+
go: {
|
|
1320
|
+
name: "Go",
|
|
1321
|
+
description: "Go 언어 관용구 및 베스트 프랙티스 리뷰",
|
|
1322
|
+
tags: ["language", "go"],
|
|
1323
|
+
prompt: `Go 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1324
|
+
|
|
1325
|
+
## 검토 항목
|
|
1326
|
+
|
|
1327
|
+
### 1. Go 관용구
|
|
1328
|
+
- 에러 핸들링 패턴
|
|
1329
|
+
- 명시적 에러 반환
|
|
1330
|
+
- defer 활용
|
|
1331
|
+
- 빈 인터페이스 최소화
|
|
1332
|
+
|
|
1333
|
+
### 2. 네이밍
|
|
1334
|
+
- MixedCaps 컨벤션
|
|
1335
|
+
- 약어 대문자 (HTTP, URL)
|
|
1336
|
+
- 내보내기 (대문자 시작)
|
|
1337
|
+
- 패키지 이름
|
|
1338
|
+
|
|
1339
|
+
### 3. 동시성
|
|
1340
|
+
- goroutine 사용
|
|
1341
|
+
- channel 패턴
|
|
1342
|
+
- sync 패키지 활용
|
|
1343
|
+
- 데이터 레이스 방지
|
|
1344
|
+
|
|
1345
|
+
### 4. 인터페이스
|
|
1346
|
+
- 작은 인터페이스 선호
|
|
1347
|
+
- 암묵적 구현
|
|
1348
|
+
- 인터페이스 수용, 구조체 반환
|
|
1349
|
+
|
|
1350
|
+
### 5. 에러 처리
|
|
1351
|
+
- errors.Is, errors.As
|
|
1352
|
+
- 에러 래핑 (%w)
|
|
1353
|
+
- 센티널 에러
|
|
1354
|
+
- 커스텀 에러 타입
|
|
1355
|
+
|
|
1356
|
+
### 6. 테스트
|
|
1357
|
+
- 테이블 주도 테스트
|
|
1358
|
+
- 서브테스트
|
|
1359
|
+
- 테스트 헬퍼`,
|
|
1360
|
+
},
|
|
1361
|
+
|
|
1362
|
+
java: {
|
|
1363
|
+
name: "Java",
|
|
1364
|
+
description: "Java 베스트 프랙티스 및 모던 Java 기능 리뷰",
|
|
1365
|
+
tags: ["language", "java"],
|
|
1366
|
+
prompt: `Java 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1367
|
+
|
|
1368
|
+
## 검토 항목
|
|
1369
|
+
|
|
1370
|
+
### 1. 모던 Java (8+)
|
|
1371
|
+
- Stream API 활용
|
|
1372
|
+
- Optional 사용
|
|
1373
|
+
- 람다 표현식
|
|
1374
|
+
- 메서드 레퍼런스
|
|
1375
|
+
- Record 클래스 (16+)
|
|
1376
|
+
|
|
1377
|
+
### 2. 객체 지향
|
|
1378
|
+
- SOLID 원칙
|
|
1379
|
+
- 상속 vs 컴포지션
|
|
1380
|
+
- 인터페이스 기반 설계
|
|
1381
|
+
- 불변 객체
|
|
1382
|
+
|
|
1383
|
+
### 3. 예외 처리
|
|
1384
|
+
- Checked vs Unchecked
|
|
1385
|
+
- try-with-resources
|
|
1386
|
+
- 예외 체이닝
|
|
1387
|
+
- 커스텀 예외
|
|
1388
|
+
|
|
1389
|
+
### 4. 컬렉션
|
|
1390
|
+
- 적절한 컬렉션 선택
|
|
1391
|
+
- 불변 컬렉션 (List.of)
|
|
1392
|
+
- 스트림 vs 루프
|
|
1393
|
+
- Null 안전 컬렉션
|
|
1394
|
+
|
|
1395
|
+
### 5. 동시성
|
|
1396
|
+
- ExecutorService
|
|
1397
|
+
- CompletableFuture
|
|
1398
|
+
- 동기화 전략
|
|
1399
|
+
- 불변성 활용
|
|
1400
|
+
|
|
1401
|
+
### 6. 메모리
|
|
1402
|
+
- 메모리 누수 방지
|
|
1403
|
+
- WeakReference
|
|
1404
|
+
- 객체 풀링`,
|
|
1405
|
+
},
|
|
1406
|
+
|
|
1407
|
+
rust: {
|
|
1408
|
+
name: "Rust",
|
|
1409
|
+
description: "Rust 소유권, 안전성 관점 리뷰",
|
|
1410
|
+
tags: ["language", "rust"],
|
|
1411
|
+
prompt: `Rust 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1412
|
+
|
|
1413
|
+
## 검토 항목
|
|
1414
|
+
|
|
1415
|
+
### 1. 소유권
|
|
1416
|
+
- 소유권 이동 vs 빌림
|
|
1417
|
+
- 라이프타임 적절성
|
|
1418
|
+
- 복사 vs 클론 선택
|
|
1419
|
+
|
|
1420
|
+
### 2. 에러 처리
|
|
1421
|
+
- Result, Option 활용
|
|
1422
|
+
- ? 연산자
|
|
1423
|
+
- 커스텀 에러 타입
|
|
1424
|
+
- thiserror/anyhow 활용
|
|
1425
|
+
|
|
1426
|
+
### 3. 패턴
|
|
1427
|
+
- match 완전성
|
|
1428
|
+
- if let, while let
|
|
1429
|
+
- 구조체 패턴
|
|
1430
|
+
|
|
1431
|
+
### 4. 타입 시스템
|
|
1432
|
+
- 제네릭 활용
|
|
1433
|
+
- 트레이트 바운드
|
|
1434
|
+
- Associated Types
|
|
1435
|
+
- PhantomData
|
|
1436
|
+
|
|
1437
|
+
### 5. 동시성
|
|
1438
|
+
- Send, Sync 트레이트
|
|
1439
|
+
- Arc, Mutex 활용
|
|
1440
|
+
- 채널 통신
|
|
1441
|
+
- async/await
|
|
1442
|
+
|
|
1443
|
+
### 6. 성능
|
|
1444
|
+
- 제로 코스트 추상화
|
|
1445
|
+
- 인라이닝
|
|
1446
|
+
- 스택 vs 힙 할당`,
|
|
1447
|
+
},
|
|
1448
|
+
};
|
|
1449
|
+
|
|
1450
|
+
/**
|
|
1451
|
+
* AI/ML Presets
|
|
1452
|
+
* AI/ML 및 챗봇 관련 프리셋
|
|
1453
|
+
*/
|
|
1454
|
+
export const AI_PRESETS: PresetRegistry = {
|
|
1455
|
+
chatbot: {
|
|
1456
|
+
name: "챗봇/대화형 AI",
|
|
1457
|
+
description: "챗봇 및 대화형 AI 시스템 관점 리뷰",
|
|
1458
|
+
tags: ["ai", "chatbot", "conversational"],
|
|
1459
|
+
prompt: `챗봇/대화형 AI 시스템 관점에서 코드를 리뷰해주세요:
|
|
1460
|
+
|
|
1461
|
+
## 검토 항목
|
|
1462
|
+
|
|
1463
|
+
### 1. 대화 관리
|
|
1464
|
+
- 대화 컨텍스트 유지
|
|
1465
|
+
- 세션 관리
|
|
1466
|
+
- 대화 히스토리 저장
|
|
1467
|
+
- 컨텍스트 윈도우 관리
|
|
1468
|
+
- 멀티턴 대화 처리
|
|
1469
|
+
|
|
1470
|
+
### 2. 프롬프트 엔지니어링
|
|
1471
|
+
- 시스템 프롬프트 설계
|
|
1472
|
+
- 프롬프트 템플릿 관리
|
|
1473
|
+
- 동적 프롬프트 생성
|
|
1474
|
+
- Few-shot 예제 관리
|
|
1475
|
+
- 프롬프트 인젝션 방지
|
|
1476
|
+
|
|
1477
|
+
### 3. LLM 통합
|
|
1478
|
+
- API 호출 최적화
|
|
1479
|
+
- 토큰 사용량 관리
|
|
1480
|
+
- 스트리밍 응답 처리
|
|
1481
|
+
- 폴백 모델 전략
|
|
1482
|
+
- Rate Limiting 처리
|
|
1483
|
+
|
|
1484
|
+
### 4. 응답 처리
|
|
1485
|
+
- 응답 파싱 및 검증
|
|
1486
|
+
- 할루시네이션 감지
|
|
1487
|
+
- 응답 필터링 (부적절한 내용)
|
|
1488
|
+
- 구조화된 출력 처리
|
|
1489
|
+
|
|
1490
|
+
### 5. RAG (Retrieval Augmented Generation)
|
|
1491
|
+
- 문서 청킹 전략
|
|
1492
|
+
- 임베딩 생성
|
|
1493
|
+
- 벡터 검색 최적화
|
|
1494
|
+
- 컨텍스트 주입
|
|
1495
|
+
|
|
1496
|
+
### 6. 사용자 경험
|
|
1497
|
+
- 타이핑 인디케이터
|
|
1498
|
+
- 에러 메시지 친화성
|
|
1499
|
+
- 대화 재시작/초기화
|
|
1500
|
+
- 피드백 수집
|
|
1501
|
+
|
|
1502
|
+
### 7. 안전성
|
|
1503
|
+
- 콘텐츠 필터링
|
|
1504
|
+
- PII 마스킹
|
|
1505
|
+
- 프롬프트 인젝션 방어
|
|
1506
|
+
- 출력 검증`,
|
|
1507
|
+
},
|
|
1508
|
+
|
|
1509
|
+
llmIntegration: {
|
|
1510
|
+
name: "LLM API 통합",
|
|
1511
|
+
description: "OpenAI, Anthropic, Google AI 등 LLM API 통합 관점 리뷰",
|
|
1512
|
+
tags: ["ai", "llm", "api"],
|
|
1513
|
+
prompt: `LLM API 통합 관점에서 코드를 리뷰해주세요:
|
|
1514
|
+
|
|
1515
|
+
## 검토 항목
|
|
1516
|
+
|
|
1517
|
+
### 1. API 클라이언트
|
|
1518
|
+
- 공식 SDK 사용 여부
|
|
1519
|
+
- 클라이언트 초기화
|
|
1520
|
+
- 설정 관리
|
|
1521
|
+
- 타임아웃 설정
|
|
1522
|
+
|
|
1523
|
+
### 2. 요청 처리
|
|
1524
|
+
- 토큰 카운팅
|
|
1525
|
+
- 요청 크기 최적화
|
|
1526
|
+
- 배치 처리
|
|
1527
|
+
- 비동기 요청 관리
|
|
1528
|
+
|
|
1529
|
+
### 3. 응답 처리
|
|
1530
|
+
- 스트리밍 처리
|
|
1531
|
+
- 응답 파싱
|
|
1532
|
+
- 에러 코드 처리
|
|
1533
|
+
- 재시도 로직
|
|
1534
|
+
|
|
1535
|
+
### 4. 비용 관리
|
|
1536
|
+
- 토큰 사용량 추적
|
|
1537
|
+
- 모델 선택 최적화
|
|
1538
|
+
- 캐싱 전략
|
|
1539
|
+
- 비용 알림
|
|
1540
|
+
|
|
1541
|
+
### 5. 에러 핸들링
|
|
1542
|
+
- Rate Limit 처리
|
|
1543
|
+
- 네트워크 에러
|
|
1544
|
+
- 컨텍스트 길이 초과
|
|
1545
|
+
- 콘텐츠 필터 에러
|
|
1546
|
+
|
|
1547
|
+
### 6. 보안
|
|
1548
|
+
- API 키 관리
|
|
1549
|
+
- 요청 로깅 (민감정보 제외)
|
|
1550
|
+
- 사용자 데이터 처리`,
|
|
1551
|
+
},
|
|
1552
|
+
|
|
1553
|
+
rag: {
|
|
1554
|
+
name: "RAG 시스템",
|
|
1555
|
+
description: "Retrieval Augmented Generation 시스템 관점 리뷰",
|
|
1556
|
+
tags: ["ai", "rag", "vector"],
|
|
1557
|
+
prompt: `RAG (Retrieval Augmented Generation) 시스템 관점에서 코드를 리뷰해주세요:
|
|
1558
|
+
|
|
1559
|
+
## 검토 항목
|
|
1560
|
+
|
|
1561
|
+
### 1. 문서 처리
|
|
1562
|
+
- 문서 로딩 방식
|
|
1563
|
+
- 청킹 전략 (크기, 오버랩)
|
|
1564
|
+
- 메타데이터 추출
|
|
1565
|
+
- 문서 전처리
|
|
1566
|
+
|
|
1567
|
+
### 2. 임베딩
|
|
1568
|
+
- 임베딩 모델 선택
|
|
1569
|
+
- 배치 임베딩 처리
|
|
1570
|
+
- 임베딩 캐싱
|
|
1571
|
+
- 차원 최적화
|
|
1572
|
+
|
|
1573
|
+
### 3. 벡터 저장소
|
|
1574
|
+
- 벡터 DB 선택 (Pinecone, Weaviate, Chroma 등)
|
|
1575
|
+
- 인덱스 전략
|
|
1576
|
+
- 메타데이터 필터링
|
|
1577
|
+
- 하이브리드 검색
|
|
1578
|
+
|
|
1579
|
+
### 4. 검색
|
|
1580
|
+
- 유사도 검색 알고리즘
|
|
1581
|
+
- Top-K 선택
|
|
1582
|
+
- 리랭킹 전략
|
|
1583
|
+
- 검색 품질 평가
|
|
1584
|
+
|
|
1585
|
+
### 5. 컨텍스트 조합
|
|
1586
|
+
- 검색 결과 병합
|
|
1587
|
+
- 컨텍스트 압축
|
|
1588
|
+
- 소스 인용
|
|
1589
|
+
- 중복 제거
|
|
1590
|
+
|
|
1591
|
+
### 6. 응답 생성
|
|
1592
|
+
- 프롬프트 구성
|
|
1593
|
+
- 소스 기반 응답 강제
|
|
1594
|
+
- 할루시네이션 방지
|
|
1595
|
+
- 응답 검증`,
|
|
1596
|
+
},
|
|
1597
|
+
|
|
1598
|
+
aiAgent: {
|
|
1599
|
+
name: "AI 에이전트",
|
|
1600
|
+
description: "자율적 AI 에이전트 시스템 관점 리뷰",
|
|
1601
|
+
tags: ["ai", "agent", "autonomous"],
|
|
1602
|
+
prompt: `AI 에이전트 시스템 관점에서 코드를 리뷰해주세요:
|
|
1603
|
+
|
|
1604
|
+
## 검토 항목
|
|
1605
|
+
|
|
1606
|
+
### 1. 에이전트 아키텍처
|
|
1607
|
+
- 계획-실행-관찰 루프
|
|
1608
|
+
- 상태 관리
|
|
1609
|
+
- 메모리 시스템
|
|
1610
|
+
- 목표 분해
|
|
1611
|
+
|
|
1612
|
+
### 2. 도구 사용
|
|
1613
|
+
- 도구 정의 및 스키마
|
|
1614
|
+
- 도구 선택 로직
|
|
1615
|
+
- 도구 실행 결과 처리
|
|
1616
|
+
- 도구 에러 핸들링
|
|
1617
|
+
|
|
1618
|
+
### 3. 의사결정
|
|
1619
|
+
- 추론 체인
|
|
1620
|
+
- 자기 반성 메커니즘
|
|
1621
|
+
- 불확실성 처리
|
|
1622
|
+
- 휴먼 인 더 루프
|
|
1623
|
+
|
|
1624
|
+
### 4. 안전성
|
|
1625
|
+
- 액션 검증
|
|
1626
|
+
- 샌드박스 실행
|
|
1627
|
+
- 권한 제한
|
|
1628
|
+
- 무한 루프 방지
|
|
1629
|
+
|
|
1630
|
+
### 5. 관찰 가능성
|
|
1631
|
+
- 추론 과정 로깅
|
|
1632
|
+
- 디버깅 지원
|
|
1633
|
+
- 실행 추적
|
|
1634
|
+
- 성능 모니터링
|
|
1635
|
+
|
|
1636
|
+
### 6. 멀티 에이전트
|
|
1637
|
+
- 에이전트 간 통신
|
|
1638
|
+
- 역할 분담
|
|
1639
|
+
- 협업 패턴
|
|
1640
|
+
- 충돌 해결`,
|
|
1641
|
+
},
|
|
1642
|
+
|
|
1643
|
+
mlOps: {
|
|
1644
|
+
name: "MLOps",
|
|
1645
|
+
description: "ML 모델 배포 및 운영 관점 리뷰",
|
|
1646
|
+
tags: ["ai", "mlops", "deployment"],
|
|
1647
|
+
prompt: `MLOps 관점에서 코드를 리뷰해주세요:
|
|
1648
|
+
|
|
1649
|
+
## 검토 항목
|
|
1650
|
+
|
|
1651
|
+
### 1. 모델 관리
|
|
1652
|
+
- 모델 버저닝
|
|
1653
|
+
- 모델 레지스트리
|
|
1654
|
+
- 아티팩트 저장
|
|
1655
|
+
- 메타데이터 추적
|
|
1656
|
+
|
|
1657
|
+
### 2. 실험 추적
|
|
1658
|
+
- 하이퍼파라미터 로깅
|
|
1659
|
+
- 메트릭 기록
|
|
1660
|
+
- 실험 비교
|
|
1661
|
+
- 재현성
|
|
1662
|
+
|
|
1663
|
+
### 3. 파이프라인
|
|
1664
|
+
- 데이터 파이프라인
|
|
1665
|
+
- 학습 파이프라인
|
|
1666
|
+
- 평가 파이프라인
|
|
1667
|
+
- 배포 파이프라인
|
|
1668
|
+
|
|
1669
|
+
### 4. 서빙
|
|
1670
|
+
- 모델 서빙 방식
|
|
1671
|
+
- 배치 vs 실시간
|
|
1672
|
+
- A/B 테스트
|
|
1673
|
+
- 카나리 배포
|
|
1674
|
+
|
|
1675
|
+
### 5. 모니터링
|
|
1676
|
+
- 모델 성능 모니터링
|
|
1677
|
+
- 데이터 드리프트 감지
|
|
1678
|
+
- 예측 분포 추적
|
|
1679
|
+
- 알림 설정
|
|
1680
|
+
|
|
1681
|
+
### 6. 거버넌스
|
|
1682
|
+
- 모델 문서화
|
|
1683
|
+
- 감사 추적
|
|
1684
|
+
- 편향 모니터링
|
|
1685
|
+
- 규정 준수`,
|
|
1686
|
+
},
|
|
1687
|
+
|
|
1688
|
+
promptEngineering: {
|
|
1689
|
+
name: "프롬프트 엔지니어링",
|
|
1690
|
+
description: "프롬프트 설계 및 최적화 관점 리뷰",
|
|
1691
|
+
tags: ["ai", "prompt", "engineering"],
|
|
1692
|
+
prompt: `프롬프트 엔지니어링 관점에서 코드를 리뷰해주세요:
|
|
1693
|
+
|
|
1694
|
+
## 검토 항목
|
|
1695
|
+
|
|
1696
|
+
### 1. 프롬프트 구조
|
|
1697
|
+
- 시스템/사용자/어시스턴트 역할 분리
|
|
1698
|
+
- 명확한 지시사항
|
|
1699
|
+
- 형식 지정
|
|
1700
|
+
- 제약 조건 명시
|
|
1701
|
+
|
|
1702
|
+
### 2. 프롬프트 템플릿
|
|
1703
|
+
- 변수 치환 방식
|
|
1704
|
+
- 조건부 섹션
|
|
1705
|
+
- 템플릿 재사용성
|
|
1706
|
+
- 버저닝
|
|
1707
|
+
|
|
1708
|
+
### 3. 기법 적용
|
|
1709
|
+
- Few-shot 예제 품질
|
|
1710
|
+
- Chain-of-Thought 유도
|
|
1711
|
+
- 역할 부여
|
|
1712
|
+
- 출력 형식 지정
|
|
1713
|
+
|
|
1714
|
+
### 4. 프롬프트 관리
|
|
1715
|
+
- 프롬프트 저장/로드
|
|
1716
|
+
- A/B 테스트 지원
|
|
1717
|
+
- 프롬프트 히스토리
|
|
1718
|
+
- 성능 추적
|
|
1719
|
+
|
|
1720
|
+
### 5. 최적화
|
|
1721
|
+
- 토큰 효율성
|
|
1722
|
+
- 불필요한 텍스트 제거
|
|
1723
|
+
- 압축 기법
|
|
1724
|
+
- 캐싱
|
|
1725
|
+
|
|
1726
|
+
### 6. 안전성
|
|
1727
|
+
- 프롬프트 인젝션 방어
|
|
1728
|
+
- 탈옥 방지
|
|
1729
|
+
- 출력 검증
|
|
1730
|
+
- 민감 정보 필터링`,
|
|
1731
|
+
},
|
|
1732
|
+
|
|
1733
|
+
vectorDB: {
|
|
1734
|
+
name: "벡터 데이터베이스",
|
|
1735
|
+
description: "벡터 DB 활용 및 최적화 관점 리뷰",
|
|
1736
|
+
tags: ["ai", "vector", "database"],
|
|
1737
|
+
prompt: `벡터 데이터베이스 활용 관점에서 코드를 리뷰해주세요:
|
|
1738
|
+
|
|
1739
|
+
## 검토 항목
|
|
1740
|
+
|
|
1741
|
+
### 1. 인덱스 설계
|
|
1742
|
+
- 인덱스 타입 선택 (HNSW, IVF 등)
|
|
1743
|
+
- 파라미터 튜닝
|
|
1744
|
+
- 메모리 vs 정확도 트레이드오프
|
|
1745
|
+
|
|
1746
|
+
### 2. 데이터 모델링
|
|
1747
|
+
- 벡터 차원 최적화
|
|
1748
|
+
- 메타데이터 스키마
|
|
1749
|
+
- 네임스페이스/컬렉션 구조
|
|
1750
|
+
|
|
1751
|
+
### 3. 쿼리 최적화
|
|
1752
|
+
- 필터링 전략
|
|
1753
|
+
- Top-K 설정
|
|
1754
|
+
- 하이브리드 검색 (벡터 + 키워드)
|
|
1755
|
+
|
|
1756
|
+
### 4. 데이터 관리
|
|
1757
|
+
- 배치 업서트
|
|
1758
|
+
- 삭제 전략
|
|
1759
|
+
- 백업/복구
|
|
1760
|
+
- 동기화
|
|
1761
|
+
|
|
1762
|
+
### 5. 성능
|
|
1763
|
+
- 쿼리 지연 시간
|
|
1764
|
+
- 처리량 최적화
|
|
1765
|
+
- 커넥션 풀링
|
|
1766
|
+
- 캐싱 전략
|
|
1767
|
+
|
|
1768
|
+
### 6. 운영
|
|
1769
|
+
- 모니터링 메트릭
|
|
1770
|
+
- 스케일링 전략
|
|
1771
|
+
- 비용 최적화`,
|
|
1772
|
+
},
|
|
1773
|
+
|
|
1774
|
+
langchain: {
|
|
1775
|
+
name: "LangChain",
|
|
1776
|
+
description: "LangChain 프레임워크 베스트 프랙티스 리뷰",
|
|
1777
|
+
tags: ["ai", "langchain", "framework"],
|
|
1778
|
+
prompt: `LangChain 베스트 프랙티스 기준으로 코드를 리뷰해주세요:
|
|
1779
|
+
|
|
1780
|
+
## 검토 항목
|
|
1781
|
+
|
|
1782
|
+
### 1. 체인 설계
|
|
1783
|
+
- LCEL (LangChain Expression Language) 활용
|
|
1784
|
+
- 체인 조합 패턴
|
|
1785
|
+
- Runnable 인터페이스 활용
|
|
1786
|
+
|
|
1787
|
+
### 2. 프롬프트
|
|
1788
|
+
- PromptTemplate 사용
|
|
1789
|
+
- ChatPromptTemplate 구조
|
|
1790
|
+
- 동적 프롬프트 생성
|
|
1791
|
+
|
|
1792
|
+
### 3. 메모리
|
|
1793
|
+
- 적절한 메모리 타입 선택
|
|
1794
|
+
- 메모리 크기 관리
|
|
1795
|
+
- 커스텀 메모리 구현
|
|
1796
|
+
|
|
1797
|
+
### 4. 에이전트
|
|
1798
|
+
- 도구 정의
|
|
1799
|
+
- 에이전트 타입 선택
|
|
1800
|
+
- 에이전트 실행기 설정
|
|
1801
|
+
|
|
1802
|
+
### 5. 검색
|
|
1803
|
+
- 문서 로더 활용
|
|
1804
|
+
- 텍스트 스플리터 설정
|
|
1805
|
+
- 리트리버 구성
|
|
1806
|
+
|
|
1807
|
+
### 6. 콜백
|
|
1808
|
+
- 콜백 핸들러 구현
|
|
1809
|
+
- 스트리밍 처리
|
|
1810
|
+
- 로깅/추적`,
|
|
1811
|
+
},
|
|
1812
|
+
};
|
|
1813
|
+
|
|
1814
|
+
/**
|
|
1815
|
+
* Quality Presets
|
|
1816
|
+
* 코드 품질 관련 프리셋
|
|
1817
|
+
*/
|
|
1818
|
+
export const QUALITY_PRESETS: PresetRegistry = {
|
|
1819
|
+
cleanCode: {
|
|
1820
|
+
name: "클린 코드",
|
|
1821
|
+
description: "클린 코드 원칙 기반 리뷰",
|
|
1822
|
+
tags: ["quality", "clean-code"],
|
|
1823
|
+
prompt: `클린 코드 원칙에 따라 코드를 리뷰해주세요:
|
|
1824
|
+
|
|
1825
|
+
## 검토 항목
|
|
1826
|
+
|
|
1827
|
+
### 1. 의미 있는 이름
|
|
1828
|
+
- 의도를 나타내는 이름
|
|
1829
|
+
- 발음 가능한 이름
|
|
1830
|
+
- 검색 가능한 이름
|
|
1831
|
+
- 클래스/메서드 네이밍 규칙
|
|
1832
|
+
|
|
1833
|
+
### 2. 함수
|
|
1834
|
+
- 작게 만들기 (20줄 이하)
|
|
1835
|
+
- 한 가지만 하기
|
|
1836
|
+
- 추상화 수준 일관성
|
|
1837
|
+
- 부수 효과 없애기
|
|
1838
|
+
|
|
1839
|
+
### 3. 주석
|
|
1840
|
+
- 코드로 의도 표현
|
|
1841
|
+
- 불필요한 주석 제거
|
|
1842
|
+
- TODO, FIXME 정리
|
|
1843
|
+
|
|
1844
|
+
### 4. 형식 맞추기
|
|
1845
|
+
- 적절한 줄 길이
|
|
1846
|
+
- 세로 밀집도
|
|
1847
|
+
- 가로 공백
|
|
1848
|
+
|
|
1849
|
+
### 5. 객체와 자료 구조
|
|
1850
|
+
- 자료 추상화
|
|
1851
|
+
- 디미터 법칙
|
|
1852
|
+
- DTO 분리
|
|
1853
|
+
|
|
1854
|
+
### 6. 오류 처리
|
|
1855
|
+
- 예외 사용
|
|
1856
|
+
- 미확인 예외 사용
|
|
1857
|
+
- 예외에 의미 담기
|
|
1858
|
+
|
|
1859
|
+
### 7. 경계
|
|
1860
|
+
- 외부 코드 깔끔하게 사용
|
|
1861
|
+
- 어댑터 패턴 활용`,
|
|
1862
|
+
},
|
|
1863
|
+
|
|
1864
|
+
refactoring: {
|
|
1865
|
+
name: "리팩토링 기회",
|
|
1866
|
+
description: "리팩토링이 필요한 코드 스멜 식별",
|
|
1867
|
+
tags: ["quality", "refactoring"],
|
|
1868
|
+
prompt: `리팩토링 관점에서 코드 스멜을 식별해주세요:
|
|
1869
|
+
|
|
1870
|
+
## 코드 스멜 체크리스트
|
|
1871
|
+
|
|
1872
|
+
### 1. 블로터 (Bloaters)
|
|
1873
|
+
- 긴 메서드
|
|
1874
|
+
- 큰 클래스
|
|
1875
|
+
- 기본 타입 집착
|
|
1876
|
+
- 긴 매개변수 목록
|
|
1877
|
+
- 데이터 덩어리
|
|
1878
|
+
|
|
1879
|
+
### 2. 객체 지향 남용 (OO Abusers)
|
|
1880
|
+
- Switch 문
|
|
1881
|
+
- 임시 필드
|
|
1882
|
+
- 거부된 유산
|
|
1883
|
+
- 다른 인터페이스를 가진 대안 클래스
|
|
1884
|
+
|
|
1885
|
+
### 3. 변경 방해꾼 (Change Preventers)
|
|
1886
|
+
- 산탄총 수술
|
|
1887
|
+
- 평행 상속 계층
|
|
1888
|
+
- 발산적 변경
|
|
1889
|
+
|
|
1890
|
+
### 4. 생략 가능 요소 (Dispensables)
|
|
1891
|
+
- 중복 코드
|
|
1892
|
+
- 게으른 클래스
|
|
1893
|
+
- 데이터 클래스
|
|
1894
|
+
- 죽은 코드
|
|
1895
|
+
- 추측 일반성
|
|
1896
|
+
|
|
1897
|
+
### 5. 결합 (Couplers)
|
|
1898
|
+
- 기능 선망
|
|
1899
|
+
- 부적절한 친밀
|
|
1900
|
+
- 메시지 체인
|
|
1901
|
+
- 중재자
|
|
1902
|
+
- 불완전한 라이브러리 클래스
|
|
1903
|
+
|
|
1904
|
+
## 리팩토링 제안
|
|
1905
|
+
각 스멜에 대해 구체적인 리팩토링 기법을 제안해주세요.`,
|
|
1906
|
+
},
|
|
1907
|
+
|
|
1908
|
+
documentation: {
|
|
1909
|
+
name: "문서화",
|
|
1910
|
+
description: "코드 문서화 및 주석 관점 리뷰",
|
|
1911
|
+
tags: ["quality", "documentation"],
|
|
1912
|
+
prompt: `코드 문서화 관점에서 리뷰해주세요:
|
|
1913
|
+
|
|
1914
|
+
## 검토 항목
|
|
1915
|
+
|
|
1916
|
+
### 1. API 문서화
|
|
1917
|
+
- 공개 API 문서 존재
|
|
1918
|
+
- 파라미터 설명
|
|
1919
|
+
- 반환값 설명
|
|
1920
|
+
- 예외/에러 설명
|
|
1921
|
+
- 사용 예제
|
|
1922
|
+
|
|
1923
|
+
### 2. 코드 주석
|
|
1924
|
+
- 복잡한 로직 설명
|
|
1925
|
+
- 비즈니스 규칙 명시
|
|
1926
|
+
- 왜(Why) 설명 (What 아님)
|
|
1927
|
+
- 경고/주의사항
|
|
1928
|
+
|
|
1929
|
+
### 3. README
|
|
1930
|
+
- 프로젝트 개요
|
|
1931
|
+
- 설치 방법
|
|
1932
|
+
- 사용법
|
|
1933
|
+
- 설정 설명
|
|
1934
|
+
|
|
1935
|
+
### 4. 인라인 문서
|
|
1936
|
+
- JSDoc/TSDoc/Docstring
|
|
1937
|
+
- 타입 설명
|
|
1938
|
+
- deprecated 표시
|
|
1939
|
+
- see also 참조
|
|
1940
|
+
|
|
1941
|
+
### 5. 아키텍처 문서
|
|
1942
|
+
- 시스템 구조 설명
|
|
1943
|
+
- 의사결정 기록 (ADR)
|
|
1944
|
+
- 다이어그램`,
|
|
1945
|
+
},
|
|
1946
|
+
|
|
1947
|
+
maintainability: {
|
|
1948
|
+
name: "유지보수성",
|
|
1949
|
+
description: "장기적 유지보수 관점 리뷰",
|
|
1950
|
+
tags: ["quality", "maintainability"],
|
|
1951
|
+
prompt: `코드 유지보수성 관점에서 리뷰해주세요:
|
|
1952
|
+
|
|
1953
|
+
## 검토 항목
|
|
1954
|
+
|
|
1955
|
+
### 1. 가독성
|
|
1956
|
+
- 코드 자체 문서화
|
|
1957
|
+
- 일관된 스타일
|
|
1958
|
+
- 적절한 추상화 수준
|
|
1959
|
+
- 명확한 제어 흐름
|
|
1960
|
+
|
|
1961
|
+
### 2. 모듈성
|
|
1962
|
+
- 단일 책임
|
|
1963
|
+
- 낮은 결합도
|
|
1964
|
+
- 높은 응집도
|
|
1965
|
+
- 명확한 인터페이스
|
|
1966
|
+
|
|
1967
|
+
### 3. 테스트 가능성
|
|
1968
|
+
- 의존성 주입
|
|
1969
|
+
- 순수 함수
|
|
1970
|
+
- 부수 효과 격리
|
|
1971
|
+
- 모킹 용이성
|
|
1972
|
+
|
|
1973
|
+
### 4. 확장성
|
|
1974
|
+
- 열린-닫힌 원칙
|
|
1975
|
+
- 플러그인 구조
|
|
1976
|
+
- 설정 외부화
|
|
1977
|
+
|
|
1978
|
+
### 5. 디버깅 용이성
|
|
1979
|
+
- 명확한 에러 메시지
|
|
1980
|
+
- 충분한 로깅
|
|
1981
|
+
- 스택 트레이스 보존
|
|
1982
|
+
|
|
1983
|
+
### 6. 기술 부채
|
|
1984
|
+
- 임시 해결책 식별
|
|
1985
|
+
- TODO 항목 정리
|
|
1986
|
+
- 레거시 코드 표시`,
|
|
1987
|
+
},
|
|
1988
|
+
};
|
|
1989
|
+
|
|
1990
|
+
/**
|
|
1991
|
+
* All presets combined
|
|
1992
|
+
*/
|
|
1993
|
+
export const ALL_PRESETS: PresetRegistry = {
|
|
1994
|
+
...EXPERIENCE_PRESETS,
|
|
1995
|
+
...PERSPECTIVE_PRESETS,
|
|
1996
|
+
...FRAMEWORK_PRESETS,
|
|
1997
|
+
...DOMAIN_PRESETS,
|
|
1998
|
+
...LANGUAGE_PRESETS,
|
|
1999
|
+
...AI_PRESETS,
|
|
2000
|
+
...QUALITY_PRESETS,
|
|
2001
|
+
};
|
|
2002
|
+
|
|
2003
|
+
/**
|
|
2004
|
+
* Get preset by key
|
|
2005
|
+
*/
|
|
2006
|
+
export function getPreset(key: string): ReviewPreset | undefined {
|
|
2007
|
+
return ALL_PRESETS[key];
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
/**
|
|
2011
|
+
* Get multiple presets by keys
|
|
2012
|
+
*/
|
|
2013
|
+
export function getPresets(keys: string[]): ReviewPreset[] {
|
|
2014
|
+
return keys.map((key) => ALL_PRESETS[key]).filter(Boolean);
|
|
2015
|
+
}
|
|
2016
|
+
|
|
2017
|
+
/**
|
|
2018
|
+
* Search presets by tag
|
|
2019
|
+
*/
|
|
2020
|
+
export function getPresetsByTag(tag: string): ReviewPreset[] {
|
|
2021
|
+
return Object.values(ALL_PRESETS).filter((preset) =>
|
|
2022
|
+
preset.tags.includes(tag)
|
|
2023
|
+
);
|
|
2024
|
+
}
|
|
2025
|
+
|
|
2026
|
+
/**
|
|
2027
|
+
* Get all preset keys
|
|
2028
|
+
*/
|
|
2029
|
+
export function getAllPresetKeys(): string[] {
|
|
2030
|
+
return Object.keys(ALL_PRESETS);
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
/**
|
|
2034
|
+
* Combine multiple presets into a single prompt
|
|
2035
|
+
*/
|
|
2036
|
+
export function combinePresets(keys: string[], customPrompt?: string): string {
|
|
2037
|
+
const presets = getPresets(keys);
|
|
2038
|
+
|
|
2039
|
+
if (presets.length === 0 && !customPrompt) {
|
|
2040
|
+
return "";
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
const sections: string[] = [];
|
|
2044
|
+
|
|
2045
|
+
// Add header
|
|
2046
|
+
if (presets.length > 0) {
|
|
2047
|
+
const presetNames = presets.map((p) => p.name).join(", ");
|
|
2048
|
+
sections.push(`# 코드 리뷰 가이드\n\n선택된 프리셋: ${presetNames}\n`);
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
// Add each preset
|
|
2052
|
+
presets.forEach((preset, index) => {
|
|
2053
|
+
sections.push(`---\n\n## ${index + 1}. ${preset.name}\n\n${preset.prompt}`);
|
|
2054
|
+
});
|
|
2055
|
+
|
|
2056
|
+
// Add custom prompt
|
|
2057
|
+
if (customPrompt) {
|
|
2058
|
+
sections.push(`---\n\n## 추가 지시사항\n\n${customPrompt}`);
|
|
2059
|
+
}
|
|
2060
|
+
|
|
2061
|
+
return sections.join("\n\n");
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
/**
|
|
2065
|
+
* Get preset categories for display
|
|
2066
|
+
*/
|
|
2067
|
+
export function getPresetCategories(): Array<{
|
|
2068
|
+
category: PresetCategory;
|
|
2069
|
+
name: string;
|
|
2070
|
+
presets: Array<{ key: string; preset: ReviewPreset }>;
|
|
2071
|
+
}> {
|
|
2072
|
+
return [
|
|
2073
|
+
{
|
|
2074
|
+
category: "experience",
|
|
2075
|
+
name: "경험 레벨",
|
|
2076
|
+
presets: Object.entries(EXPERIENCE_PRESETS).map(([key, preset]) => ({
|
|
2077
|
+
key,
|
|
2078
|
+
preset,
|
|
2079
|
+
})),
|
|
2080
|
+
},
|
|
2081
|
+
{
|
|
2082
|
+
category: "perspective",
|
|
2083
|
+
name: "리뷰 관점",
|
|
2084
|
+
presets: Object.entries(PERSPECTIVE_PRESETS).map(([key, preset]) => ({
|
|
2085
|
+
key,
|
|
2086
|
+
preset,
|
|
2087
|
+
})),
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
category: "framework",
|
|
2091
|
+
name: "프레임워크",
|
|
2092
|
+
presets: Object.entries(FRAMEWORK_PRESETS).map(([key, preset]) => ({
|
|
2093
|
+
key,
|
|
2094
|
+
preset,
|
|
2095
|
+
})),
|
|
2096
|
+
},
|
|
2097
|
+
{
|
|
2098
|
+
category: "domain",
|
|
2099
|
+
name: "도메인",
|
|
2100
|
+
presets: Object.entries(DOMAIN_PRESETS).map(([key, preset]) => ({
|
|
2101
|
+
key,
|
|
2102
|
+
preset,
|
|
2103
|
+
})),
|
|
2104
|
+
},
|
|
2105
|
+
{
|
|
2106
|
+
category: "language",
|
|
2107
|
+
name: "프로그래밍 언어",
|
|
2108
|
+
presets: Object.entries(LANGUAGE_PRESETS).map(([key, preset]) => ({
|
|
2109
|
+
key,
|
|
2110
|
+
preset,
|
|
2111
|
+
})),
|
|
2112
|
+
},
|
|
2113
|
+
{
|
|
2114
|
+
category: "ai",
|
|
2115
|
+
name: "AI/ML",
|
|
2116
|
+
presets: Object.entries(AI_PRESETS).map(([key, preset]) => ({
|
|
2117
|
+
key,
|
|
2118
|
+
preset,
|
|
2119
|
+
})),
|
|
2120
|
+
},
|
|
2121
|
+
{
|
|
2122
|
+
category: "quality",
|
|
2123
|
+
name: "코드 품질",
|
|
2124
|
+
presets: Object.entries(QUALITY_PRESETS).map(([key, preset]) => ({
|
|
2125
|
+
key,
|
|
2126
|
+
preset,
|
|
2127
|
+
})),
|
|
2128
|
+
},
|
|
2129
|
+
];
|
|
2130
|
+
}
|