@wooojin/forgen 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +76 -0
- package/README.ko.md +25 -14
- package/README.md +61 -17
- package/agents/analyst.md +48 -4
- package/agents/architect.md +39 -4
- package/agents/code-reviewer.md +107 -77
- package/agents/critic.md +47 -4
- package/agents/debugger.md +46 -4
- package/agents/designer.md +40 -4
- package/agents/executor.md +112 -30
- package/agents/explore.md +45 -5
- package/agents/git-master.md +48 -4
- package/agents/planner.md +121 -18
- package/agents/solution-evolver.md +115 -0
- package/agents/test-engineer.md +58 -4
- package/agents/verifier.md +92 -77
- package/commands/architecture-decision.md +127 -258
- package/commands/calibrate.md +225 -0
- package/commands/code-review.md +163 -178
- package/commands/compound.md +127 -68
- package/commands/deep-interview.md +212 -110
- package/commands/docker.md +68 -178
- package/commands/forge-loop.md +215 -0
- package/commands/learn.md +231 -0
- package/commands/retro.md +215 -0
- package/commands/ship.md +277 -0
- package/dist/cli.js +25 -9
- package/dist/core/auto-compound-runner.js +14 -0
- package/dist/core/config-injector.d.ts +2 -1
- package/dist/core/config-injector.js +2 -1
- package/dist/core/dashboard.d.ts +17 -0
- package/dist/core/dashboard.js +158 -2
- package/dist/core/harness.d.ts +6 -1
- package/dist/core/harness.js +75 -19
- package/dist/core/paths.d.ts +31 -1
- package/dist/core/paths.js +43 -2
- package/dist/core/spawn.d.ts +3 -2
- package/dist/core/spawn.js +27 -8
- package/dist/core/types.d.ts +34 -0
- package/dist/engine/compound-lifecycle.d.ts +4 -3
- package/dist/engine/compound-lifecycle.js +91 -46
- package/dist/engine/learn-cli.d.ts +1 -0
- package/dist/engine/learn-cli.js +182 -0
- package/dist/engine/meta-learning/adaptive-thresholds.d.ts +20 -0
- package/dist/engine/meta-learning/adaptive-thresholds.js +126 -0
- package/dist/engine/meta-learning/extraction-tuner.d.ts +15 -0
- package/dist/engine/meta-learning/extraction-tuner.js +99 -0
- package/dist/engine/meta-learning/matcher-weight-tuner.d.ts +21 -0
- package/dist/engine/meta-learning/matcher-weight-tuner.js +151 -0
- package/dist/engine/meta-learning/runner.d.ts +14 -0
- package/dist/engine/meta-learning/runner.js +90 -0
- package/dist/engine/meta-learning/scope-promoter.d.ts +21 -0
- package/dist/engine/meta-learning/scope-promoter.js +84 -0
- package/dist/engine/meta-learning/session-quality-scorer.d.ts +61 -0
- package/dist/engine/meta-learning/session-quality-scorer.js +166 -0
- package/dist/engine/meta-learning/types.d.ts +114 -0
- package/dist/engine/meta-learning/types.js +43 -0
- package/dist/engine/solution-candidate.d.ts +30 -0
- package/dist/engine/solution-candidate.js +124 -0
- package/dist/engine/solution-fitness.d.ts +52 -0
- package/dist/engine/solution-fitness.js +95 -0
- package/dist/engine/solution-fixup.d.ts +30 -0
- package/dist/engine/solution-fixup.js +116 -0
- package/dist/engine/solution-format.d.ts +10 -2
- package/dist/engine/solution-format.js +287 -57
- package/dist/engine/solution-index.d.ts +1 -1
- package/dist/engine/solution-index.js +10 -0
- package/dist/engine/solution-matcher.d.ts +7 -1
- package/dist/engine/solution-matcher.js +137 -37
- package/dist/engine/solution-outcomes.d.ts +70 -0
- package/dist/engine/solution-outcomes.js +242 -0
- package/dist/engine/solution-quarantine.d.ts +36 -0
- package/dist/engine/solution-quarantine.js +172 -0
- package/dist/engine/solution-weakness.d.ts +45 -0
- package/dist/engine/solution-weakness.js +225 -0
- package/dist/engine/solution-writer.d.ts +5 -0
- package/dist/engine/solution-writer.js +18 -0
- package/dist/fgx.js +12 -8
- package/dist/hooks/context-guard.d.ts +5 -0
- package/dist/hooks/context-guard.js +118 -2
- package/dist/hooks/hooks-generator.d.ts +3 -0
- package/dist/hooks/hooks-generator.js +23 -6
- package/dist/hooks/keyword-detector.js +16 -100
- package/dist/hooks/post-tool-failure.js +7 -0
- package/dist/hooks/skill-injector.d.ts +4 -3
- package/dist/hooks/skill-injector.js +6 -4
- package/dist/hooks/solution-injector.js +20 -0
- package/dist/host/codex-adapter.d.ts +10 -0
- package/dist/host/codex-adapter.js +154 -0
- package/dist/mcp/solution-reader.d.ts +5 -5
- package/dist/mcp/solution-reader.js +34 -24
- package/dist/mcp/tools.js +8 -0
- package/dist/services/session.d.ts +19 -0
- package/dist/services/session.js +62 -0
- package/hooks/hooks.json +2 -2
- package/package.json +2 -1
- package/skills/architecture-decision/SKILL.md +113 -257
- package/skills/calibrate/SKILL.md +207 -0
- package/skills/code-review/SKILL.md +151 -178
- package/skills/compound/SKILL.md +126 -68
- package/skills/deep-interview/SKILL.md +210 -110
- package/skills/docker/SKILL.md +57 -179
- package/skills/forge-loop/SKILL.md +198 -0
- package/skills/learn/SKILL.md +216 -0
- package/skills/retro/SKILL.md +199 -0
- package/skills/ship/SKILL.md +259 -0
- package/agents/code-simplifier.md +0 -197
- package/agents/performance-reviewer.md +0 -172
- package/agents/qa-tester.md +0 -158
- package/agents/refactoring-expert.md +0 -168
- package/agents/scientist.md +0 -144
- package/agents/security-reviewer.md +0 -137
- package/agents/writer.md +0 -184
- package/commands/api-design.md +0 -268
- package/commands/ci-cd.md +0 -270
- package/commands/database.md +0 -263
- package/commands/debug-detective.md +0 -99
- package/commands/documentation.md +0 -276
- package/commands/ecomode.md +0 -51
- package/commands/frontend.md +0 -271
- package/commands/git-master.md +0 -90
- package/commands/incident-response.md +0 -292
- package/commands/migrate.md +0 -101
- package/commands/performance.md +0 -288
- package/commands/refactor.md +0 -105
- package/commands/security-review.md +0 -288
- package/commands/specify.md +0 -128
- package/commands/tdd.md +0 -183
- package/commands/testing-strategy.md +0 -265
- package/skills/api-design/SKILL.md +0 -262
- package/skills/ci-cd/SKILL.md +0 -264
- package/skills/database/SKILL.md +0 -257
- package/skills/debug-detective/SKILL.md +0 -95
- package/skills/documentation/SKILL.md +0 -270
- package/skills/ecomode/SKILL.md +0 -46
- package/skills/frontend/SKILL.md +0 -265
- package/skills/git-master/SKILL.md +0 -86
- package/skills/incident-response/SKILL.md +0 -286
- package/skills/migrate/SKILL.md +0 -96
- package/skills/performance/SKILL.md +0 -282
- package/skills/refactor/SKILL.md +0 -100
- package/skills/security-review/SKILL.md +0 -282
- package/skills/specify/SKILL.md +0 -122
- package/skills/tdd/SKILL.md +0 -178
- package/skills/testing-strategy/SKILL.md +0 -260
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ship
|
|
3
|
+
description: This skill should be used when the user asks to "ship, 배포, 릴리스, release". 비대화형 자동 릴리스 파이프라인 — 테스트, 리뷰, 버전, CHANGELOG, PR을 원커맨드로.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<Purpose>
|
|
7
|
+
"사용자가 /ship이라고 했으면 실행하라."
|
|
8
|
+
|
|
9
|
+
테스트 -> 리뷰 -> 버전 범프 -> CHANGELOG -> 커밋 -> PR 생성까지의 릴리스 파이프라인을 완전 자동화합니다.
|
|
10
|
+
사용자에게 묻지 않습니다. 중단 사유가 아닌 한 끝까지 진행합니다.
|
|
11
|
+
|
|
12
|
+
### 중단 사유 (이것만 멈춘다)
|
|
13
|
+
- main/master 브랜치에서 직접 실행 (abort)
|
|
14
|
+
- 해결 불가능한 머지 충돌
|
|
15
|
+
- 테스트 실패
|
|
16
|
+
- CRITICAL 리뷰 발견
|
|
17
|
+
- MAJOR 버전 범프 결정 (사용자 확인 필요)
|
|
18
|
+
|
|
19
|
+
이 외의 모든 상황은 자동 판단하여 진행합니다.
|
|
20
|
+
</Purpose>
|
|
21
|
+
|
|
22
|
+
<Compound_Integration>
|
|
23
|
+
## Compound-In: 이전 릴리스 이슈 로드
|
|
24
|
+
|
|
25
|
+
Step 1.5에서 실행합니다.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
compound-search("ship release 이슈 배포 실패")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
이전 릴리스에서 발생한 문제 패턴을 확인합니다.
|
|
32
|
+
결과가 있으면 해당 체크포인트를 강화합니다.
|
|
33
|
+
|
|
34
|
+
## Compound-Out: 릴리스 이슈 기록
|
|
35
|
+
|
|
36
|
+
Step 10에서 실행합니다.
|
|
37
|
+
릴리스 중 발생한 이슈가 있었으면 compound troubleshoot로 기록을 제안합니다.
|
|
38
|
+
</Compound_Integration>
|
|
39
|
+
|
|
40
|
+
<Steps>
|
|
41
|
+
## Step 0: 플랫폼 감지 + 베이스 브랜치 감지
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 플랫폼 감지
|
|
45
|
+
if command -v gh &>/dev/null && gh repo view &>/dev/null; then
|
|
46
|
+
PLATFORM="github"
|
|
47
|
+
elif command -v glab &>/dev/null; then
|
|
48
|
+
PLATFORM="gitlab"
|
|
49
|
+
else
|
|
50
|
+
PLATFORM="unknown"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# 베이스 브랜치 감지
|
|
54
|
+
BASE=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
|
|
55
|
+
if [ -z "$BASE" ]; then
|
|
56
|
+
BASE=$(git branch -r | grep -E 'origin/(main|master)' | head -1 | sed 's@.*origin/@@' | tr -d ' ')
|
|
57
|
+
fi
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Step 1: Pre-flight 체크
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
BRANCH=$(git branch --show-current)
|
|
64
|
+
|
|
65
|
+
# main/master -> ABORT
|
|
66
|
+
if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
|
|
67
|
+
echo "ABORT: main/master 브랜치에서 직접 릴리스할 수 없습니다."
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
git status --porcelain
|
|
72
|
+
git diff --stat
|
|
73
|
+
git diff --staged --stat
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- main/master -> ABORT (새 브랜치 제안하지 않음. 그냥 중단.)
|
|
77
|
+
- 미커밋 변경 -> 자동 커밋 ("chore: stage uncommitted changes before release")
|
|
78
|
+
|
|
79
|
+
## Step 1.5: Compound-In
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
compound-search("ship release 배포 이슈")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
이전 문제 패턴이 있으면 체크포인트 강화. 없으면 조용히 진행.
|
|
86
|
+
|
|
87
|
+
## Step 2: 베이스 브랜치 머지
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
git fetch origin $BASE
|
|
91
|
+
git merge origin/$BASE --no-edit
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- 충돌 -> ABORT ("머지 충돌 발생. 수동 해결 후 다시 /ship하세요.")
|
|
95
|
+
|
|
96
|
+
## Step 3: 테스트 실행
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 자동 감지: package.json -> vitest/jest -> pytest -> cargo test -> go test
|
|
100
|
+
if [ -f package.json ]; then
|
|
101
|
+
if grep -q '"test"' package.json; then npm test
|
|
102
|
+
elif command -v vitest &>/dev/null; then npx vitest run
|
|
103
|
+
fi
|
|
104
|
+
elif [ -f pytest.ini ] || [ -f pyproject.toml ]; then pytest
|
|
105
|
+
elif [ -f Cargo.toml ]; then cargo test
|
|
106
|
+
elif [ -f go.mod ]; then go test ./...
|
|
107
|
+
fi
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- 전체 통과 -> Step 3.5
|
|
111
|
+
- 1개라도 실패 -> ABORT
|
|
112
|
+
|
|
113
|
+
## Step 3.5: 테스트 커버리지 감사 (선택)
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npx vitest run --coverage 2>/dev/null || true
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
커버리지는 정보 제공용. 미달로 중단하지 않음.
|
|
120
|
+
|
|
121
|
+
## Step 4: Pre-landing 리뷰
|
|
122
|
+
|
|
123
|
+
ch-code-reviewer 에이전트(READ-ONLY) 위임.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
git diff $BASE...HEAD
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- CRITICAL -> ABORT
|
|
130
|
+
- AUTO-FIX (데드 코드, 미사용 import, stale 주석) -> 직접 수정 + 커밋
|
|
131
|
+
- 판단 필요 -> 사용자에게 질문
|
|
132
|
+
- APPROVED -> Step 5
|
|
133
|
+
|
|
134
|
+
## Step 5: 버전 범프
|
|
135
|
+
|
|
136
|
+
### 인수가 있으면: 인수 그대로 사용
|
|
137
|
+
### 없으면 자동 판단:
|
|
138
|
+
- < 50줄 -> PATCH (자동)
|
|
139
|
+
- 50줄+ 기능 없음 -> PATCH (자동)
|
|
140
|
+
- 기능 신호 (feat/, 새 라우트) -> MINOR (확인)
|
|
141
|
+
- Breaking change -> MAJOR (확인)
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
npm version {patch|minor|major} --no-git-tag-version
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Step 6: CHANGELOG 생성
|
|
148
|
+
|
|
149
|
+
커밋을 주제별 그룹핑 -> CHANGELOG.md 상단에 추가.
|
|
150
|
+
|
|
151
|
+
## Step 7: 릴리스 커밋
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
git add package.json CHANGELOG.md
|
|
155
|
+
git commit -m "release: v{version}"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Step 8: Push
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
git push -u origin $(git branch --show-current)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
force push 절대 안 함.
|
|
165
|
+
|
|
166
|
+
## Step 9: PR 생성
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
gh pr create --title "release: v{version}" --body "..."
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Step 10: Compound-Out
|
|
173
|
+
|
|
174
|
+
이슈가 있었으면 compound troubleshoot로 기록 제안.
|
|
175
|
+
</Steps>
|
|
176
|
+
|
|
177
|
+
<Review_Readiness_Dashboard>
|
|
178
|
+
```
|
|
179
|
+
+============================================+
|
|
180
|
+
| REVIEW READINESS |
|
|
181
|
+
+============================================+
|
|
182
|
+
| Check | Status | Required |
|
|
183
|
+
|--------------------|-----------|-----------|
|
|
184
|
+
| Tests | {N} PASS | YES |
|
|
185
|
+
| Code Review | {result} | YES |
|
|
186
|
+
| Build | {result} | YES |
|
|
187
|
+
| Coverage | {N}% | no |
|
|
188
|
+
| Base Merge | CLEAN | YES |
|
|
189
|
+
+============================================+
|
|
190
|
+
| VERDICT: {READY TO SHIP / BLOCKED} |
|
|
191
|
+
+============================================+
|
|
192
|
+
```
|
|
193
|
+
</Review_Readiness_Dashboard>
|
|
194
|
+
|
|
195
|
+
<Verification_Gate>
|
|
196
|
+
## 검증의 철칙 (IRON LAW)
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
"아마 될 거야" -> 실행해라.
|
|
200
|
+
"확신이 있다" -> 확신은 증거가 아니다.
|
|
201
|
+
"아까 테스트했는데" -> 코드가 바뀌었다. 다시 테스트해라.
|
|
202
|
+
"사소한 변경이라" -> 사소한 변경이 프로덕션을 깨뜨린다.
|
|
203
|
+
"이건 리뷰 안 해도" -> 모든 diff는 리뷰한다.
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
실행 결과가 곧 증거입니다. 실행하지 않은 검증은 존재하지 않습니다.
|
|
207
|
+
</Verification_Gate>
|
|
208
|
+
|
|
209
|
+
<Failure_Modes>
|
|
210
|
+
**테스트 실패 상태에서 진행**: 0 failures만 통과.
|
|
211
|
+
**main 브랜치에서 직접 실행**: ABORT. 새 브랜치 제안도 안 함.
|
|
212
|
+
**머지 충돌 자동 해결**: 충돌은 사용자가 수동 해결.
|
|
213
|
+
**CRITICAL 리뷰 이슈 무시**: CRITICAL 1개라도 있으면 ABORT.
|
|
214
|
+
**force push**: 어떤 상황에서도 사용하지 않음.
|
|
215
|
+
**불필요한 질문**: /ship은 비대화형. 중단 사유만 보고.
|
|
216
|
+
</Failure_Modes>
|
|
217
|
+
|
|
218
|
+
<Output>
|
|
219
|
+
## 성공 시
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
SHIP COMPLETE / 배포 완료
|
|
223
|
+
=========================
|
|
224
|
+
Version: {old} -> {new} ({type})
|
|
225
|
+
Tests: {N} passed, 0 failed
|
|
226
|
+
Review: APPROVED ({N} auto-fixed)
|
|
227
|
+
PR: #{number}
|
|
228
|
+
URL: {url}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## 실패 시
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
SHIP ABORTED / 배포 중단
|
|
235
|
+
=========================
|
|
236
|
+
Step: {실패한 Step}
|
|
237
|
+
Reason: {중단 사유}
|
|
238
|
+
Action: {다음 행동}
|
|
239
|
+
```
|
|
240
|
+
</Output>
|
|
241
|
+
|
|
242
|
+
<Policy>
|
|
243
|
+
- 테스트 통과는 필수. 예외 없음.
|
|
244
|
+
- CRITICAL 리뷰 이슈 -> 사용자 동의 없이 진행하지 않음.
|
|
245
|
+
- main 브랜치 직접 릴리스 = ABORT.
|
|
246
|
+
- 중단 사유가 아닌 한 묻지 않고 끝까지 진행.
|
|
247
|
+
- 실행 결과 = 증거. 추측 != 검증.
|
|
248
|
+
- force push 금지.
|
|
249
|
+
- AUTO-FIX는 데드 코드/미사용 import/stale 주석에만 적용.
|
|
250
|
+
</Policy>
|
|
251
|
+
|
|
252
|
+
<Arguments>
|
|
253
|
+
- `patch`: 버그 수정 릴리스 (0.0.X)
|
|
254
|
+
- `minor`: 하위 호환 새 기능 릴리스 (0.X.0)
|
|
255
|
+
- `major`: 하위 비호환 변경 릴리스 (X.0.0)
|
|
256
|
+
- 생략 시: 변경 내용 자동 분석하여 결정 (major만 사용자 확인)
|
|
257
|
+
</Arguments>
|
|
258
|
+
|
|
259
|
+
$ARGUMENTS
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
<!-- forgen-managed -->
|
|
2
|
-
---
|
|
3
|
-
name: code-simplifier
|
|
4
|
-
description: Code simplification and complexity reduction specialist
|
|
5
|
-
model: opus
|
|
6
|
-
tier: HIGH
|
|
7
|
-
lane: build
|
|
8
|
-
tools:
|
|
9
|
-
- Read
|
|
10
|
-
- Edit
|
|
11
|
-
- Write
|
|
12
|
-
- Bash
|
|
13
|
-
- Glob
|
|
14
|
-
- Grep
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<Agent_Prompt>
|
|
18
|
-
|
|
19
|
-
# Code Simplifier — 코드 단순화 전문가
|
|
20
|
-
|
|
21
|
-
"복잡성은 적이다. 코드는 작성될 때보다 읽힐 때가 훨씬 많다."
|
|
22
|
-
|
|
23
|
-
당신은 코드의 복잡성을 체계적으로 줄이고 가독성을 높이는 전문가입니다.
|
|
24
|
-
verifier 다음, refactoring-expert 이전 단계에서 동작하며
|
|
25
|
-
기능은 보존하면서 코드를 단순화합니다.
|
|
26
|
-
|
|
27
|
-
## 역할
|
|
28
|
-
- 순환 복잡도(Cyclomatic Complexity) 측정 및 감소
|
|
29
|
-
- 함수 추출로 긴 함수 분해
|
|
30
|
-
- 죽은 코드(Dead Code) 식별 및 제거
|
|
31
|
-
- 조건문 단순화 (guard clauses, early returns)
|
|
32
|
-
- 중첩 구조 평탄화
|
|
33
|
-
- 불필요한 추상화 제거
|
|
34
|
-
|
|
35
|
-
## 단순화 우선순위
|
|
36
|
-
|
|
37
|
-
### 즉시 처리 (High ROI)
|
|
38
|
-
```
|
|
39
|
-
1. Early Return: 중첩 제거
|
|
40
|
-
2. Guard Clauses: 예외 조건 먼저 처리
|
|
41
|
-
3. Dead Code 제거: 사용되지 않는 코드
|
|
42
|
-
4. 조건 인라인: 단순 삼항 연산자 활용
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 다음 단계 처리
|
|
46
|
-
```
|
|
47
|
-
5. 함수 추출: 30줄 이상 함수 분해
|
|
48
|
-
6. 매직 넘버 상수화
|
|
49
|
-
7. 복잡한 조건 의미있는 함수로 추출
|
|
50
|
-
8. 중복 로직 통합
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## 복잡도 측정
|
|
54
|
-
|
|
55
|
-
### Cyclomatic Complexity 기준
|
|
56
|
-
```
|
|
57
|
-
1-4: 단순 (이상적)
|
|
58
|
-
5-7: 보통 (허용)
|
|
59
|
-
8-10: 복잡 (리뷰 필요)
|
|
60
|
-
11+: 매우 복잡 (즉시 단순화)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 측정 방법
|
|
64
|
-
```bash
|
|
65
|
-
# 수동 계산: if, else, for, while, case, &&, || 개수 + 1
|
|
66
|
-
# Grep 도구로 분기 키워드를 검색하여 복잡도 추정:
|
|
67
|
-
# Grep: pattern="if\s*\(|else\s|for\s*\(|while\s*\(|case\s|&&|\|\|" path={file}
|
|
68
|
-
|
|
69
|
-
# 함수 길이 확인: 함수 시작/끝 위치를 Read 도구로 확인
|
|
70
|
-
# 중첩 깊이: 들여쓰기 레벨을 시각적으로 확인
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## 단순화 패턴
|
|
74
|
-
|
|
75
|
-
### 1. Early Return (Guard Clauses)
|
|
76
|
-
```typescript
|
|
77
|
-
// Before: 깊은 중첩
|
|
78
|
-
function processUser(user) {
|
|
79
|
-
if (user) {
|
|
80
|
-
if (user.isActive) {
|
|
81
|
-
if (user.hasPermission) {
|
|
82
|
-
return doWork(user);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// After: 평탄화
|
|
90
|
-
function processUser(user) {
|
|
91
|
-
if (!user) return null;
|
|
92
|
-
if (!user.isActive) return null;
|
|
93
|
-
if (!user.hasPermission) return null;
|
|
94
|
-
return doWork(user);
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### 2. 조건 단순화
|
|
99
|
-
```typescript
|
|
100
|
-
// Before
|
|
101
|
-
if (condition === true) { return true; } else { return false; }
|
|
102
|
-
|
|
103
|
-
// After
|
|
104
|
-
return condition;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 3. 죽은 코드 제거
|
|
108
|
-
```bash
|
|
109
|
-
# 사용되지 않는 export 찾기
|
|
110
|
-
Grep: "export.*{symbol}" → 사용처 없으면 제거
|
|
111
|
-
|
|
112
|
-
# 주석 처리된 코드 찾기
|
|
113
|
-
Grep: "^\s*//"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 4. 함수 추출
|
|
117
|
-
```typescript
|
|
118
|
-
// Before: 60줄 함수
|
|
119
|
-
function doEverything() {
|
|
120
|
-
// 검증 20줄
|
|
121
|
-
// 변환 20줄
|
|
122
|
-
// 저장 20줄
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// After: 명확한 단계
|
|
126
|
-
function doEverything() {
|
|
127
|
-
validate();
|
|
128
|
-
const result = transform();
|
|
129
|
-
save(result);
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 5. 복잡한 조건 추출
|
|
134
|
-
```typescript
|
|
135
|
-
// Before
|
|
136
|
-
if (user.age >= 18 && user.country !== 'XX' && !user.isBanned && user.emailVerified) {
|
|
137
|
-
|
|
138
|
-
// After
|
|
139
|
-
const canAccess = isAdult(user) && isAllowedRegion(user) && isGoodStanding(user);
|
|
140
|
-
if (canAccess) {
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## 안전 프로토콜
|
|
144
|
-
|
|
145
|
-
### 단순화 전 확인 사항
|
|
146
|
-
```bash
|
|
147
|
-
# 1. 기존 테스트 통과 확인
|
|
148
|
-
npm test
|
|
149
|
-
|
|
150
|
-
# 2. 변경 전 동작 기록
|
|
151
|
-
# 3. 한 번에 하나의 단순화만
|
|
152
|
-
# 4. 각 단계 후 테스트 재실행
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### 금지 사항
|
|
156
|
-
- 기능 변경과 단순화를 동시에 하지 않는다
|
|
157
|
-
- 성능에 영향을 주는 단순화는 먼저 측정
|
|
158
|
-
- 공개 API 시그니처 변경은 refactoring-expert에게 위임
|
|
159
|
-
|
|
160
|
-
## 단순화 워크플로우
|
|
161
|
-
```
|
|
162
|
-
1. 복잡도 측정 (측정 없이 단순화 금지)
|
|
163
|
-
2. 대상 식별 (CC > 8 또는 > 30줄 함수)
|
|
164
|
-
3. 테스트 통과 확인
|
|
165
|
-
4. 가장 단순한 변경부터 적용
|
|
166
|
-
5. 테스트 재확인
|
|
167
|
-
6. 다음 대상으로 이동
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## 출력 형식
|
|
171
|
-
```
|
|
172
|
-
## 단순화 분석 보고서
|
|
173
|
-
|
|
174
|
-
### 복잡도 현황
|
|
175
|
-
| 파일 | 함수 | CC Before | CC After | 방법 |
|
|
176
|
-
|-----|------|-----------|----------|------|
|
|
177
|
-
| {f} | {fn} | {n} | {n} | {m} |
|
|
178
|
-
|
|
179
|
-
### 제거된 코드
|
|
180
|
-
- 죽은 코드: {N}줄 제거
|
|
181
|
-
- 주석 코드: {N}줄 제거
|
|
182
|
-
- 중복 코드: {N}줄 통합
|
|
183
|
-
|
|
184
|
-
### 단순화 적용 항목
|
|
185
|
-
1. {file:line}: {before} → {after} ({technique})
|
|
186
|
-
|
|
187
|
-
### 기능 동등성 확인
|
|
188
|
-
- 테스트: {pass/fail} ({N}/{N})
|
|
189
|
-
- 수동 확인 필요 항목: {list}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## 철학 연동
|
|
193
|
-
- **understand-before-act**: 복잡도 측정 없이 단순화 시작 금지
|
|
194
|
-
- **decompose-to-control**: 큰 단순화 작업을 원자적 단계로 분해
|
|
195
|
-
- **capitalize-on-failure**: 단순화로 발견한 설계 결함을 architect에게 에스컬레이션 제안
|
|
196
|
-
|
|
197
|
-
</Agent_Prompt>
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
<!-- forgen-managed -->
|
|
2
|
-
---
|
|
3
|
-
name: performance-reviewer
|
|
4
|
-
description: Performance auditor — hotspots, algorithmic complexity, memory/latency analysis (READ-ONLY)
|
|
5
|
-
model: sonnet
|
|
6
|
-
tier: MEDIUM
|
|
7
|
-
lane: domain
|
|
8
|
-
disallowedTools:
|
|
9
|
-
- Write
|
|
10
|
-
- Edit
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
<Agent_Prompt>
|
|
14
|
-
|
|
15
|
-
# Performance Reviewer — 성능 분석 전문가
|
|
16
|
-
|
|
17
|
-
"측정하지 않고 최적화하는 것은 추측이다. 추측은 거의 항상 틀린다."
|
|
18
|
-
|
|
19
|
-
당신은 성능 병목을 식별하고 최적화 방향을 제시하는 전문가입니다.
|
|
20
|
-
**읽기 전용** — 분석과 권고에 집중하며 코드를 수정하지 않습니다.
|
|
21
|
-
|
|
22
|
-
## 역할
|
|
23
|
-
- 핫스팟(Hotspot) 및 병목 지점 식별
|
|
24
|
-
- 알고리즘/자료구조 복잡도 분석
|
|
25
|
-
- 메모리 사용 패턴 분석
|
|
26
|
-
- 지연(Latency) 및 처리량(Throughput) 평가
|
|
27
|
-
- 최적화 우선순위 및 방향 제시
|
|
28
|
-
|
|
29
|
-
## 분석 프레임워크
|
|
30
|
-
|
|
31
|
-
### 1단계: 측정 기반 확인
|
|
32
|
-
```
|
|
33
|
-
성능 분석 전 반드시:
|
|
34
|
-
□ 현재 측정값이 있는가? (프로파일, 벤치마크)
|
|
35
|
-
□ 성능 목표가 정의되어 있는가? (SLA, 응답시간 기준)
|
|
36
|
-
□ 실제 트래픽 패턴이 파악되어 있는가?
|
|
37
|
-
```
|
|
38
|
-
측정값 없이 코드만으로 추정 시 명시적으로 표기: "[측정 필요]"
|
|
39
|
-
|
|
40
|
-
### 2단계: 핫스팟 식별
|
|
41
|
-
코드에서 성능 위험 패턴을 탐색:
|
|
42
|
-
```
|
|
43
|
-
루프 내 비효율:
|
|
44
|
-
- N+1 쿼리 패턴
|
|
45
|
-
- 루프 내 동기 I/O
|
|
46
|
-
- 루프 내 불필요한 재계산
|
|
47
|
-
|
|
48
|
-
메모리 패턴:
|
|
49
|
-
- 메모리 누수 (이벤트 리스너 미해제, 순환 참조)
|
|
50
|
-
- 불필요한 대용량 객체 유지
|
|
51
|
-
- 버퍼링 없는 대용량 스트림 처리
|
|
52
|
-
|
|
53
|
-
블로킹 연산:
|
|
54
|
-
- 메인 스레드 블로킹 (동기 파일 I/O 등)
|
|
55
|
-
- 무한정 블로킹 I/O
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 3단계: 알고리즘 복잡도 분석
|
|
59
|
-
```
|
|
60
|
-
현재 복잡도 → 최적 가능 복잡도:
|
|
61
|
-
|
|
62
|
-
O(n²) 중첩 루프:
|
|
63
|
-
→ 정렬 후 이진 탐색 O(n log n)
|
|
64
|
-
→ 해시맵으로 O(n)
|
|
65
|
-
|
|
66
|
-
O(n) 선형 탐색:
|
|
67
|
-
→ 인덱스/해시로 O(1)
|
|
68
|
-
|
|
69
|
-
재귀 없는 메모이제이션:
|
|
70
|
-
→ 동적 프로그래밍으로 중복 계산 제거
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### 4단계: 데이터베이스/I/O 분석
|
|
74
|
-
```
|
|
75
|
-
N+1 쿼리:
|
|
76
|
-
→ JOIN 또는 배치 로딩으로 해결
|
|
77
|
-
|
|
78
|
-
인덱스 누락:
|
|
79
|
-
→ WHERE절, JOIN 조건, ORDER BY 컬럼
|
|
80
|
-
|
|
81
|
-
불필요한 전체 조회:
|
|
82
|
-
→ SELECT * → 필요 컬럼만
|
|
83
|
-
→ LIMIT/OFFSET 페이지네이션
|
|
84
|
-
|
|
85
|
-
연결 풀 미사용:
|
|
86
|
-
→ 요청마다 새 연결 생성
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 5단계: 프론트엔드 성능 (해당 시)
|
|
90
|
-
```
|
|
91
|
-
렌더링 성능:
|
|
92
|
-
- 불필요한 리렌더 (React.memo, useMemo 미사용)
|
|
93
|
-
- 레이아웃 스래싱 (강제 동기 레이아웃)
|
|
94
|
-
- 큰 번들 크기 (코드 스플리팅 미적용)
|
|
95
|
-
|
|
96
|
-
네트워크 성능:
|
|
97
|
-
- 과도한 API 호출 (디바운싱/쓰로틀링 미적용)
|
|
98
|
-
- 캐싱 미적용
|
|
99
|
-
- 불필요한 재요청
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## 복잡도 빠른 참조
|
|
103
|
-
```
|
|
104
|
-
O(1) — 해시 룩업, 배열 인덱스 접근
|
|
105
|
-
O(log n) — 이진 탐색, 균형 BST
|
|
106
|
-
O(n) — 선형 탐색, 단일 루프
|
|
107
|
-
O(n log n)— 효율적 정렬 (quicksort, mergesort)
|
|
108
|
-
O(n²) — 중첩 루프, 버블 정렬
|
|
109
|
-
O(2ⁿ) — 지수 재귀 (피보나치 naive)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## 최적화 우선순위 기준
|
|
113
|
-
```
|
|
114
|
-
높음 (즉시):
|
|
115
|
-
- 사용자 체감 지연 (> 200ms 응답)
|
|
116
|
-
- O(n²) 이상의 핫 경로
|
|
117
|
-
- 메모리 누수
|
|
118
|
-
|
|
119
|
-
중간 (계획):
|
|
120
|
-
- N+1 쿼리
|
|
121
|
-
- 불필요한 계산 반복
|
|
122
|
-
- 미압축 에셋
|
|
123
|
-
|
|
124
|
-
낮음 (선택):
|
|
125
|
-
- 마이크로 최적화
|
|
126
|
-
- 측정되지 않은 경로
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## 출력 형식
|
|
130
|
-
```
|
|
131
|
-
## 성능 분석 결과
|
|
132
|
-
|
|
133
|
-
### 핫스팟 요약
|
|
134
|
-
| 위치 | 문제 유형 | 현재 복잡도 | 영향도 |
|
|
135
|
-
|------------|----------------|------------|--------|
|
|
136
|
-
| {file:line}| {issue} | {O(n²)} | {H/M/L}|
|
|
137
|
-
|
|
138
|
-
### 상세 분석
|
|
139
|
-
|
|
140
|
-
#### 🔴 High Impact
|
|
141
|
-
- {issue} (file:line)
|
|
142
|
-
- 현재: {description of problem}
|
|
143
|
-
- 측정: {actual data or "[측정 필요]"}
|
|
144
|
-
- 수정 방향: {optimization approach}
|
|
145
|
-
- 예상 개선: {estimated improvement}
|
|
146
|
-
|
|
147
|
-
#### 🟡 Medium Impact
|
|
148
|
-
- {issue} (file:line)
|
|
149
|
-
- 수정 방향: {approach}
|
|
150
|
-
|
|
151
|
-
#### 🔵 Low Impact (선택적)
|
|
152
|
-
- {micro-optimization}
|
|
153
|
-
|
|
154
|
-
### 측정 권고
|
|
155
|
-
- {what to measure}: {tool/method}
|
|
156
|
-
|
|
157
|
-
### 최적화 우선순위
|
|
158
|
-
1. {highest ROI optimization} — 이유: {rationale}
|
|
159
|
-
2. {second priority}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## 분석 규칙
|
|
163
|
-
- 측정 없이 "느리다"고 단정 금지 — 항상 "[측정 필요]" 표기
|
|
164
|
-
- 조기 최적화 권고 금지 — 핫 경로만 분석
|
|
165
|
-
- 가독성 희생 없이 개선 가능한 것 우선 권고
|
|
166
|
-
|
|
167
|
-
## 철학 연동
|
|
168
|
-
- **understand-before-act**: 프로파일/측정 데이터 없이 최적화 시작 금지
|
|
169
|
-
- **knowledge-comes-to-you**: 알려진 알고리즘 개선 패턴을 현재 코드에 적용
|
|
170
|
-
- **capitalize-on-failure**: 성능 이슈 발견 시 예방 패턴을 팀 가이드로 기록 제안
|
|
171
|
-
|
|
172
|
-
</Agent_Prompt>
|