@yuaone/core 0.3.2 → 0.4.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/dist/agent-loop.d.ts +62 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +705 -18
- package/dist/agent-loop.js.map +1 -1
- package/dist/background-agent.d.ts +110 -0
- package/dist/background-agent.d.ts.map +1 -0
- package/dist/background-agent.js +255 -0
- package/dist/background-agent.js.map +1 -0
- package/dist/coding-standards.d.ts +45 -0
- package/dist/coding-standards.d.ts.map +1 -0
- package/dist/coding-standards.js +1152 -0
- package/dist/coding-standards.js.map +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -6
- package/dist/constants.js.map +1 -1
- package/dist/context-manager.d.ts +6 -0
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +23 -4
- package/dist/context-manager.js.map +1 -1
- package/dist/index.d.ts +28 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +8 -3
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +64 -13
- package/dist/llm-client.js.map +1 -1
- package/dist/plugin-auto-loader.d.ts +108 -0
- package/dist/plugin-auto-loader.d.ts.map +1 -0
- package/dist/plugin-auto-loader.js +743 -0
- package/dist/plugin-auto-loader.js.map +1 -0
- package/dist/plugin-registry.d.ts +112 -0
- package/dist/plugin-registry.d.ts.map +1 -0
- package/dist/plugin-registry.js +319 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/plugin-types.d.ts +388 -0
- package/dist/plugin-types.d.ts.map +1 -0
- package/dist/plugin-types.js +8 -0
- package/dist/plugin-types.js.map +1 -0
- package/dist/plugin-validator.d.ts +54 -0
- package/dist/plugin-validator.d.ts.map +1 -0
- package/dist/plugin-validator.js +129 -0
- package/dist/plugin-validator.js.map +1 -0
- package/dist/repo-knowledge-graph.d.ts +112 -0
- package/dist/repo-knowledge-graph.d.ts.map +1 -0
- package/dist/repo-knowledge-graph.js +561 -0
- package/dist/repo-knowledge-graph.js.map +1 -0
- package/dist/role-registry.js +1 -1
- package/dist/role-registry.js.map +1 -1
- package/dist/self-debug-loop.d.ts +257 -0
- package/dist/self-debug-loop.d.ts.map +1 -0
- package/dist/self-debug-loop.js +870 -0
- package/dist/self-debug-loop.js.map +1 -0
- package/dist/skill-learner.d.ts +136 -0
- package/dist/skill-learner.d.ts.map +1 -0
- package/dist/skill-learner.js +382 -0
- package/dist/skill-learner.js.map +1 -0
- package/dist/skill-loader.d.ts +90 -0
- package/dist/skill-loader.d.ts.map +1 -0
- package/dist/skill-loader.js +309 -0
- package/dist/skill-loader.js.map +1 -0
- package/dist/specialist-registry.d.ts +132 -0
- package/dist/specialist-registry.d.ts.map +1 -0
- package/dist/specialist-registry.js +413 -0
- package/dist/specialist-registry.js.map +1 -0
- package/dist/sub-agent-prompts.d.ts +45 -0
- package/dist/sub-agent-prompts.d.ts.map +1 -0
- package/dist/sub-agent-prompts.js +177 -0
- package/dist/sub-agent-prompts.js.map +1 -0
- package/dist/sub-agent-router.d.ts +75 -0
- package/dist/sub-agent-router.d.ts.map +1 -0
- package/dist/sub-agent-router.js +174 -0
- package/dist/sub-agent-router.js.map +1 -0
- package/dist/sub-agent.d.ts +48 -0
- package/dist/sub-agent.d.ts.map +1 -1
- package/dist/sub-agent.js +108 -5
- package/dist/sub-agent.js.map +1 -1
- package/dist/system-prompt.d.ts +26 -0
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +177 -7
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts +25 -1
- package/dist/task-classifier.d.ts.map +1 -1
- package/dist/task-classifier.js +171 -1
- package/dist/task-classifier.js.map +1 -1
- package/dist/tool-planner.d.ts +160 -0
- package/dist/tool-planner.d.ts.map +1 -0
- package/dist/tool-planner.js +501 -0
- package/dist/tool-planner.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/world-state.d.ts.map +1 -1
- package/dist/world-state.js +8 -1
- package/dist/world-state.js.map +1 -1
- package/package.json +2 -1
- package/plugins/git/patterns/branch-patterns.json +101 -0
- package/plugins/git/patterns/commit-patterns.json +186 -0
- package/plugins/git/plugin.yaml +128 -0
- package/plugins/git/skills/branch-strategy.md +172 -0
- package/plugins/git/skills/commit-conv.md +178 -0
- package/plugins/git/skills/conflict-resolve.md +159 -0
- package/plugins/git/skills/history-clean.md +199 -0
- package/plugins/git/skills/pr-review.md +196 -0
- package/plugins/git/strategies/conflict-resolve.json +244 -0
- package/plugins/git/strategies/release-flow.json +292 -0
- package/plugins/git/validators/rules.json +348 -0
- package/plugins/react/patterns/anti-patterns.json +88 -0
- package/plugins/react/patterns/components.json +80 -0
- package/plugins/react/patterns/hooks.json +72 -0
- package/plugins/react/plugin.yaml +229 -0
- package/plugins/react/skills/bugfix.md +208 -0
- package/plugins/react/skills/component-gen.md +206 -0
- package/plugins/react/skills/hook-extract.md +208 -0
- package/plugins/react/skills/ssr.md +256 -0
- package/plugins/react/skills/test.md +273 -0
- package/plugins/react/strategies/build-fix.json +43 -0
- package/plugins/react/strategies/hook-loop-fix.json +36 -0
- package/plugins/react/strategies/hydration-fix.json +42 -0
- package/plugins/react/validators/rules.json +92 -0
- package/plugins/typescript/patterns/best-practices.json +25 -0
- package/plugins/typescript/patterns/common-errors.json +32 -0
- package/plugins/typescript/plugin.yaml +74 -0
- package/plugins/typescript/skills/debug.md +23 -0
- package/plugins/typescript/skills/migration.md +24 -0
- package/plugins/typescript/skills/refactor.md +22 -0
- package/plugins/typescript/skills/strict-mode.md +23 -0
- package/plugins/typescript/strategies/strict-migration.json +37 -0
- package/plugins/typescript/strategies/type-error-fix.json +37 -0
- package/plugins/typescript/validators/rules.json +28 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
## Identity
|
|
2
|
+
Git history 정리 전문가. Interactive rebase, squash, fixup을 활용하여 깔끔한 커밋 히스토리를 만들고, 공유 브랜치에서의 안전한 히스토리 관리를 보장한다.
|
|
3
|
+
|
|
4
|
+
## Interactive Rebase 가이드
|
|
5
|
+
|
|
6
|
+
### 기본 명령
|
|
7
|
+
```bash
|
|
8
|
+
# 최근 N개 커밋 정리
|
|
9
|
+
git rebase -i HEAD~N
|
|
10
|
+
|
|
11
|
+
# 특정 커밋부터 정리
|
|
12
|
+
git rebase -i <commit-hash>^
|
|
13
|
+
|
|
14
|
+
# 분기점부터 정리 (PR 전 정리 시)
|
|
15
|
+
git rebase -i main
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Rebase 명령어
|
|
19
|
+
| 명령 | 단축 | 동작 |
|
|
20
|
+
|----------|------|-------------------------------------|
|
|
21
|
+
| `pick` | `p` | 커밋 그대로 유지 |
|
|
22
|
+
| `reword` | `r` | 커밋 유지, 메시지만 변경 |
|
|
23
|
+
| `edit` | `e` | 커밋에서 멈추고 수정 가능 |
|
|
24
|
+
| `squash` | `s` | 이전 커밋과 합침, 메시지 편집 가능 |
|
|
25
|
+
| `fixup` | `f` | 이전 커밋과 합침, 메시지는 이전 것 유지 |
|
|
26
|
+
| `drop` | `d` | 커밋 삭제 |
|
|
27
|
+
|
|
28
|
+
### Squash vs Fixup
|
|
29
|
+
- **squash**: 두 커밋의 메시지를 결합하여 편집 — 관련 작업을 하나로 묶을 때
|
|
30
|
+
- **fixup**: 이전 커밋에 흡수, 메시지는 이전 것만 유지 — WIP/typo 수정 커밋 정리 시
|
|
31
|
+
|
|
32
|
+
## 정리 시나리오
|
|
33
|
+
|
|
34
|
+
### 시나리오 1: WIP 커밋 정리
|
|
35
|
+
```
|
|
36
|
+
Before:
|
|
37
|
+
abc1234 feat(auth): add login form
|
|
38
|
+
def5678 WIP: login validation
|
|
39
|
+
ghi9012 fix typo
|
|
40
|
+
jkl3456 WIP: add error handling
|
|
41
|
+
mno7890 done with login
|
|
42
|
+
|
|
43
|
+
After (squash):
|
|
44
|
+
xyz1234 feat(auth): add login form with validation and error handling
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 시나리오 2: 커밋 메시지 수정
|
|
48
|
+
```
|
|
49
|
+
Before:
|
|
50
|
+
abc1234 added stuff
|
|
51
|
+
def5678 more changes
|
|
52
|
+
|
|
53
|
+
After (reword):
|
|
54
|
+
abc1234 feat(api): add user endpoint
|
|
55
|
+
def5678 test(api): add user endpoint integration tests
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 시나리오 3: 커밋 분리 (edit)
|
|
59
|
+
```bash
|
|
60
|
+
# 하나의 큰 커밋을 여러 개로 분리
|
|
61
|
+
git rebase -i HEAD~3
|
|
62
|
+
# 분리할 커밋을 'edit'으로 변경
|
|
63
|
+
# 해당 커밋에서 멈추면:
|
|
64
|
+
git reset HEAD^
|
|
65
|
+
git add src/auth/
|
|
66
|
+
git commit -m "feat(auth): add authentication module"
|
|
67
|
+
git add src/api/
|
|
68
|
+
git commit -m "feat(api): add user API routes"
|
|
69
|
+
git rebase --continue
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 시나리오 4: Fixup 커밋 자동 생성
|
|
73
|
+
```bash
|
|
74
|
+
# 특정 커밋에 대한 fixup 커밋 생성
|
|
75
|
+
git commit --fixup=<commit-hash>
|
|
76
|
+
|
|
77
|
+
# 나중에 autosquash로 자동 정리
|
|
78
|
+
git rebase -i --autosquash main
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 히스토리 정리 전략
|
|
82
|
+
|
|
83
|
+
### PR 전 정리 (권장)
|
|
84
|
+
1. feature 브랜치에서 `git rebase -i main`
|
|
85
|
+
2. WIP, fixup, typo 커밋을 의미 있는 커밋으로 squash
|
|
86
|
+
3. 커밋 메시지를 Conventional Commits 형식으로 reword
|
|
87
|
+
4. 논리적 단위로 커밋을 그룹화
|
|
88
|
+
5. `git push --force-with-lease origin feature/xxx`
|
|
89
|
+
|
|
90
|
+
### 이상적인 커밋 구조
|
|
91
|
+
```
|
|
92
|
+
feat(auth): add OAuth2 login flow ← 기능 구현
|
|
93
|
+
test(auth): add OAuth2 integration tests ← 테스트
|
|
94
|
+
docs(auth): update API documentation ← 문서
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 피해야 할 커밋 패턴
|
|
98
|
+
```
|
|
99
|
+
WIP
|
|
100
|
+
fix
|
|
101
|
+
asdf
|
|
102
|
+
temp
|
|
103
|
+
...
|
|
104
|
+
final
|
|
105
|
+
final2
|
|
106
|
+
final-final
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 히스토리를 다시 쓰면 안 되는 경우
|
|
110
|
+
|
|
111
|
+
### 절대 금지
|
|
112
|
+
- `main` / `master` 브랜치 — 공유 브랜치의 히스토리는 변경 불가
|
|
113
|
+
- `develop` 브랜치 — Git Flow에서 통합 브랜치
|
|
114
|
+
- 이미 다른 사람이 pull 한 브랜치
|
|
115
|
+
- 릴리스 태그가 달린 커밋
|
|
116
|
+
- CI/CD에서 참조 중인 커밋
|
|
117
|
+
|
|
118
|
+
### 허용
|
|
119
|
+
- 아직 push하지 않은 로컬 커밋
|
|
120
|
+
- 본인만 사용하는 feature 브랜치
|
|
121
|
+
- PR 리뷰 전 정리
|
|
122
|
+
- `--force-with-lease`로 force push (다른 사람 작업 보호)
|
|
123
|
+
|
|
124
|
+
## Force Push 안전 가이드
|
|
125
|
+
|
|
126
|
+
### --force vs --force-with-lease
|
|
127
|
+
```bash
|
|
128
|
+
# 위험: 다른 사람의 커밋을 덮어쓸 수 있음
|
|
129
|
+
git push --force origin feature/xxx # 사용 금지
|
|
130
|
+
|
|
131
|
+
# 안전: 로컬이 알고 있는 리모트 상태가 바뀌었으면 거부
|
|
132
|
+
git push --force-with-lease origin feature/xxx # 이것만 사용
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Force Push 전 체크리스트
|
|
136
|
+
1. `git log --oneline origin/feature/xxx..feature/xxx` — 리모트와 로컬 차이 확인
|
|
137
|
+
2. 혼자 쓰는 브랜치인지 확인
|
|
138
|
+
3. `--force-with-lease` 사용 (절대 `--force` 아님)
|
|
139
|
+
4. 팀원에게 force push 사전 공지 (공유 브랜치인 경우)
|
|
140
|
+
|
|
141
|
+
## Git Rerere (Reuse Recorded Resolution)
|
|
142
|
+
|
|
143
|
+
### 활성화
|
|
144
|
+
```bash
|
|
145
|
+
git config --global rerere.enabled true
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 용도
|
|
149
|
+
- rebase 시 같은 충돌이 반복되는 경우
|
|
150
|
+
- 이전에 해결한 충돌 패턴을 자동 적용
|
|
151
|
+
- `git rerere forget <file>` — 잘못된 해결 기록 삭제
|
|
152
|
+
|
|
153
|
+
## Git Reflog (안전망)
|
|
154
|
+
|
|
155
|
+
### 실수 복구
|
|
156
|
+
```bash
|
|
157
|
+
# reflog으로 이전 상태 확인
|
|
158
|
+
git reflog
|
|
159
|
+
|
|
160
|
+
# rebase 전 상태로 복구
|
|
161
|
+
git reset --hard HEAD@{N}
|
|
162
|
+
|
|
163
|
+
# 삭제된 브랜치 복구
|
|
164
|
+
git branch recovered-branch HEAD@{N}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### reflog 주의사항
|
|
168
|
+
- 로컬에만 존재 (리모트에는 없음)
|
|
169
|
+
- 기본 90일 보관
|
|
170
|
+
- `git gc` 실행 전까지 유지
|
|
171
|
+
|
|
172
|
+
## Known Error Patterns
|
|
173
|
+
- **공유 브랜치 rebase**: main/develop에서 `git rebase -i` 실행 → 절대 금지, feature 브랜치에서만
|
|
174
|
+
- **force push 없는 rebase push**: rebase 후 일반 push 시도 → rejected → `--force-with-lease` 사용
|
|
175
|
+
- **잘못된 squash 대상**: 첫 번째 커밋에 squash 적용 → 첫 커밋은 pick이어야 함
|
|
176
|
+
- **rebase 중 충돌 포기**: `git rebase --abort`를 모르고 수동으로 상태 복구 시도 → abort 사용
|
|
177
|
+
- **autosquash 미사용**: `--fixup` 커밋을 수동으로 정리 → `--autosquash` 옵션 활용
|
|
178
|
+
- **reflog 미확인**: rebase 실수 후 복구 방법을 모름 → `git reflog`로 이전 상태 확인
|
|
179
|
+
|
|
180
|
+
## Tool Sequence
|
|
181
|
+
1. `shell_exec` — `git log --oneline -20` 현재 히스토리 파악
|
|
182
|
+
2. `shell_exec` — `git log --oneline main..HEAD` PR에 포함될 커밋 확인
|
|
183
|
+
3. 분석 — 정리 대상 커밋 식별 (WIP, fixup, 중복, 무의미한 메시지)
|
|
184
|
+
4. 계획 — rebase 전략 수립 (어떤 커밋을 squash/reword/drop 할지)
|
|
185
|
+
5. `shell_exec` — `git reflog -5` 안전망 확인
|
|
186
|
+
6. `shell_exec` — `git rebase` 실행 (비대화형으로 가능한 경우 sequence editor 활용)
|
|
187
|
+
7. `shell_exec` — `git log --oneline -10` 정리 결과 확인
|
|
188
|
+
8. `shell_exec` — 빌드 확인 (`tsc --noEmit` 또는 `pnpm build`)
|
|
189
|
+
9. `shell_exec` — `git push --force-with-lease origin <branch>` (필요 시)
|
|
190
|
+
|
|
191
|
+
## Validation Checklist
|
|
192
|
+
- [ ] 공유 브랜치(main/develop)의 히스토리는 변경하지 않음
|
|
193
|
+
- [ ] 모든 커밋 메시지가 Conventional Commits 형식
|
|
194
|
+
- [ ] WIP/temp/fixup 커밋이 정리됨
|
|
195
|
+
- [ ] 논리적 단위로 커밋이 그룹화됨
|
|
196
|
+
- [ ] 빌드가 각 커밋에서 성공함 (bisect 가능)
|
|
197
|
+
- [ ] force push 시 `--force-with-lease` 사용
|
|
198
|
+
- [ ] reflog으로 복구 가능한 상태 확인
|
|
199
|
+
- [ ] 팀원에게 force push 사전 공지 (해당 시)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
## Identity
|
|
2
|
+
PR 리뷰 전문가. Pull Request의 코드 변경을 체계적으로 분석하고, Conventional Comments 형식으로 리뷰를 작성하며, 프로젝트 맞춤형 체크리스트를 자동 생성한다.
|
|
3
|
+
|
|
4
|
+
## PR Description 템플릿 생성
|
|
5
|
+
|
|
6
|
+
### 표준 템플릿
|
|
7
|
+
```markdown
|
|
8
|
+
## Summary
|
|
9
|
+
[1-3문장으로 변경 요약]
|
|
10
|
+
|
|
11
|
+
## Changes
|
|
12
|
+
- [주요 변경사항 1]
|
|
13
|
+
- [주요 변경사항 2]
|
|
14
|
+
- [주요 변경사항 3]
|
|
15
|
+
|
|
16
|
+
## Motivation
|
|
17
|
+
[왜 이 변경이 필요한지]
|
|
18
|
+
|
|
19
|
+
## Testing
|
|
20
|
+
- [ ] Unit tests added/updated
|
|
21
|
+
- [ ] Integration tests added/updated
|
|
22
|
+
- [ ] Manual testing performed
|
|
23
|
+
- [ ] Test instructions: [how to test]
|
|
24
|
+
|
|
25
|
+
## Screenshots
|
|
26
|
+
[UI 변경 시 before/after 스크린샷]
|
|
27
|
+
|
|
28
|
+
## Breaking Changes
|
|
29
|
+
[호환성 깨지는 변경 있으면 여기에, 없으면 "None"]
|
|
30
|
+
|
|
31
|
+
## Related Issues
|
|
32
|
+
Closes #[issue number]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 변경 유형별 추가 항목
|
|
36
|
+
- **API 변경**: request/response 스키마 변경 명시, 마이그레이션 가이드
|
|
37
|
+
- **DB 변경**: migration 스크립트 포함 여부, 롤백 방법
|
|
38
|
+
- **의존성 변경**: 추가/업데이트/삭제된 패키지 목록, 라이선스 확인
|
|
39
|
+
- **보안 변경**: threat model 업데이트, 보안 검토 요청
|
|
40
|
+
|
|
41
|
+
## Code Review 체크리스트
|
|
42
|
+
|
|
43
|
+
### 1. 정확성 (Correctness)
|
|
44
|
+
- [ ] 로직이 의도한 대로 동작하는가
|
|
45
|
+
- [ ] edge case가 처리되었는가 (null, undefined, empty, boundary values)
|
|
46
|
+
- [ ] 에러 핸들링이 적절한가 (try-catch, error boundaries)
|
|
47
|
+
- [ ] race condition이 없는가 (비동기 코드)
|
|
48
|
+
- [ ] 메모리 누수 가능성이 없는가 (이벤트 리스너, 구독 정리)
|
|
49
|
+
- [ ] off-by-one 에러가 없는가
|
|
50
|
+
|
|
51
|
+
### 2. 보안 (Security)
|
|
52
|
+
- [ ] 사용자 입력이 검증/소독(sanitize)되었는가
|
|
53
|
+
- [ ] SQL injection, XSS, CSRF 방어가 되어있는가
|
|
54
|
+
- [ ] 인증/인가가 적절히 적용되었는가
|
|
55
|
+
- [ ] 시크릿/크레덴셜이 코드에 하드코딩되지 않았는가
|
|
56
|
+
- [ ] 민감한 데이터가 로그에 노출되지 않는가
|
|
57
|
+
- [ ] 파일 경로 조작(path traversal)이 방어되었는가
|
|
58
|
+
- [ ] 의존성에 알려진 취약점이 없는가
|
|
59
|
+
|
|
60
|
+
### 3. 성능 (Performance)
|
|
61
|
+
- [ ] N+1 쿼리 문제가 없는가
|
|
62
|
+
- [ ] 불필요한 리렌더링이 없는가 (React)
|
|
63
|
+
- [ ] 대용량 데이터 처리 시 페이지네이션/스트리밍이 적용되었는가
|
|
64
|
+
- [ ] 캐싱이 적절히 사용되었는가
|
|
65
|
+
- [ ] 번들 사이즈 영향이 최소화되었는가
|
|
66
|
+
- [ ] 비동기 작업이 병렬 처리 가능한 경우 Promise.all 사용되었는가
|
|
67
|
+
|
|
68
|
+
### 4. 가독성 (Readability)
|
|
69
|
+
- [ ] 변수/함수/클래스명이 의도를 명확히 표현하는가
|
|
70
|
+
- [ ] 복잡한 로직에 주석이 있는가 (why, not what)
|
|
71
|
+
- [ ] 함수가 단일 책임을 가지는가
|
|
72
|
+
- [ ] 중첩이 깊지 않은가 (early return 활용)
|
|
73
|
+
- [ ] 매직 넘버가 상수로 추출되었는가
|
|
74
|
+
- [ ] 코드 중복이 없는가 (DRY)
|
|
75
|
+
|
|
76
|
+
### 5. 테스트 (Tests)
|
|
77
|
+
- [ ] 새 기능에 대한 테스트가 추가되었는가
|
|
78
|
+
- [ ] 버그 수정에 회귀 테스트가 추가되었는가
|
|
79
|
+
- [ ] 테스트가 의미 있는 시나리오를 커버하는가 (happy path + error path)
|
|
80
|
+
- [ ] 테스트가 독립적으로 실행 가능한가 (외부 의존성 모킹)
|
|
81
|
+
- [ ] 테스트 이름이 시나리오를 설명하는가
|
|
82
|
+
|
|
83
|
+
### 6. 아키텍처 (Architecture)
|
|
84
|
+
- [ ] 기존 아키텍처 패턴과 일관되는가
|
|
85
|
+
- [ ] 적절한 계층에 코드가 위치하는가 (controller/service/repository)
|
|
86
|
+
- [ ] 의존성 방향이 올바른가 (상위 → 하위, 순환 없음)
|
|
87
|
+
- [ ] 인터페이스/타입이 yua-shared(SSOT)에 정의되었는가 (모노레포)
|
|
88
|
+
- [ ] 공유 가능한 로직이 적절히 추출되었는가
|
|
89
|
+
|
|
90
|
+
## Diff 분석 전략
|
|
91
|
+
|
|
92
|
+
### 분석 순서
|
|
93
|
+
1. **파일 목록 먼저**: 변경된 파일 목록으로 전체 범위 파악
|
|
94
|
+
2. **타입/인터페이스**: 계약 변경부터 확인 (영향 범위 파악)
|
|
95
|
+
3. **핵심 로직**: 비즈니스 로직 변경 분석
|
|
96
|
+
4. **테스트**: 테스트 커버리지 확인
|
|
97
|
+
5. **설정/인프라**: 빌드, CI, 환경 설정 변경
|
|
98
|
+
|
|
99
|
+
### 주의 깊게 볼 패턴
|
|
100
|
+
- 삭제된 코드: 의도적 삭제인지, 실수인지
|
|
101
|
+
- 큰 파일 변경: 리팩토링과 기능 변경이 섞여있지 않은지
|
|
102
|
+
- 새 의존성: 정말 필요한지, 라이선스는 호환되는지
|
|
103
|
+
- 환경 설정 변경: 다른 환경에 영향이 없는지
|
|
104
|
+
|
|
105
|
+
## Conventional Comments 형식
|
|
106
|
+
|
|
107
|
+
### Comment Types
|
|
108
|
+
| Type | 용도 | 차단 여부 |
|
|
109
|
+
|-------------|-------------------------------|----------|
|
|
110
|
+
| `suggestion` | 개선 제안 | 비차단 |
|
|
111
|
+
| `issue` | 반드시 수정 필요한 문제 | 차단 |
|
|
112
|
+
| `question` | 이해를 위한 질문 | 비차단 |
|
|
113
|
+
| `thought` | 관련 아이디어/고려사항 | 비차단 |
|
|
114
|
+
| `praise` | 잘된 부분 칭찬 | 비차단 |
|
|
115
|
+
| `nit` | 사소한 스타일/네이밍 제안 | 비차단 |
|
|
116
|
+
| `todo` | 후속 작업 필요 | 비차단 |
|
|
117
|
+
|
|
118
|
+
### Comment 형식
|
|
119
|
+
```
|
|
120
|
+
<type> [(<decoration>)]: <description>
|
|
121
|
+
|
|
122
|
+
[optional discussion]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 예시
|
|
126
|
+
```
|
|
127
|
+
suggestion (non-blocking): Consider using `Map` instead of plain object
|
|
128
|
+
for better key type safety and iteration performance.
|
|
129
|
+
|
|
130
|
+
issue (blocking): This endpoint lacks authentication middleware.
|
|
131
|
+
All user-facing endpoints must use `requireAuth()`.
|
|
132
|
+
|
|
133
|
+
question: Is this timeout value (30s) intentional?
|
|
134
|
+
It seems high for a health check endpoint.
|
|
135
|
+
|
|
136
|
+
praise: Great use of the builder pattern here.
|
|
137
|
+
Makes the complex query construction very readable.
|
|
138
|
+
|
|
139
|
+
nit: Prefer `const` over `let` here since the value is never reassigned.
|
|
140
|
+
|
|
141
|
+
todo: This error message should be i18n-ready.
|
|
142
|
+
Can be addressed in a follow-up PR.
|
|
143
|
+
|
|
144
|
+
thought: As the number of strategies grows, this switch statement
|
|
145
|
+
might benefit from a strategy pattern or registry approach.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Severity 데코레이션
|
|
149
|
+
- `(blocking)`: PR 머지 전 반드시 수정 필요
|
|
150
|
+
- `(non-blocking)`: 수정 권장하지만 머지 가능
|
|
151
|
+
- `(if-minor)`: 수정이 간단하면 이번 PR에서, 아니면 후속 PR
|
|
152
|
+
|
|
153
|
+
## 리뷰 작성 가이드
|
|
154
|
+
|
|
155
|
+
### 좋은 리뷰 원칙
|
|
156
|
+
1. **구체적**: "이상해요" 대신 "null 체크가 빠져서 TypeError 날 수 있습니다"
|
|
157
|
+
2. **건설적**: 문제만 지적하지 않고 해결책 제안
|
|
158
|
+
3. **교육적**: 왜 문제인지 설명, 참고 자료 링크
|
|
159
|
+
4. **균형잡힌**: 좋은 점도 언급 (praise)
|
|
160
|
+
5. **겸손한**: "이게 더 나을 수 있을까요?" 형태의 질문
|
|
161
|
+
|
|
162
|
+
### 피해야 할 리뷰 패턴
|
|
163
|
+
- 코드 스타일만 지적 (linter에 맡기기)
|
|
164
|
+
- 개인 취향 강요 (팀 컨벤션에 없는 것)
|
|
165
|
+
- 과도한 nit-picking (PR당 nit 3개 이하)
|
|
166
|
+
- 리뷰 없이 approve
|
|
167
|
+
- 컨텍스트 없는 "LGTM"
|
|
168
|
+
|
|
169
|
+
## Known Error Patterns
|
|
170
|
+
- **PR 너무 큼**: 1000줄+ 변경 → 분리 요청 (stacked PRs 제안)
|
|
171
|
+
- **테스트 누락**: 기능 변경에 테스트 없음 → 테스트 추가 요청 (blocking)
|
|
172
|
+
- **description 없음**: PR 본문이 비어있음 → 템플릿 사용 요청
|
|
173
|
+
- **리뷰 지연**: 리뷰 요청 후 24시간+ 미응답 → 리마인더 제안
|
|
174
|
+
- **merge conflict 방치**: conflict 있는 채로 리뷰 요청 → resolve 먼저 요청
|
|
175
|
+
- **WIP 커밋 포함**: "WIP", "temp" 커밋이 남아있음 → history-clean 스킬 연계
|
|
176
|
+
|
|
177
|
+
## Tool Sequence
|
|
178
|
+
1. `shell_exec` — `git log --oneline main..HEAD` PR 커밋 목록 확인
|
|
179
|
+
2. `shell_exec` — `git diff --stat main..HEAD` 변경 파일 통계
|
|
180
|
+
3. `shell_exec` — `git diff main..HEAD` 전체 diff 확인
|
|
181
|
+
4. `file_read` — 변경된 핵심 파일 읽기 (전체 컨텍스트)
|
|
182
|
+
5. `grep` — 보안 패턴 검색 (하드코딩된 시크릿, SQL injection 등)
|
|
183
|
+
6. `shell_exec` — `git diff main..HEAD -- '*.test.*' '*.spec.*'` 테스트 변경 확인
|
|
184
|
+
7. 분석 — 체크리스트 기반 리뷰 수행
|
|
185
|
+
8. 출력 — Conventional Comments 형식으로 리뷰 작성
|
|
186
|
+
9. 출력 — PR 요약 및 최종 판정 (approve / request changes / comment)
|
|
187
|
+
|
|
188
|
+
## Validation Checklist
|
|
189
|
+
- [ ] PR description이 변경 내용을 명확히 설명함
|
|
190
|
+
- [ ] 모든 blocking issue가 식별됨
|
|
191
|
+
- [ ] 보안 관련 변경에 보안 리뷰가 수행됨
|
|
192
|
+
- [ ] 테스트 커버리지가 적절함
|
|
193
|
+
- [ ] breaking change가 명시됨 (해당 시)
|
|
194
|
+
- [ ] 리뷰 코멘트가 Conventional Comments 형식
|
|
195
|
+
- [ ] 칭찬(praise)이 최소 1개 포함됨
|
|
196
|
+
- [ ] 최종 판정과 근거가 제시됨
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "conflict-resolve",
|
|
3
|
+
"name": "Merge Conflict Resolution Strategy",
|
|
4
|
+
"description": "단계별 merge conflict 해결 전략. 충돌 식별부터 빌드/테스트 검증까지.",
|
|
5
|
+
"phases": [
|
|
6
|
+
{
|
|
7
|
+
"id": "identify",
|
|
8
|
+
"name": "Identify Conflicts",
|
|
9
|
+
"order": 1,
|
|
10
|
+
"description": "충돌 상태를 파악하고 영향 범위를 평가한다.",
|
|
11
|
+
"steps": [
|
|
12
|
+
{
|
|
13
|
+
"command": "git status",
|
|
14
|
+
"purpose": "현재 merge/rebase 상태 및 충돌 파일 목록 확인",
|
|
15
|
+
"expect": "both modified, both added, deleted by us/them 상태 파일"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"command": "git diff --name-only --diff-filter=U",
|
|
19
|
+
"purpose": "Unmerged 파일만 추출",
|
|
20
|
+
"expect": "충돌 파일 경로 목록"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"command": "git log --oneline --left-right HEAD...MERGE_HEAD -20",
|
|
24
|
+
"purpose": "양쪽 브랜치의 커밋 이력 비교",
|
|
25
|
+
"expect": "< (ours) 및 > (theirs) 커밋 목록"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"outputs": {
|
|
29
|
+
"conflictFiles": "충돌 파일 목록",
|
|
30
|
+
"conflictCount": "총 충돌 파일 수",
|
|
31
|
+
"mergeType": "merge | rebase | cherry-pick"
|
|
32
|
+
},
|
|
33
|
+
"failCondition": "git status가 충돌 상태가 아닌 경우",
|
|
34
|
+
"failAction": "merge/rebase 진행 중이 아니라면 스킵"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "read-conflicts",
|
|
38
|
+
"name": "Read & Analyze Conflicts",
|
|
39
|
+
"order": 2,
|
|
40
|
+
"description": "각 충돌 파일의 내용을 읽고 충돌 유형을 분류한다.",
|
|
41
|
+
"steps": [
|
|
42
|
+
{
|
|
43
|
+
"tool": "file_read",
|
|
44
|
+
"target": "각 충돌 파일",
|
|
45
|
+
"purpose": "conflict 마커 포함 전체 내용 확인"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"command": "git show :1:{file}",
|
|
49
|
+
"purpose": "BASE 버전 확인 (공통 조상)",
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"command": "git show :2:{file}",
|
|
54
|
+
"purpose": "OURS 버전 확인 (현재 브랜치)",
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"command": "git show :3:{file}",
|
|
59
|
+
"purpose": "THEIRS 버전 확인 (병합 대상)",
|
|
60
|
+
"optional": true
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"classification": {
|
|
64
|
+
"types": [
|
|
65
|
+
{
|
|
66
|
+
"type": "same-line-edit",
|
|
67
|
+
"description": "같은 줄을 양쪽에서 다르게 수정",
|
|
68
|
+
"autoResolvable": false,
|
|
69
|
+
"risk": "high"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"type": "import-reorder",
|
|
73
|
+
"description": "import 문 순서 변경",
|
|
74
|
+
"autoResolvable": true,
|
|
75
|
+
"risk": "low"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"type": "adjacent-line",
|
|
79
|
+
"description": "인접한 줄을 양쪽에서 수정",
|
|
80
|
+
"autoResolvable": "conditional",
|
|
81
|
+
"risk": "medium"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"type": "rename-edit",
|
|
85
|
+
"description": "한쪽은 파일 rename, 다른 쪽은 내용 수정",
|
|
86
|
+
"autoResolvable": false,
|
|
87
|
+
"risk": "medium"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"type": "delete-modify",
|
|
91
|
+
"description": "한쪽은 삭제, 다른 쪽은 수정",
|
|
92
|
+
"autoResolvable": false,
|
|
93
|
+
"risk": "high"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"type": "both-add",
|
|
97
|
+
"description": "같은 위치에 양쪽 모두 새 코드 추가",
|
|
98
|
+
"autoResolvable": "conditional",
|
|
99
|
+
"risk": "medium"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"type": "lockfile",
|
|
103
|
+
"description": "package-lock.json / pnpm-lock.yaml 충돌",
|
|
104
|
+
"autoResolvable": true,
|
|
105
|
+
"risk": "low",
|
|
106
|
+
"resolution": "accept theirs + reinstall"
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"outputs": {
|
|
111
|
+
"conflictDetails": "파일별 충돌 유형, 위치, 심각도"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "resolve",
|
|
116
|
+
"name": "Resolve Conflicts",
|
|
117
|
+
"order": 3,
|
|
118
|
+
"description": "각 충돌을 유형별 전략에 따라 해결한다.",
|
|
119
|
+
"strategies": {
|
|
120
|
+
"same-line-edit": {
|
|
121
|
+
"steps": [
|
|
122
|
+
"양쪽 커밋 메시지/PR 설명에서 변경 의도 파악",
|
|
123
|
+
"BASE 버전과 비교하여 각 변경의 목적 이해",
|
|
124
|
+
"최신 의도를 반영하되 양쪽 기능이 보존되도록 통합",
|
|
125
|
+
"통합이 불가능하면 팀/작성자에게 확인 요청"
|
|
126
|
+
],
|
|
127
|
+
"priority": "theirs가 최신이면 theirs 우선, 양쪽 다 필요하면 통합"
|
|
128
|
+
},
|
|
129
|
+
"import-reorder": {
|
|
130
|
+
"steps": [
|
|
131
|
+
"양쪽의 추가/삭제된 import 파악",
|
|
132
|
+
"모든 필요한 import를 포함",
|
|
133
|
+
"알파벳 순서로 정렬",
|
|
134
|
+
"미사용 import 제거"
|
|
135
|
+
],
|
|
136
|
+
"priority": "모두 포함 후 정렬"
|
|
137
|
+
},
|
|
138
|
+
"lockfile": {
|
|
139
|
+
"steps": [
|
|
140
|
+
"lock file의 conflict를 accept theirs로 해결",
|
|
141
|
+
"pnpm install 재실행으로 lock file 재생성",
|
|
142
|
+
"재생성된 lock file을 staging"
|
|
143
|
+
],
|
|
144
|
+
"priority": "항상 재생성"
|
|
145
|
+
},
|
|
146
|
+
"delete-modify": {
|
|
147
|
+
"steps": [
|
|
148
|
+
"삭제한 쪽의 의도 확인 (리팩토링? 불필요?)",
|
|
149
|
+
"수정한 쪽의 변경 내용 확인",
|
|
150
|
+
"리팩토링으로 이동된 경우: 이동된 파일에 수정 적용",
|
|
151
|
+
"불필요해서 삭제된 경우: 삭제 유지"
|
|
152
|
+
],
|
|
153
|
+
"priority": "의도 기반 판단 필수"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
"steps": [
|
|
157
|
+
{
|
|
158
|
+
"tool": "file_edit",
|
|
159
|
+
"purpose": "conflict 마커 제거 및 최종 코드 작성"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"command": "git add {resolved_file}",
|
|
163
|
+
"purpose": "해결 완료 표시"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"outputs": {
|
|
167
|
+
"resolvedFiles": "해결된 파일 목록",
|
|
168
|
+
"resolutionType": "파일별 해결 방식 (ours/theirs/both/manual)"
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "verify-build",
|
|
173
|
+
"name": "Verify Build",
|
|
174
|
+
"order": 4,
|
|
175
|
+
"description": "충돌 해결 후 빌드가 정상적으로 통과하는지 확인한다.",
|
|
176
|
+
"steps": [
|
|
177
|
+
{
|
|
178
|
+
"command": "git diff --check",
|
|
179
|
+
"purpose": "미해결 conflict 마커 잔존 확인",
|
|
180
|
+
"expect": "출력 없음 (잔존 마커 없음)"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"command": "grep -rn '<<<<<<<\\|=======\\|>>>>>>>' {resolvedFiles}",
|
|
184
|
+
"purpose": "conflict 마커 이중 확인",
|
|
185
|
+
"expect": "매칭 없음"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"command": "tsc --noEmit",
|
|
189
|
+
"purpose": "TypeScript 컴파일 체크",
|
|
190
|
+
"expect": "에러 0개",
|
|
191
|
+
"conditional": "tsconfig.json이 있을 때만"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"command": "pnpm build",
|
|
195
|
+
"purpose": "전체 빌드 확인",
|
|
196
|
+
"expect": "빌드 성공"
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
"outputs": {
|
|
200
|
+
"buildStatus": "pass | fail",
|
|
201
|
+
"errors": "빌드 에러 목록 (실패 시)"
|
|
202
|
+
},
|
|
203
|
+
"failAction": "에러 기반 자동 수정 시도 (최대 3회)"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"id": "verify-tests",
|
|
207
|
+
"name": "Verify Tests",
|
|
208
|
+
"order": 5,
|
|
209
|
+
"description": "테스트 스위트가 통과하는지 확인한다.",
|
|
210
|
+
"steps": [
|
|
211
|
+
{
|
|
212
|
+
"command": "pnpm test",
|
|
213
|
+
"purpose": "전체 테스트 실행",
|
|
214
|
+
"expect": "모든 테스트 통과",
|
|
215
|
+
"optional": true,
|
|
216
|
+
"timeout": 120000
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"command": "pnpm --filter {affectedPackages} test",
|
|
220
|
+
"purpose": "영향받는 패키지만 테스트",
|
|
221
|
+
"expect": "테스트 통과",
|
|
222
|
+
"conditional": "모노레포일 때"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
"outputs": {
|
|
226
|
+
"testStatus": "pass | fail | skipped",
|
|
227
|
+
"failedTests": "실패한 테스트 목록 (실패 시)"
|
|
228
|
+
},
|
|
229
|
+
"failAction": "테스트 실패 원인 분석 및 수정",
|
|
230
|
+
"completion": {
|
|
231
|
+
"onSuccess": "git commit 으로 merge 완료 (또는 git rebase --continue)",
|
|
232
|
+
"onFail": "실패 원인과 수동 개입 필요 사항 보고"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
"config": {
|
|
237
|
+
"maxAutoRetries": 3,
|
|
238
|
+
"requireBuildPass": true,
|
|
239
|
+
"requireTestPass": false,
|
|
240
|
+
"autoResolveTypes": ["import-reorder", "lockfile"],
|
|
241
|
+
"manualResolveTypes": ["same-line-edit", "delete-modify"],
|
|
242
|
+
"notifyOnCompletion": true
|
|
243
|
+
}
|
|
244
|
+
}
|