@su-record/vibe 2.2.2 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +152 -152
- package/.claude/vibe/constitution.md +184 -184
- package/.claude/vibe/rules/core/communication-guide.md +104 -104
- package/.claude/vibe/rules/core/development-philosophy.md +52 -52
- package/.claude/vibe/rules/core/quick-start.md +120 -120
- package/.claude/vibe/rules/quality/bdd-contract-testing.md +388 -388
- package/.claude/vibe/rules/quality/checklist.md +276 -276
- package/.claude/vibe/rules/quality/testing-strategy.md +437 -437
- package/.claude/vibe/rules/standards/anti-patterns.md +369 -369
- package/.claude/vibe/rules/standards/code-structure.md +291 -291
- package/.claude/vibe/rules/standards/complexity-metrics.md +312 -312
- package/.claude/vibe/rules/standards/naming-conventions.md +198 -198
- package/.claude/vibe/setup.sh +31 -31
- package/CLAUDE.md +323 -323
- package/LICENSE +21 -21
- package/README.md +724 -721
- package/agents/explorer.md +48 -0
- package/agents/implementer.md +53 -0
- package/agents/research/best-practices-agent.md +139 -0
- package/agents/research/codebase-patterns-agent.md +147 -0
- package/agents/research/framework-docs-agent.md +181 -0
- package/agents/research/security-advisory-agent.md +167 -0
- package/agents/review/architecture-reviewer.md +107 -0
- package/agents/review/complexity-reviewer.md +116 -0
- package/agents/review/data-integrity-reviewer.md +88 -0
- package/agents/review/git-history-reviewer.md +103 -0
- package/agents/review/performance-reviewer.md +86 -0
- package/agents/review/python-reviewer.md +152 -0
- package/agents/review/rails-reviewer.md +139 -0
- package/agents/review/react-reviewer.md +144 -0
- package/agents/review/security-reviewer.md +80 -0
- package/agents/review/simplicity-reviewer.md +140 -0
- package/agents/review/test-coverage-reviewer.md +116 -0
- package/agents/review/typescript-reviewer.md +127 -0
- package/agents/searcher.md +54 -0
- package/agents/simplifier.md +119 -0
- package/agents/tester.md +49 -0
- package/commands/vibe.analyze.md +239 -0
- package/commands/vibe.compound.md +261 -0
- package/commands/vibe.continue.md +88 -0
- package/commands/vibe.diagram.md +178 -0
- package/commands/vibe.e2e.md +266 -0
- package/commands/vibe.reason.md +306 -0
- package/commands/vibe.review.md +324 -0
- package/commands/vibe.run.md +836 -0
- package/commands/vibe.setup.md +97 -0
- package/commands/vibe.spec.md +383 -0
- package/commands/vibe.ui.md +137 -0
- package/commands/vibe.verify.md +238 -0
- package/dist/cli/index.js +389 -389
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/MemoryManager.js +92 -92
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/gemini-mcp.js +15 -15
- package/dist/lib/gemini-oauth.js +35 -35
- package/dist/lib/gpt-mcp.js +17 -17
- package/dist/lib/gpt-oauth.js +44 -44
- package/dist/tools/analytics/getUsageAnalytics.js +12 -12
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
- package/dist/tools/planning/generatePrd.js +46 -46
- package/dist/tools/prompt/enhancePromptGemini.js +160 -160
- package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/package.json +69 -66
- package/skills/git-worktree.md +178 -0
- package/skills/priority-todos.md +236 -0
- package/templates/constitution-template.md +184 -184
- package/templates/contract-backend-template.md +517 -517
- package/templates/contract-frontend-template.md +594 -594
- package/templates/feature-template.md +96 -96
- package/templates/hooks-template.json +103 -103
- package/templates/spec-template.md +199 -199
- package/.claude/vibe/rules/tools/mcp-hi-ai-guide.md +0 -665
- package/.claude/vibe/rules/tools/mcp-workflow.md +0 -51
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Python Reviewer Agent
|
|
2
|
+
|
|
3
|
+
Python 코드 전문 리뷰 에이전트
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- PEP 8 스타일 가이드 준수
|
|
8
|
+
- 타입 힌트 검증
|
|
9
|
+
- Pythonic 패턴 제안
|
|
10
|
+
- async/await 패턴 검토
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - 빠른 병렬 실행
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
### PEP 8 Style
|
|
19
|
+
- [ ] 네이밍: snake_case (변수/함수), PascalCase (클래스)?
|
|
20
|
+
- [ ] 라인 길이 ≤ 88 (black 기준)?
|
|
21
|
+
- [ ] import 순서: stdlib → third-party → local?
|
|
22
|
+
- [ ] 공백 규칙 준수?
|
|
23
|
+
|
|
24
|
+
### Type Hints (PEP 484)
|
|
25
|
+
- [ ] 함수 파라미터 타입 힌트?
|
|
26
|
+
- [ ] 반환 타입 명시?
|
|
27
|
+
- [ ] Optional 대신 `T | None` (Python 3.10+)?
|
|
28
|
+
- [ ] TypedDict, Protocol 적절히 사용?
|
|
29
|
+
|
|
30
|
+
### Pythonic Patterns
|
|
31
|
+
- [ ] List comprehension 적절히 사용?
|
|
32
|
+
- [ ] Context manager (with) 사용?
|
|
33
|
+
- [ ] enumerate 대신 range(len())?
|
|
34
|
+
- [ ] f-string 사용?
|
|
35
|
+
- [ ] walrus operator (:=) 적절히 사용?
|
|
36
|
+
|
|
37
|
+
### Error Handling
|
|
38
|
+
- [ ] 구체적 예외 타입 사용?
|
|
39
|
+
- [ ] bare except 금지?
|
|
40
|
+
- [ ] 예외 체이닝 (from e)?
|
|
41
|
+
- [ ] 적절한 로깅?
|
|
42
|
+
|
|
43
|
+
### Async/Await
|
|
44
|
+
- [ ] sync 함수에서 async 호출?
|
|
45
|
+
- [ ] asyncio.gather 활용?
|
|
46
|
+
- [ ] 적절한 timeout 설정?
|
|
47
|
+
- [ ] 리소스 정리 (async with)?
|
|
48
|
+
|
|
49
|
+
### Security
|
|
50
|
+
- [ ] eval/exec 사용 금지?
|
|
51
|
+
- [ ] pickle untrusted data?
|
|
52
|
+
- [ ] SQL 파라미터화?
|
|
53
|
+
- [ ] 민감 정보 로깅?
|
|
54
|
+
|
|
55
|
+
### Performance
|
|
56
|
+
- [ ] 제너레이터 활용 (대용량)?
|
|
57
|
+
- [ ] `__slots__` 사용 고려?
|
|
58
|
+
- [ ] lru_cache 데코레이터?
|
|
59
|
+
- [ ] 불필요한 리스트 변환?
|
|
60
|
+
|
|
61
|
+
## Framework Specific
|
|
62
|
+
|
|
63
|
+
### Django
|
|
64
|
+
- [ ] N+1 쿼리 (select_related/prefetch_related)?
|
|
65
|
+
- [ ] QuerySet 지연 평가 이해?
|
|
66
|
+
- [ ] 트랜잭션 관리?
|
|
67
|
+
- [ ] migration 가역성?
|
|
68
|
+
|
|
69
|
+
### FastAPI
|
|
70
|
+
- [ ] Pydantic 모델 적절?
|
|
71
|
+
- [ ] 의존성 주입 활용?
|
|
72
|
+
- [ ] async 라우트?
|
|
73
|
+
- [ ] 응답 모델 정의?
|
|
74
|
+
|
|
75
|
+
### SQLAlchemy
|
|
76
|
+
- [ ] Session 관리?
|
|
77
|
+
- [ ] N+1 (joinedload/selectinload)?
|
|
78
|
+
- [ ] 트랜잭션 범위?
|
|
79
|
+
- [ ] 연결 풀 설정?
|
|
80
|
+
|
|
81
|
+
## Output Format
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
## 🐍 Python Review
|
|
85
|
+
|
|
86
|
+
### 🔴 P1 Critical
|
|
87
|
+
1. **Missing Type Hints in Public API**
|
|
88
|
+
- 📍 Location: src/services/user.py:get_user()
|
|
89
|
+
- 💡 Fix: Add `def get_user(user_id: int) -> User | None:`
|
|
90
|
+
|
|
91
|
+
### 🟡 P2 Important
|
|
92
|
+
2. **Bare Except Clause**
|
|
93
|
+
- 📍 Location: src/utils/parser.py:45
|
|
94
|
+
```python
|
|
95
|
+
# Bad
|
|
96
|
+
except:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
# Good
|
|
100
|
+
except ValueError as e:
|
|
101
|
+
logger.error(f"Parse error: {e}")
|
|
102
|
+
raise
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 🔵 P3 Suggestions
|
|
106
|
+
3. **Use List Comprehension**
|
|
107
|
+
- 📍 Location: src/api/orders.py:23
|
|
108
|
+
```python
|
|
109
|
+
# Before
|
|
110
|
+
result = []
|
|
111
|
+
for item in items:
|
|
112
|
+
if item.active:
|
|
113
|
+
result.append(item.name)
|
|
114
|
+
|
|
115
|
+
# After
|
|
116
|
+
result = [item.name for item in items if item.active]
|
|
117
|
+
```
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Usage
|
|
121
|
+
|
|
122
|
+
```text
|
|
123
|
+
Task(
|
|
124
|
+
model: "haiku",
|
|
125
|
+
subagent_type: "Explore",
|
|
126
|
+
prompt: "Python review for [files]. Check PEP8, type hints, async patterns."
|
|
127
|
+
)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## External LLM Enhancement (Optional)
|
|
131
|
+
|
|
132
|
+
**GPT Codex 활성화 시** Python 전문 2nd opinion:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
Primary: Task(Haiku) Python 리뷰
|
|
136
|
+
↓
|
|
137
|
+
[GPT enabled?]
|
|
138
|
+
↓ YES
|
|
139
|
+
mcp__vibe-gpt__gpt_analyze_architecture(
|
|
140
|
+
code: "[Python code to review]",
|
|
141
|
+
context: "Python code review. Check PEP8, type hints, async patterns, Django/FastAPI best practices."
|
|
142
|
+
)
|
|
143
|
+
↓
|
|
144
|
+
결과 비교 → 공통 이슈는 신뢰도 상승, 차이점은 추가 검토
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**활용 시점:**
|
|
148
|
+
- 복잡한 async/await 패턴 검토 시
|
|
149
|
+
- Django/FastAPI 아키텍처 리뷰 시
|
|
150
|
+
- 타입 힌트 누락 심각할 때
|
|
151
|
+
|
|
152
|
+
**GPT 미설정 시:** Primary만으로 정상 작동
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Rails Reviewer Agent
|
|
2
|
+
|
|
3
|
+
Ruby on Rails 코드 전문 리뷰 에이전트 (DHH 스타일)
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- Rails Way 준수 검증
|
|
8
|
+
- N+1 쿼리 탐지
|
|
9
|
+
- ActiveRecord 패턴 검토
|
|
10
|
+
- 보안 베스트 프랙티스
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - 빠른 병렬 실행
|
|
15
|
+
|
|
16
|
+
## Philosophy (DHH Style)
|
|
17
|
+
|
|
18
|
+
> "Convention over Configuration"
|
|
19
|
+
> "Rails is omakase"
|
|
20
|
+
|
|
21
|
+
- 프레임워크 컨벤션 따르기
|
|
22
|
+
- 마법(Magic)을 두려워하지 않기
|
|
23
|
+
- 단순함 추구
|
|
24
|
+
- 테스트 커버리지보다 시스템 테스트
|
|
25
|
+
|
|
26
|
+
## Checklist
|
|
27
|
+
|
|
28
|
+
### ActiveRecord
|
|
29
|
+
- [ ] N+1 쿼리: includes/preload/eager_load?
|
|
30
|
+
- [ ] 콜백 남용 금지?
|
|
31
|
+
- [ ] scope 적절히 활용?
|
|
32
|
+
- [ ] 트랜잭션 범위 적절?
|
|
33
|
+
- [ ] 유효성 검사 적절?
|
|
34
|
+
|
|
35
|
+
### Controllers
|
|
36
|
+
- [ ] Fat controller 금지?
|
|
37
|
+
- [ ] Strong parameters 사용?
|
|
38
|
+
- [ ] before_action 적절?
|
|
39
|
+
- [ ] 인증/인가 처리?
|
|
40
|
+
- [ ] 응답 형식 일관성?
|
|
41
|
+
|
|
42
|
+
### Models
|
|
43
|
+
- [ ] 비즈니스 로직 위치 적절?
|
|
44
|
+
- [ ] 관계 설정 올바름?
|
|
45
|
+
- [ ] 콜백 최소화?
|
|
46
|
+
- [ ] 유효성 검사 완전?
|
|
47
|
+
|
|
48
|
+
### Views/Helpers
|
|
49
|
+
- [ ] 로직 최소화?
|
|
50
|
+
- [ ] 헬퍼 적절히 활용?
|
|
51
|
+
- [ ] 파셜 재사용?
|
|
52
|
+
- [ ] XSS 방지 (html_safe 최소화)?
|
|
53
|
+
|
|
54
|
+
### Migrations
|
|
55
|
+
- [ ] 되돌릴 수 있는 migration?
|
|
56
|
+
- [ ] 인덱스 추가?
|
|
57
|
+
- [ ] NOT NULL 제약조건?
|
|
58
|
+
- [ ] 데이터 migration 분리?
|
|
59
|
+
|
|
60
|
+
### Security
|
|
61
|
+
- [ ] SQL Injection 방지?
|
|
62
|
+
- [ ] Mass assignment 보호?
|
|
63
|
+
- [ ] CSRF 토큰 사용?
|
|
64
|
+
- [ ] 민감 정보 로깅 금지?
|
|
65
|
+
|
|
66
|
+
### Performance
|
|
67
|
+
- [ ] Counter cache 활용?
|
|
68
|
+
- [ ] 캐싱 전략?
|
|
69
|
+
- [ ] 백그라운드 작업 (Sidekiq)?
|
|
70
|
+
- [ ] 페이지네이션?
|
|
71
|
+
|
|
72
|
+
## Common Anti-Patterns
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
# ❌ Bad: N+1 Query
|
|
76
|
+
users.each { |u| u.posts.count }
|
|
77
|
+
|
|
78
|
+
# ✅ Good: Eager loading
|
|
79
|
+
users.includes(:posts).each { |u| u.posts.size }
|
|
80
|
+
|
|
81
|
+
# ❌ Bad: Fat controller
|
|
82
|
+
def create
|
|
83
|
+
@user = User.new(user_params)
|
|
84
|
+
if @user.save
|
|
85
|
+
UserMailer.welcome(@user).deliver_later
|
|
86
|
+
Analytics.track('signup', @user.id)
|
|
87
|
+
# ... more logic
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# ✅ Good: Thin controller
|
|
92
|
+
def create
|
|
93
|
+
@user = User.create_with_welcome(user_params)
|
|
94
|
+
# Model handles the rest
|
|
95
|
+
end
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Output Format
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## 💎 Rails Review (DHH Style)
|
|
102
|
+
|
|
103
|
+
### 🔴 P1 Critical
|
|
104
|
+
1. **N+1 Query Detected**
|
|
105
|
+
- 📍 Location: app/controllers/posts_controller.rb:12
|
|
106
|
+
```ruby
|
|
107
|
+
# Before
|
|
108
|
+
@posts = Post.all
|
|
109
|
+
# View: post.author.name (N+1!)
|
|
110
|
+
|
|
111
|
+
# After
|
|
112
|
+
@posts = Post.includes(:author)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 🟡 P2 Important
|
|
116
|
+
2. **Fat Controller**
|
|
117
|
+
- 📍 Location: app/controllers/orders_controller.rb:create
|
|
118
|
+
- 💡 Extract to service object or model method
|
|
119
|
+
|
|
120
|
+
### 🔵 P3 Suggestions
|
|
121
|
+
3. **Use Counter Cache**
|
|
122
|
+
- 📍 Location: app/models/user.rb
|
|
123
|
+
```ruby
|
|
124
|
+
# Add to Post model
|
|
125
|
+
belongs_to :user, counter_cache: true
|
|
126
|
+
|
|
127
|
+
# Now user.posts_count is cached
|
|
128
|
+
```
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Usage
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Task(
|
|
135
|
+
model: "haiku",
|
|
136
|
+
subagent_type: "Explore",
|
|
137
|
+
prompt: "Rails review for [files]. Check N+1, Rails Way, DHH style."
|
|
138
|
+
)
|
|
139
|
+
```
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# React Reviewer Agent
|
|
2
|
+
|
|
3
|
+
React 코드 전문 리뷰 에이전트
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- 훅 규칙 검증
|
|
8
|
+
- 리렌더링 최적화
|
|
9
|
+
- 상태 관리 패턴
|
|
10
|
+
- 접근성(a11y) 검사
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - 빠른 병렬 실행
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
### Rules of Hooks
|
|
19
|
+
- [ ] 훅은 최상위에서만 호출?
|
|
20
|
+
- [ ] 조건문/반복문 내 훅 금지?
|
|
21
|
+
- [ ] 커스텀 훅 네이밍 (use-)?
|
|
22
|
+
- [ ] 훅 순서 일관성?
|
|
23
|
+
|
|
24
|
+
### Dependencies
|
|
25
|
+
- [ ] useEffect 의존성 배열 완전?
|
|
26
|
+
- [ ] useMemo/useCallback 의존성 정확?
|
|
27
|
+
- [ ] 불필요한 의존성 제거?
|
|
28
|
+
- [ ] 함수 참조 안정성?
|
|
29
|
+
|
|
30
|
+
### Re-rendering
|
|
31
|
+
- [ ] 불필요한 리렌더링?
|
|
32
|
+
- [ ] React.memo 적절히 사용?
|
|
33
|
+
- [ ] useMemo로 비용 큰 연산 메모이제이션?
|
|
34
|
+
- [ ] useCallback으로 콜백 안정화?
|
|
35
|
+
- [ ] 상태 분리 (co-location)?
|
|
36
|
+
|
|
37
|
+
### State Management
|
|
38
|
+
- [ ] 로컬 vs 전역 상태 구분?
|
|
39
|
+
- [ ] 상태 최소화?
|
|
40
|
+
- [ ] 파생 상태 (derived state) 계산?
|
|
41
|
+
- [ ] 상태 끌어올리기/내리기 적절?
|
|
42
|
+
|
|
43
|
+
### Component Design
|
|
44
|
+
- [ ] 단일 책임 원칙?
|
|
45
|
+
- [ ] Props drilling 과도?
|
|
46
|
+
- [ ] 컴포넌트 크기 적절?
|
|
47
|
+
- [ ] Container/Presentational 분리?
|
|
48
|
+
|
|
49
|
+
### Accessibility (a11y)
|
|
50
|
+
- [ ] 시맨틱 HTML 사용?
|
|
51
|
+
- [ ] ARIA 속성 적절?
|
|
52
|
+
- [ ] 키보드 네비게이션?
|
|
53
|
+
- [ ] 색상 대비 충분?
|
|
54
|
+
- [ ] alt 텍스트?
|
|
55
|
+
|
|
56
|
+
### Error Handling
|
|
57
|
+
- [ ] Error Boundary 사용?
|
|
58
|
+
- [ ] 로딩/에러 상태 처리?
|
|
59
|
+
- [ ] Suspense 활용?
|
|
60
|
+
- [ ] 사용자 친화적 에러 UI?
|
|
61
|
+
|
|
62
|
+
### Performance
|
|
63
|
+
- [ ] 번들 사이즈 영향?
|
|
64
|
+
- [ ] 코드 스플리팅?
|
|
65
|
+
- [ ] 이미지 최적화?
|
|
66
|
+
- [ ] 가상화 (대용량 리스트)?
|
|
67
|
+
|
|
68
|
+
## Common Anti-Patterns
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
// ❌ Bad: Missing dependency
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
fetchData(userId);
|
|
74
|
+
}, []); // userId missing!
|
|
75
|
+
|
|
76
|
+
// ✅ Good: Complete dependencies
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
fetchData(userId);
|
|
79
|
+
}, [userId]);
|
|
80
|
+
|
|
81
|
+
// ❌ Bad: Object in dependency (new reference each render)
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
doSomething(options);
|
|
84
|
+
}, [{ sort: 'asc' }]); // Always new object!
|
|
85
|
+
|
|
86
|
+
// ✅ Good: Stable reference
|
|
87
|
+
const options = useMemo(() => ({ sort: 'asc' }), []);
|
|
88
|
+
|
|
89
|
+
// ❌ Bad: Inline function causing re-render
|
|
90
|
+
<Button onClick={() => handleClick(id)} />
|
|
91
|
+
|
|
92
|
+
// ✅ Good: Stable callback
|
|
93
|
+
const handleButtonClick = useCallback(() => {
|
|
94
|
+
handleClick(id);
|
|
95
|
+
}, [id]);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Output Format
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## ⚛️ React Review
|
|
102
|
+
|
|
103
|
+
### 🔴 P1 Critical
|
|
104
|
+
1. **Missing useEffect Dependency**
|
|
105
|
+
- 📍 Location: src/components/UserProfile.tsx:23
|
|
106
|
+
```tsx
|
|
107
|
+
// Before
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
fetchUser(userId);
|
|
110
|
+
}, []); // ❌ userId missing
|
|
111
|
+
|
|
112
|
+
// After
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
fetchUser(userId);
|
|
115
|
+
}, [userId]);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 🟡 P2 Important
|
|
119
|
+
2. **Unnecessary Re-renders**
|
|
120
|
+
- 📍 Location: src/components/List.tsx:45
|
|
121
|
+
- 📊 Impact: 100+ items re-render on each keystroke
|
|
122
|
+
- 💡 Fix: Use React.memo and stable callbacks
|
|
123
|
+
|
|
124
|
+
### 🔵 P3 Suggestions
|
|
125
|
+
3. **Accessibility: Missing alt text**
|
|
126
|
+
- 📍 Location: src/components/Avatar.tsx:12
|
|
127
|
+
```tsx
|
|
128
|
+
// Before
|
|
129
|
+
<img src={user.avatar} />
|
|
130
|
+
|
|
131
|
+
// After
|
|
132
|
+
<img src={user.avatar} alt={`${user.name}'s avatar`} />
|
|
133
|
+
```
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Usage
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Task(
|
|
140
|
+
model: "haiku",
|
|
141
|
+
subagent_type: "Explore",
|
|
142
|
+
prompt: "React review for [files]. Check hooks, re-renders, a11y."
|
|
143
|
+
)
|
|
144
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Security Reviewer Agent
|
|
2
|
+
|
|
3
|
+
보안 취약점 전문 리뷰 에이전트
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- OWASP Top 10 취약점 검사
|
|
8
|
+
- 인증/인가 로직 검증
|
|
9
|
+
- 민감 데이터 노출 감지
|
|
10
|
+
- 보안 헤더 및 설정 검토
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - 빠른 병렬 실행
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
### Injection (A03:2021)
|
|
19
|
+
- [ ] SQL Injection: 파라미터화된 쿼리 사용?
|
|
20
|
+
- [ ] NoSQL Injection: 사용자 입력 검증?
|
|
21
|
+
- [ ] Command Injection: shell 명령어 이스케이프?
|
|
22
|
+
- [ ] LDAP Injection: LDAP 쿼리 검증?
|
|
23
|
+
|
|
24
|
+
### Broken Authentication (A07:2021)
|
|
25
|
+
- [ ] 비밀번호 해싱 (bcrypt, argon2)?
|
|
26
|
+
- [ ] 세션 관리 보안?
|
|
27
|
+
- [ ] 브루트포스 방지?
|
|
28
|
+
- [ ] 2FA 구현 여부?
|
|
29
|
+
|
|
30
|
+
### Sensitive Data Exposure (A02:2021)
|
|
31
|
+
- [ ] API 키, 비밀번호 하드코딩?
|
|
32
|
+
- [ ] 로그에 민감 정보 노출?
|
|
33
|
+
- [ ] HTTPS 강제?
|
|
34
|
+
- [ ] 민감 데이터 암호화?
|
|
35
|
+
|
|
36
|
+
### XSS (A03:2021)
|
|
37
|
+
- [ ] 사용자 입력 이스케이프?
|
|
38
|
+
- [ ] Content-Security-Policy 설정?
|
|
39
|
+
- [ ] innerHTML 대신 textContent?
|
|
40
|
+
- [ ] React dangerouslySetInnerHTML 검토?
|
|
41
|
+
|
|
42
|
+
### CSRF
|
|
43
|
+
- [ ] CSRF 토큰 사용?
|
|
44
|
+
- [ ] SameSite 쿠키 설정?
|
|
45
|
+
- [ ] Origin 검증?
|
|
46
|
+
|
|
47
|
+
### Security Misconfiguration (A05:2021)
|
|
48
|
+
- [ ] 디버그 모드 비활성화?
|
|
49
|
+
- [ ] 기본 계정/비밀번호 제거?
|
|
50
|
+
- [ ] 에러 메시지에 스택 트레이스?
|
|
51
|
+
- [ ] 불필요한 기능/포트 비활성화?
|
|
52
|
+
|
|
53
|
+
## Output Format
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
## 🔒 Security Review
|
|
57
|
+
|
|
58
|
+
### 🔴 P1 Critical
|
|
59
|
+
1. **SQL Injection**
|
|
60
|
+
- 📍 Location: src/api/users.py:42
|
|
61
|
+
- 💡 Fix: Use parameterized queries
|
|
62
|
+
|
|
63
|
+
### 🟡 P2 Important
|
|
64
|
+
2. **Missing Rate Limiting**
|
|
65
|
+
- 📍 Location: src/api/auth.py:15
|
|
66
|
+
- 💡 Fix: Add rate limiter middleware
|
|
67
|
+
|
|
68
|
+
### 🔵 P3 Suggestions
|
|
69
|
+
3. **Consider adding CSP header**
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Usage
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Task(
|
|
76
|
+
model: "haiku",
|
|
77
|
+
subagent_type: "Explore",
|
|
78
|
+
prompt: "Security review for changes in [files]. Check OWASP Top 10."
|
|
79
|
+
)
|
|
80
|
+
```
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Simplicity Reviewer Agent
|
|
2
|
+
|
|
3
|
+
코드 단순화 전문 리뷰 에이전트
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- 과도한 추상화 탐지
|
|
8
|
+
- 불필요한 복잡성 제거
|
|
9
|
+
- YAGNI 원칙 검증
|
|
10
|
+
- 명확성 개선 제안
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - 빠른 병렬 실행
|
|
15
|
+
|
|
16
|
+
## Philosophy
|
|
17
|
+
|
|
18
|
+
> "Simplicity is the ultimate sophistication" - Leonardo da Vinci
|
|
19
|
+
> "YAGNI - You Aren't Gonna Need It"
|
|
20
|
+
|
|
21
|
+
## Checklist
|
|
22
|
+
|
|
23
|
+
### Over-Engineering
|
|
24
|
+
- [ ] 불필요한 추상화 레이어?
|
|
25
|
+
- [ ] 사용되지 않는 인터페이스?
|
|
26
|
+
- [ ] 과도한 디자인 패턴?
|
|
27
|
+
- [ ] 미래를 위한 코드?
|
|
28
|
+
|
|
29
|
+
### Code Clarity
|
|
30
|
+
- [ ] 한눈에 이해 가능?
|
|
31
|
+
- [ ] 변수/함수명 명확?
|
|
32
|
+
- [ ] 중첩 최소화?
|
|
33
|
+
- [ ] 주석 없이도 이해?
|
|
34
|
+
|
|
35
|
+
### Unnecessary Code
|
|
36
|
+
- [ ] 죽은 코드?
|
|
37
|
+
- [ ] 사용되지 않는 import?
|
|
38
|
+
- [ ] 주석 처리된 코드?
|
|
39
|
+
- [ ] 중복 로직?
|
|
40
|
+
|
|
41
|
+
### KISS Violations
|
|
42
|
+
- [ ] 단순한 해결책 존재?
|
|
43
|
+
- [ ] 라이브러리로 대체 가능?
|
|
44
|
+
- [ ] 표준 기능으로 충분?
|
|
45
|
+
|
|
46
|
+
### Premature Optimization
|
|
47
|
+
- [ ] 필요 없는 캐싱?
|
|
48
|
+
- [ ] 과도한 메모이제이션?
|
|
49
|
+
- [ ] 불필요한 지연 로딩?
|
|
50
|
+
|
|
51
|
+
## Anti-Patterns
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
# ❌ Over-engineered
|
|
55
|
+
class AbstractUserFactoryInterface:
|
|
56
|
+
def create_user_factory(self):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
class UserFactoryImpl(AbstractUserFactoryInterface):
|
|
60
|
+
def create_user_factory(self):
|
|
61
|
+
return UserFactory()
|
|
62
|
+
|
|
63
|
+
# ✅ Simple
|
|
64
|
+
def create_user(name, email):
|
|
65
|
+
return User(name=name, email=email)
|
|
66
|
+
|
|
67
|
+
# ❌ Unnecessary abstraction
|
|
68
|
+
class StringUtils:
|
|
69
|
+
@staticmethod
|
|
70
|
+
def is_empty(s):
|
|
71
|
+
return len(s) == 0
|
|
72
|
+
|
|
73
|
+
# ✅ Just use Python
|
|
74
|
+
if not s: # Pythonic way
|
|
75
|
+
|
|
76
|
+
# ❌ Premature generalization
|
|
77
|
+
class DataProcessor:
|
|
78
|
+
def __init__(self, strategy, validator, transformer, logger):
|
|
79
|
+
...
|
|
80
|
+
|
|
81
|
+
# ✅ Start simple, generalize when needed
|
|
82
|
+
def process_data(data):
|
|
83
|
+
validated = validate(data)
|
|
84
|
+
return transform(validated)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Output Format
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
## 🎯 Simplicity Review
|
|
91
|
+
|
|
92
|
+
### 🔴 P1 Critical
|
|
93
|
+
1. **Dead Code**
|
|
94
|
+
- 📍 Location: src/utils/legacy.py (entire file)
|
|
95
|
+
- 📊 No references found in codebase
|
|
96
|
+
- 💡 Safe to delete
|
|
97
|
+
|
|
98
|
+
### 🟡 P2 Important
|
|
99
|
+
2. **Over-Abstraction**
|
|
100
|
+
- 📍 Location: src/services/factory.py
|
|
101
|
+
- 🚫 Problem: 3 classes for what could be 1 function
|
|
102
|
+
```python
|
|
103
|
+
# Before: AbstractFactory → FactoryImpl → ConcreteFactory
|
|
104
|
+
# After: Just one function
|
|
105
|
+
def create_thing(type):
|
|
106
|
+
return Thing(type)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 🔵 P3 Suggestions
|
|
110
|
+
3. **Simplify Conditional**
|
|
111
|
+
- 📍 Location: src/utils/validator.py:45
|
|
112
|
+
```python
|
|
113
|
+
# Before
|
|
114
|
+
if x is not None:
|
|
115
|
+
if x > 0:
|
|
116
|
+
if x < 100:
|
|
117
|
+
return True
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
# After
|
|
121
|
+
return x is not None and 0 < x < 100
|
|
122
|
+
```
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Questions to Ask
|
|
126
|
+
|
|
127
|
+
1. "Can I explain this in one sentence?"
|
|
128
|
+
2. "Would a junior developer understand this?"
|
|
129
|
+
3. "Can I delete this and nothing breaks?"
|
|
130
|
+
4. "Am I solving a problem that doesn't exist yet?"
|
|
131
|
+
|
|
132
|
+
## Usage
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
Task(
|
|
136
|
+
model: "haiku",
|
|
137
|
+
subagent_type: "Explore",
|
|
138
|
+
prompt: "Simplicity review for [files]. Find over-engineering, dead code."
|
|
139
|
+
)
|
|
140
|
+
```
|