@wooojin/forgen 0.1.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-plugin/plugin.json +20 -0
- package/CHANGELOG.md +353 -0
- package/CONTRIBUTING.md +98 -0
- package/LICENSE +21 -0
- package/README.ja.md +469 -0
- package/README.ko.md +469 -0
- package/README.md +483 -0
- package/README.zh.md +469 -0
- package/agents/analyst.md +98 -0
- package/agents/architect.md +62 -0
- package/agents/code-reviewer.md +120 -0
- package/agents/code-simplifier.md +197 -0
- package/agents/critic.md +70 -0
- package/agents/debugger.md +117 -0
- package/agents/designer.md +131 -0
- package/agents/executor.md +54 -0
- package/agents/explore.md +145 -0
- package/agents/git-master.md +212 -0
- package/agents/performance-reviewer.md +172 -0
- package/agents/planner.md +29 -0
- package/agents/qa-tester.md +158 -0
- package/agents/refactoring-expert.md +168 -0
- package/agents/scientist.md +144 -0
- package/agents/security-reviewer.md +137 -0
- package/agents/test-engineer.md +153 -0
- package/agents/verifier.md +133 -0
- package/agents/writer.md +184 -0
- package/commands/api-design.md +268 -0
- package/commands/architecture-decision.md +314 -0
- package/commands/ci-cd.md +270 -0
- package/commands/code-review.md +233 -0
- package/commands/compound.md +117 -0
- package/commands/database.md +263 -0
- package/commands/debug-detective.md +99 -0
- package/commands/docker.md +274 -0
- package/commands/documentation.md +276 -0
- package/commands/ecomode.md +51 -0
- package/commands/frontend.md +271 -0
- package/commands/git-master.md +90 -0
- package/commands/incident-response.md +292 -0
- package/commands/migrate.md +101 -0
- package/commands/performance.md +288 -0
- package/commands/refactor.md +105 -0
- package/commands/security-review.md +288 -0
- package/commands/tdd.md +183 -0
- package/commands/testing-strategy.md +265 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +295 -0
- package/dist/core/auto-compound-runner.d.ts +12 -0
- package/dist/core/auto-compound-runner.js +460 -0
- package/dist/core/config-hooks.d.ts +10 -0
- package/dist/core/config-hooks.js +112 -0
- package/dist/core/config-injector.d.ts +50 -0
- package/dist/core/config-injector.js +455 -0
- package/dist/core/doctor.d.ts +1 -0
- package/dist/core/doctor.js +163 -0
- package/dist/core/errors.d.ts +81 -0
- package/dist/core/errors.js +133 -0
- package/dist/core/global-config.d.ts +43 -0
- package/dist/core/global-config.js +25 -0
- package/dist/core/harness.d.ts +24 -0
- package/dist/core/harness.js +621 -0
- package/dist/core/init.d.ts +7 -0
- package/dist/core/init.js +37 -0
- package/dist/core/inspect-cli.d.ts +7 -0
- package/dist/core/inspect-cli.js +47 -0
- package/dist/core/legacy-detector.d.ts +33 -0
- package/dist/core/legacy-detector.js +66 -0
- package/dist/core/logger.d.ts +34 -0
- package/dist/core/logger.js +121 -0
- package/dist/core/mcp-config.d.ts +44 -0
- package/dist/core/mcp-config.js +177 -0
- package/dist/core/notepad.d.ts +31 -0
- package/dist/core/notepad.js +88 -0
- package/dist/core/paths.d.ts +85 -0
- package/dist/core/paths.js +101 -0
- package/dist/core/plugin-detector.d.ts +44 -0
- package/dist/core/plugin-detector.js +226 -0
- package/dist/core/runtime-detector.d.ts +8 -0
- package/dist/core/runtime-detector.js +49 -0
- package/dist/core/scope-resolver.d.ts +8 -0
- package/dist/core/scope-resolver.js +45 -0
- package/dist/core/session-logger.d.ts +6 -0
- package/dist/core/session-logger.js +111 -0
- package/dist/core/session-store.d.ts +28 -0
- package/dist/core/session-store.js +218 -0
- package/dist/core/settings-lock.d.ts +18 -0
- package/dist/core/settings-lock.js +125 -0
- package/dist/core/spawn.d.ts +3 -0
- package/dist/core/spawn.js +135 -0
- package/dist/core/types.d.ts +108 -0
- package/dist/core/types.js +1 -0
- package/dist/core/uninstall.d.ts +4 -0
- package/dist/core/uninstall.js +307 -0
- package/dist/core/v1-bootstrap.d.ts +26 -0
- package/dist/core/v1-bootstrap.js +155 -0
- package/dist/engine/compound-cli.d.ts +24 -0
- package/dist/engine/compound-cli.js +250 -0
- package/dist/engine/compound-extractor.d.ts +68 -0
- package/dist/engine/compound-extractor.js +860 -0
- package/dist/engine/compound-lifecycle.d.ts +32 -0
- package/dist/engine/compound-lifecycle.js +305 -0
- package/dist/engine/compound-loop.d.ts +32 -0
- package/dist/engine/compound-loop.js +511 -0
- package/dist/engine/match-eval-log.d.ts +139 -0
- package/dist/engine/match-eval-log.js +270 -0
- package/dist/engine/phrase-blocklist.d.ts +119 -0
- package/dist/engine/phrase-blocklist.js +208 -0
- package/dist/engine/skill-promoter.d.ts +20 -0
- package/dist/engine/skill-promoter.js +115 -0
- package/dist/engine/solution-format.d.ts +160 -0
- package/dist/engine/solution-format.js +432 -0
- package/dist/engine/solution-index.d.ts +13 -0
- package/dist/engine/solution-index.js +252 -0
- package/dist/engine/solution-matcher.d.ts +364 -0
- package/dist/engine/solution-matcher.js +656 -0
- package/dist/engine/solution-writer.d.ts +76 -0
- package/dist/engine/solution-writer.js +157 -0
- package/dist/engine/term-matcher.d.ts +81 -0
- package/dist/engine/term-matcher.js +268 -0
- package/dist/engine/term-normalizer.d.ts +116 -0
- package/dist/engine/term-normalizer.js +171 -0
- package/dist/fgx.d.ts +6 -0
- package/dist/fgx.js +42 -0
- package/dist/forge/cli.d.ts +11 -0
- package/dist/forge/cli.js +100 -0
- package/dist/forge/evidence-processor.d.ts +21 -0
- package/dist/forge/evidence-processor.js +87 -0
- package/dist/forge/mismatch-detector.d.ts +44 -0
- package/dist/forge/mismatch-detector.js +83 -0
- package/dist/forge/onboarding-cli.d.ts +6 -0
- package/dist/forge/onboarding-cli.js +89 -0
- package/dist/forge/onboarding.d.ts +25 -0
- package/dist/forge/onboarding.js +122 -0
- package/dist/hooks/compound-reflection.d.ts +45 -0
- package/dist/hooks/compound-reflection.js +82 -0
- package/dist/hooks/context-guard.d.ts +24 -0
- package/dist/hooks/context-guard.js +156 -0
- package/dist/hooks/dangerous-patterns.json +18 -0
- package/dist/hooks/db-guard.d.ts +17 -0
- package/dist/hooks/db-guard.js +105 -0
- package/dist/hooks/hook-config.d.ts +29 -0
- package/dist/hooks/hook-config.js +92 -0
- package/dist/hooks/hook-registry.d.ts +43 -0
- package/dist/hooks/hook-registry.js +31 -0
- package/dist/hooks/hooks-generator.d.ts +49 -0
- package/dist/hooks/hooks-generator.js +99 -0
- package/dist/hooks/intent-classifier.d.ts +12 -0
- package/dist/hooks/intent-classifier.js +62 -0
- package/dist/hooks/keyword-detector.d.ts +25 -0
- package/dist/hooks/keyword-detector.js +389 -0
- package/dist/hooks/notepad-injector.d.ts +18 -0
- package/dist/hooks/notepad-injector.js +51 -0
- package/dist/hooks/permission-handler.d.ts +14 -0
- package/dist/hooks/permission-handler.js +114 -0
- package/dist/hooks/post-tool-failure.d.ts +11 -0
- package/dist/hooks/post-tool-failure.js +118 -0
- package/dist/hooks/post-tool-handlers.d.ts +17 -0
- package/dist/hooks/post-tool-handlers.js +115 -0
- package/dist/hooks/post-tool-use.d.ts +29 -0
- package/dist/hooks/post-tool-use.js +151 -0
- package/dist/hooks/pre-compact.d.ts +10 -0
- package/dist/hooks/pre-compact.js +165 -0
- package/dist/hooks/pre-tool-use.d.ts +31 -0
- package/dist/hooks/pre-tool-use.js +325 -0
- package/dist/hooks/prompt-injection-filter.d.ts +56 -0
- package/dist/hooks/prompt-injection-filter.js +287 -0
- package/dist/hooks/rate-limiter.d.ts +21 -0
- package/dist/hooks/rate-limiter.js +86 -0
- package/dist/hooks/secret-filter.d.ts +14 -0
- package/dist/hooks/secret-filter.js +65 -0
- package/dist/hooks/session-recovery.d.ts +27 -0
- package/dist/hooks/session-recovery.js +406 -0
- package/dist/hooks/shared/atomic-write.d.ts +41 -0
- package/dist/hooks/shared/atomic-write.js +148 -0
- package/dist/hooks/shared/context-budget.d.ts +37 -0
- package/dist/hooks/shared/context-budget.js +45 -0
- package/dist/hooks/shared/file-lock.d.ts +56 -0
- package/dist/hooks/shared/file-lock.js +253 -0
- package/dist/hooks/shared/hook-response.d.ts +33 -0
- package/dist/hooks/shared/hook-response.js +62 -0
- package/dist/hooks/shared/injection-caps.d.ts +39 -0
- package/dist/hooks/shared/injection-caps.js +52 -0
- package/dist/hooks/shared/plugin-signal.d.ts +23 -0
- package/dist/hooks/shared/plugin-signal.js +104 -0
- package/dist/hooks/shared/read-stdin.d.ts +8 -0
- package/dist/hooks/shared/read-stdin.js +63 -0
- package/dist/hooks/shared/sanitize-id.d.ts +7 -0
- package/dist/hooks/shared/sanitize-id.js +9 -0
- package/dist/hooks/shared/sanitize.d.ts +7 -0
- package/dist/hooks/shared/sanitize.js +22 -0
- package/dist/hooks/skill-injector.d.ts +38 -0
- package/dist/hooks/skill-injector.js +285 -0
- package/dist/hooks/slop-detector.d.ts +18 -0
- package/dist/hooks/slop-detector.js +93 -0
- package/dist/hooks/solution-injector.d.ts +58 -0
- package/dist/hooks/solution-injector.js +436 -0
- package/dist/hooks/subagent-tracker.d.ts +10 -0
- package/dist/hooks/subagent-tracker.js +90 -0
- package/dist/i18n/index.d.ts +43 -0
- package/dist/i18n/index.js +224 -0
- package/dist/lib.d.ts +14 -0
- package/dist/lib.js +14 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +40 -0
- package/dist/mcp/solution-reader.d.ts +90 -0
- package/dist/mcp/solution-reader.js +273 -0
- package/dist/mcp/tools.d.ts +16 -0
- package/dist/mcp/tools.js +302 -0
- package/dist/preset/facet-catalog.d.ts +17 -0
- package/dist/preset/facet-catalog.js +46 -0
- package/dist/preset/preset-manager.d.ts +31 -0
- package/dist/preset/preset-manager.js +111 -0
- package/dist/renderer/inspect-renderer.d.ts +11 -0
- package/dist/renderer/inspect-renderer.js +123 -0
- package/dist/renderer/rule-renderer.d.ts +18 -0
- package/dist/renderer/rule-renderer.js +159 -0
- package/dist/store/evidence-store.d.ts +23 -0
- package/dist/store/evidence-store.js +58 -0
- package/dist/store/profile-store.d.ts +12 -0
- package/dist/store/profile-store.js +53 -0
- package/dist/store/recommendation-store.d.ts +22 -0
- package/dist/store/recommendation-store.js +64 -0
- package/dist/store/rule-store.d.ts +22 -0
- package/dist/store/rule-store.js +62 -0
- package/dist/store/session-state-store.d.ts +11 -0
- package/dist/store/session-state-store.js +44 -0
- package/dist/store/types.d.ts +159 -0
- package/dist/store/types.js +7 -0
- package/hooks/hook-registry.json +21 -0
- package/hooks/hooks.json +185 -0
- package/package.json +89 -0
- package/plugin.json +20 -0
- package/scripts/postinstall.js +826 -0
- package/skills/api-design/SKILL.md +262 -0
- package/skills/architecture-decision/SKILL.md +309 -0
- package/skills/ci-cd/SKILL.md +264 -0
- package/skills/code-review/SKILL.md +228 -0
- package/skills/compound/SKILL.md +101 -0
- package/skills/database/SKILL.md +257 -0
- package/skills/debug-detective/SKILL.md +95 -0
- package/skills/docker/SKILL.md +268 -0
- package/skills/documentation/SKILL.md +270 -0
- package/skills/ecomode/SKILL.md +46 -0
- package/skills/frontend/SKILL.md +265 -0
- package/skills/git-master/SKILL.md +86 -0
- package/skills/incident-response/SKILL.md +286 -0
- package/skills/migrate/SKILL.md +96 -0
- package/skills/performance/SKILL.md +282 -0
- package/skills/refactor/SKILL.md +100 -0
- package/skills/security-review/SKILL.md +282 -0
- package/skills/tdd/SKILL.md +178 -0
- package/skills/testing-strategy/SKILL.md +260 -0
- package/starter-pack/solutions/starter-api-error-responses.md +37 -0
- package/starter-pack/solutions/starter-async-patterns.md +40 -0
- package/starter-pack/solutions/starter-caching-strategy.md +40 -0
- package/starter-pack/solutions/starter-code-review-checklist.md +39 -0
- package/starter-pack/solutions/starter-debugging-systematic.md +40 -0
- package/starter-pack/solutions/starter-dependency-injection.md +40 -0
- package/starter-pack/solutions/starter-error-handling-patterns.md +38 -0
- package/starter-pack/solutions/starter-git-atomic-commits.md +36 -0
- package/starter-pack/solutions/starter-input-validation.md +40 -0
- package/starter-pack/solutions/starter-n-plus-one-queries.md +37 -0
- package/starter-pack/solutions/starter-refactor-safely.md +38 -0
- package/starter-pack/solutions/starter-secret-management.md +37 -0
- package/starter-pack/solutions/starter-separation-of-concerns.md +36 -0
- package/starter-pack/solutions/starter-tdd-red-green-refactor.md +40 -0
- package/starter-pack/solutions/starter-typescript-strict-types.md +39 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migrate
|
|
3
|
+
description: This skill should be used when the user asks to "migrate,마이그레이션,업그레이드,upgrade". Safe migration workflow for DB, API, and framework upgrades
|
|
4
|
+
triggers:
|
|
5
|
+
- "migrate"
|
|
6
|
+
- "마이그레이션"
|
|
7
|
+
- "업그레이드"
|
|
8
|
+
- "upgrade"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<Purpose>
|
|
12
|
+
데이터베이스 스키마 변경, API 버전 업그레이드, 프레임워크 마이그레이션을
|
|
13
|
+
안전하게 수행하는 5단계 워크플로우를 제공합니다.
|
|
14
|
+
각 단계에서 롤백 지점을 확보하여 위험을 최소화합니다.
|
|
15
|
+
</Purpose>
|
|
16
|
+
|
|
17
|
+
<Steps>
|
|
18
|
+
1. **분석 (Analyze)**
|
|
19
|
+
- 현재 상태 스냅샷: 의존성 트리, 스키마 버전, API 계약 문서화
|
|
20
|
+
- 변경 영향 범위 파악: `grep -r "import.*{패키지}" --include="*.ts"`
|
|
21
|
+
- Breaking Change 목록 작성 (CHANGELOG, 공식 마이그레이션 가이드 확인)
|
|
22
|
+
- 영향받는 파일/컴포넌트/테이블 전수 조사
|
|
23
|
+
|
|
24
|
+
2. **계획 (Plan)**
|
|
25
|
+
- 마이그레이션 단계를 원자적 작업으로 분해
|
|
26
|
+
- 각 단계별 성공 기준(Done Criteria) 정의
|
|
27
|
+
- 롤백 트리거 조건 명시 (에러율 > N%, 레이턴시 > Nms)
|
|
28
|
+
- 다운타임 허용 여부 결정 → Zero-downtime 전략 수립
|
|
29
|
+
|
|
30
|
+
3. **백업 (Backup)**
|
|
31
|
+
```bash
|
|
32
|
+
# DB 백업
|
|
33
|
+
pg_dump -h localhost -U user dbname > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
34
|
+
mysqldump -u user -p dbname > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
35
|
+
|
|
36
|
+
# 코드 상태 태깅
|
|
37
|
+
git tag pre-migration-$(date +%Y%m%d) -m "Migration 전 백업 포인트"
|
|
38
|
+
git push origin --tags
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
4. **실행 (Execute)**
|
|
42
|
+
- **DB 마이그레이션**: 스키마 변경 → 데이터 변환 → 인덱스 재구성
|
|
43
|
+
```sql
|
|
44
|
+
-- Expand-Contract 패턴 (Zero-downtime)
|
|
45
|
+
-- Phase 1: 새 컬럼 추가 (nullable)
|
|
46
|
+
ALTER TABLE users ADD COLUMN new_field VARCHAR(255);
|
|
47
|
+
-- Phase 2: 데이터 채우기 (백그라운드)
|
|
48
|
+
UPDATE users SET new_field = legacy_field WHERE new_field IS NULL;
|
|
49
|
+
-- Phase 3: 애플리케이션 배포 후 기존 컬럼 제거
|
|
50
|
+
ALTER TABLE users DROP COLUMN legacy_field;
|
|
51
|
+
```
|
|
52
|
+
- **API 업그레이드**: 하위호환성 레이어 → 새 버전 배포 → 구버전 deprecation
|
|
53
|
+
- **프레임워크 업그레이드**:
|
|
54
|
+
```bash
|
|
55
|
+
npx npm-check-updates -u # 의존성 일괄 업데이트 확인
|
|
56
|
+
npx <framework> codemods # 공식 코드모드 실행
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
5. **검증 (Verify)**
|
|
60
|
+
- 마이그레이션 전후 데이터 무결성 검증
|
|
61
|
+
- E2E 테스트 전체 실행
|
|
62
|
+
- 성능 회귀 벤치마크 (p95 레이턴시 비교)
|
|
63
|
+
- 롤백 절차 실제 테스트 (스테이징 환경)
|
|
64
|
+
|
|
65
|
+
### 롤백 전략
|
|
66
|
+
```bash
|
|
67
|
+
# DB 롤백
|
|
68
|
+
psql -h localhost -U user dbname < backup_20240101_120000.sql
|
|
69
|
+
|
|
70
|
+
# 코드 롤백
|
|
71
|
+
git checkout pre-migration-20240101
|
|
72
|
+
git push --force-with-lease origin main # 팀 동의 후만
|
|
73
|
+
|
|
74
|
+
# 컨테이너/배포 롤백
|
|
75
|
+
kubectl rollout undo deployment/app-name
|
|
76
|
+
```
|
|
77
|
+
</Steps>
|
|
78
|
+
|
|
79
|
+
<Policy>
|
|
80
|
+
- 프로덕션 마이그레이션 전 스테이징에서 반드시 전체 절차 검증
|
|
81
|
+
- 대용량 테이블 마이그레이션은 배치 처리로 분할 (한 번에 MAX 10,000행)
|
|
82
|
+
- Breaking Change는 최소 한 버전 deprecation 기간 제공
|
|
83
|
+
- 마이그레이션 스크립트는 멱등성(idempotent) 보장
|
|
84
|
+
</Policy>
|
|
85
|
+
|
|
86
|
+
<Arguments>
|
|
87
|
+
## 사용법
|
|
88
|
+
`/forgen:migrate {마이그레이션 대상}`
|
|
89
|
+
|
|
90
|
+
### 예시
|
|
91
|
+
- `/forgen:migrate PostgreSQL users 테이블 스키마 변경 (email 컬럼 unique 추가)`
|
|
92
|
+
- `/forgen:migrate React 17 → 19 업그레이드`
|
|
93
|
+
- `/forgen:migrate REST API v1 → v2 마이그레이션 계획`
|
|
94
|
+
|
|
95
|
+
### 인자
|
|
96
|
+
- 마이그레이션 대상 (DB/API/프레임워크)
|
|
97
|
+
- 현재 버전과 목표 버전
|
|
98
|
+
- 다운타임 허용 여부 등 제약 조건
|
|
99
|
+
</Arguments>
|
|
100
|
+
|
|
101
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance
|
|
3
|
+
description: This skill should be used when the user asks to "performance,성능,profiling,최적화,프로파일링,bottleneck". Performance profiling, bottleneck identification, and optimization
|
|
4
|
+
triggers:
|
|
5
|
+
- "performance"
|
|
6
|
+
- "성능"
|
|
7
|
+
- "profiling"
|
|
8
|
+
- "최적화"
|
|
9
|
+
- "프로파일링"
|
|
10
|
+
- "bottleneck"
|
|
11
|
+
---
|
|
12
|
+
<!-- forgen-managed -->
|
|
13
|
+
|
|
14
|
+
<Purpose>
|
|
15
|
+
애플리케이션의 성능을 체계적으로 프로파일링하고 최적화합니다.
|
|
16
|
+
측정 기반 접근법으로 병목 지점을 식별하고, 최적화를 적용한 후
|
|
17
|
+
개선 효과를 정량적으로 검증합니다.
|
|
18
|
+
</Purpose>
|
|
19
|
+
|
|
20
|
+
<Steps>
|
|
21
|
+
1. **베이스라인 측정**: 현재 성능 지표를 수집합니다
|
|
22
|
+
- 응답 시간 측정 (P50, P95, P99)
|
|
23
|
+
- 처리량(throughput) 측정 (RPS, TPS)
|
|
24
|
+
- 메모리 사용량 프로파일링 (힙 크기, GC 빈도)
|
|
25
|
+
- CPU 사용률 측정 (사용자/시스템 시간)
|
|
26
|
+
- I/O 대기 시간 (디스크, 네트워크)
|
|
27
|
+
- 번들 크기 측정 (프론트엔드)
|
|
28
|
+
- Core Web Vitals 수집 (LCP, FID, CLS)
|
|
29
|
+
- 측정 환경 기록 (하드웨어, OS, 런타임 버전)
|
|
30
|
+
|
|
31
|
+
2. **병목 지점 식별**: 성능 저하의 근본 원인을 찾습니다
|
|
32
|
+
- CPU 프로파일링 (핫 함수 식별)
|
|
33
|
+
- 메모리 프로파일링 (힙 스냅샷, 리크 탐지)
|
|
34
|
+
- 네트워크 분석 (요청 waterfall, 느린 API 호출)
|
|
35
|
+
- 데이터베이스 쿼리 분석 (EXPLAIN, 슬로우 쿼리 로그)
|
|
36
|
+
- N+1 쿼리 패턴 탐지
|
|
37
|
+
- 불필요한 리렌더링 탐지 (React Profiler)
|
|
38
|
+
- 이벤트 루프 블로킹 탐지 (Node.js)
|
|
39
|
+
- 동기/비동기 혼용 문제 확인
|
|
40
|
+
|
|
41
|
+
3. **최적화 적용**: 식별된 병목을 해결합니다
|
|
42
|
+
- 알고리즘 최적화 (시간/공간 복잡도 개선)
|
|
43
|
+
- 캐싱 전략 적용 (인메모리, Redis, CDN)
|
|
44
|
+
- 쿼리 최적화 (인덱스 추가, 쿼리 리팩토링)
|
|
45
|
+
- 지연 로딩(lazy loading) 적용
|
|
46
|
+
- 코드 스플리팅 (동적 import)
|
|
47
|
+
- 이미지/에셋 최적화 (압축, WebP, CDN)
|
|
48
|
+
- 커넥션 풀링 최적화
|
|
49
|
+
- 비동기/병렬 처리 도입
|
|
50
|
+
- 메모이제이션 적용 (useMemo, React.memo)
|
|
51
|
+
- 불필요한 직렬화/역직렬화 제거
|
|
52
|
+
|
|
53
|
+
4. **검증**: 최적화 효과를 정량적으로 측정합니다
|
|
54
|
+
- 동일 조건에서 베이스라인 대비 비교
|
|
55
|
+
- 개선율 계산 (% 단위)
|
|
56
|
+
- 회귀 테스트 -- 기능 동작이 변경되지 않았는지 확인
|
|
57
|
+
- 부하 테스트 (k6, Artillery, autocannon)
|
|
58
|
+
- 메모리 리크 없음 확인 (장시간 실행)
|
|
59
|
+
- 엣지 케이스 성능 확인 (빈 데이터, 대용량 데이터)
|
|
60
|
+
|
|
61
|
+
5. **문서화**: 최적화 결과와 가이드를 기록합니다
|
|
62
|
+
- 이전/이후 성능 비교표
|
|
63
|
+
- 적용한 최적화 기법과 근거
|
|
64
|
+
- 향후 성능 모니터링 포인트
|
|
65
|
+
- 성능 예산(performance budget) 설정
|
|
66
|
+
- 회귀 방지를 위한 성능 테스트 추가
|
|
67
|
+
</Steps>
|
|
68
|
+
|
|
69
|
+
## 에이전트 위임
|
|
70
|
+
|
|
71
|
+
`performance-reviewer` 에이전트(Opus 모델)에 위임하여 성능 분석을 수행합니다:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Agent(
|
|
75
|
+
subagent_type="performance-reviewer",
|
|
76
|
+
model="opus",
|
|
77
|
+
prompt="PERFORMANCE ANALYSIS TASK
|
|
78
|
+
|
|
79
|
+
성능 프로파일링 및 최적화를 수행하세요.
|
|
80
|
+
|
|
81
|
+
Target: [분석 대상 코드/서비스]
|
|
82
|
+
Concern: [구체적인 성능 문제 또는 전반적 분석]
|
|
83
|
+
|
|
84
|
+
Analysis Checklist:
|
|
85
|
+
1. 베이스라인 측정 (응답 시간, 메모리, CPU)
|
|
86
|
+
2. 병목 지점 식별 (프로파일링)
|
|
87
|
+
3. 최적화 방안 제시 (우선순위별)
|
|
88
|
+
4. 최적화 적용 및 효과 검증
|
|
89
|
+
5. 성능 예산 및 모니터링 계획
|
|
90
|
+
|
|
91
|
+
Output: 성능 분석 리포트:
|
|
92
|
+
- 베이스라인 지표
|
|
93
|
+
- 병목 지점 목록 (영향도 순)
|
|
94
|
+
- 최적화 방안 및 예상 개선율
|
|
95
|
+
- 적용 결과 (이전/이후 비교)
|
|
96
|
+
- 권장 성능 예산"
|
|
97
|
+
)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## External Consultation (Optional)
|
|
101
|
+
|
|
102
|
+
performance-reviewer 에이전트는 교차 검증을 위해 Claude Task 에이전트에 자문할 수 있습니다.
|
|
103
|
+
|
|
104
|
+
### Protocol
|
|
105
|
+
1. **자체 성능 분석을 먼저 완료** -- 독립적으로 프로파일링 수행
|
|
106
|
+
2. **검증을 위한 자문** -- Claude Task 에이전트를 통해 최적화 전략 교차 확인
|
|
107
|
+
3. **비판적 평가** -- 외부 제안을 맹목적으로 수용하지 않음
|
|
108
|
+
4. **우아한 폴백** -- 위임이 불가능할 경우 절대 차단하지 않음
|
|
109
|
+
|
|
110
|
+
### 자문이 필요한 경우
|
|
111
|
+
- 복잡한 알고리즘 최적화 (시간/공간 트레이드오프)
|
|
112
|
+
- 데이터베이스 쿼리 튜닝 (복잡한 JOIN, 서브쿼리)
|
|
113
|
+
- 분산 시스템의 성능 문제
|
|
114
|
+
- 메모리 리크 진단
|
|
115
|
+
|
|
116
|
+
### 자문을 생략하는 경우
|
|
117
|
+
- 단순 캐싱 적용
|
|
118
|
+
- 명확한 N+1 쿼리 해결
|
|
119
|
+
- 번들 크기 최적화
|
|
120
|
+
- 이미지/에셋 최적화
|
|
121
|
+
|
|
122
|
+
## 성능 분석 체크리스트
|
|
123
|
+
|
|
124
|
+
### 서버 사이드 (5개)
|
|
125
|
+
- [ ] 슬로우 쿼리가 식별되고 최적화됨
|
|
126
|
+
- [ ] N+1 쿼리 패턴이 제거됨
|
|
127
|
+
- [ ] 적절한 캐싱이 적용됨
|
|
128
|
+
- [ ] 커넥션 풀 크기가 적절히 설정됨
|
|
129
|
+
- [ ] 비동기 처리가 활용됨 (I/O 바운드 작업)
|
|
130
|
+
|
|
131
|
+
### 클라이언트 사이드 (5개)
|
|
132
|
+
- [ ] Core Web Vitals가 "Good" 등급
|
|
133
|
+
- [ ] 번들 크기가 예산 이내
|
|
134
|
+
- [ ] 코드 스플리팅이 적용됨
|
|
135
|
+
- [ ] 불필요한 리렌더링이 제거됨
|
|
136
|
+
- [ ] 이미지가 최적화됨 (WebP, lazy load)
|
|
137
|
+
|
|
138
|
+
### 인프라 (4개)
|
|
139
|
+
- [ ] CDN이 적절히 활용됨
|
|
140
|
+
- [ ] 캐시 히트율이 측정됨
|
|
141
|
+
- [ ] 오토스케일링 임계값이 설정됨
|
|
142
|
+
- [ ] 리소스 사용량이 모니터링됨
|
|
143
|
+
|
|
144
|
+
### 검증 (4개)
|
|
145
|
+
- [ ] 베이스라인 대비 개선율이 측정됨
|
|
146
|
+
- [ ] 부하 테스트로 한계 확인됨
|
|
147
|
+
- [ ] 메모리 리크가 없음이 확인됨
|
|
148
|
+
- [ ] 기능 회귀가 없음이 확인됨
|
|
149
|
+
|
|
150
|
+
## 성능 등급 기준
|
|
151
|
+
|
|
152
|
+
| 등급 | 응답 시간 (P95) | 메모리 | 번들 크기 |
|
|
153
|
+
|------|-----------------|--------|-----------|
|
|
154
|
+
| **EXCELLENT** | < 100ms | 안정적, 리크 없음 | < 200KB (gzip) |
|
|
155
|
+
| **GOOD** | < 300ms | 안정적 | < 500KB (gzip) |
|
|
156
|
+
| **FAIR** | < 1000ms | 점진적 증가 | < 1MB (gzip) |
|
|
157
|
+
| **POOR** | > 1000ms | 리크 의심 | > 1MB (gzip) |
|
|
158
|
+
|
|
159
|
+
## 최적화 우선순위 가이드
|
|
160
|
+
|
|
161
|
+
| 우선순위 | 대상 | 예상 효과 |
|
|
162
|
+
|----------|------|-----------|
|
|
163
|
+
| 1 | 슬로우 쿼리/N+1 제거 | 10x~100x |
|
|
164
|
+
| 2 | 캐싱 도입 | 5x~50x |
|
|
165
|
+
| 3 | 알고리즘 최적화 | 2x~10x |
|
|
166
|
+
| 4 | 번들/에셋 최적화 | 20~50% 감소 |
|
|
167
|
+
| 5 | 불필요한 리렌더링 제거 | 체감 개선 |
|
|
168
|
+
|
|
169
|
+
<Output>
|
|
170
|
+
```
|
|
171
|
+
PERFORMANCE REPORT / 성능 분석 리포트
|
|
172
|
+
======================================
|
|
173
|
+
|
|
174
|
+
Target: [분석 대상]
|
|
175
|
+
Environment: [Node.js 20 / Chrome 120 / etc.]
|
|
176
|
+
Date: YYYY-MM-DDTHH:MM:SSZ
|
|
177
|
+
|
|
178
|
+
BASELINE / 베이스라인
|
|
179
|
+
----------------------
|
|
180
|
+
| Metric | Value | Grade |
|
|
181
|
+
|------------------|----------|-----------|
|
|
182
|
+
| Response (P50) | 120ms | GOOD |
|
|
183
|
+
| Response (P95) | 850ms | FAIR |
|
|
184
|
+
| Response (P99) | 2100ms | POOR |
|
|
185
|
+
| Memory (avg) | 256MB | GOOD |
|
|
186
|
+
| CPU (avg) | 45% | GOOD |
|
|
187
|
+
| Bundle (gzip) | 380KB | GOOD |
|
|
188
|
+
|
|
189
|
+
BOTTLENECKS / 병목 지점
|
|
190
|
+
-------------------------
|
|
191
|
+
1. [CRITICAL] src/api/orders.ts:45 - N+1 쿼리
|
|
192
|
+
Impact: P95 응답 시간의 60%를 차지
|
|
193
|
+
Evidence: 주문 1건당 상품 쿼리 N회 발생
|
|
194
|
+
Fix: JOIN 또는 DataLoader 패턴 적용
|
|
195
|
+
|
|
196
|
+
2. [HIGH] src/utils/transform.ts:120 - O(n^2) 알고리즘
|
|
197
|
+
Impact: 데이터 1000건 이상에서 급격한 성능 저하
|
|
198
|
+
Evidence: CPU 프로파일링에서 핫스팟
|
|
199
|
+
Fix: Map 기반 O(n) 알고리즘으로 변경
|
|
200
|
+
|
|
201
|
+
3. [MEDIUM] src/components/List.tsx - 불필요한 리렌더링
|
|
202
|
+
Impact: 스크롤 시 프레임 드롭
|
|
203
|
+
Evidence: React Profiler에서 불필요한 렌더 감지
|
|
204
|
+
Fix: React.memo + useMemo 적용
|
|
205
|
+
|
|
206
|
+
OPTIMIZATIONS APPLIED / 적용된 최적화
|
|
207
|
+
---------------------------------------
|
|
208
|
+
1. N+1 쿼리 제거: JOIN 적용
|
|
209
|
+
Before: 850ms (P95) → After: 120ms (P95)
|
|
210
|
+
Improvement: 86% 감소
|
|
211
|
+
|
|
212
|
+
2. 알고리즘 최적화: O(n^2) → O(n)
|
|
213
|
+
Before: 450ms (1000건) → After: 12ms (1000건)
|
|
214
|
+
Improvement: 97% 감소
|
|
215
|
+
|
|
216
|
+
AFTER / 최적화 후
|
|
217
|
+
-------------------
|
|
218
|
+
| Metric | Before | After | Change |
|
|
219
|
+
|------------------|----------|----------|----------|
|
|
220
|
+
| Response (P95) | 850ms | 150ms | -82% |
|
|
221
|
+
| Memory (avg) | 256MB | 230MB | -10% |
|
|
222
|
+
| Bundle (gzip) | 380KB | 310KB | -18% |
|
|
223
|
+
|
|
224
|
+
PERFORMANCE BUDGET / 성능 예산
|
|
225
|
+
-------------------------------
|
|
226
|
+
- API Response (P95): < 200ms
|
|
227
|
+
- Bundle Size (gzip): < 400KB
|
|
228
|
+
- LCP: < 2.5s
|
|
229
|
+
- FID: < 100ms
|
|
230
|
+
- CLS: < 0.1
|
|
231
|
+
|
|
232
|
+
GRADE: [EXCELLENT / GOOD / FAIR / POOR]
|
|
233
|
+
```
|
|
234
|
+
</Output>
|
|
235
|
+
|
|
236
|
+
<Policy>
|
|
237
|
+
- 추측 기반 최적화 금지 -- 반드시 측정 결과에 근거
|
|
238
|
+
- 최적화 전후 비교를 정량적으로 제시합니다
|
|
239
|
+
- 가독성/유지보수성을 해치는 미시 최적화는 지양합니다
|
|
240
|
+
- 성능 예산을 설정하여 회귀를 방지합니다
|
|
241
|
+
- 프로덕션 환경과 유사한 조건에서 측정합니다
|
|
242
|
+
- 최적화의 부작용(메모리 증가, 복잡도 증가)을 명시합니다
|
|
243
|
+
</Policy>
|
|
244
|
+
|
|
245
|
+
## 다른 스킬과의 연동
|
|
246
|
+
|
|
247
|
+
**데이터베이스 연동:**
|
|
248
|
+
```
|
|
249
|
+
/forgen:database 슬로우 쿼리 인덱싱
|
|
250
|
+
```
|
|
251
|
+
쿼리 성능 문제를 인덱스로 해결
|
|
252
|
+
|
|
253
|
+
**코드 리뷰 연동:**
|
|
254
|
+
```
|
|
255
|
+
/forgen:code-review 성능 최적화 코드
|
|
256
|
+
```
|
|
257
|
+
최적화 코드의 정확성 검증
|
|
258
|
+
|
|
259
|
+
**TDD 연동:**
|
|
260
|
+
```
|
|
261
|
+
/forgen:tdd 성능 회귀 테스트
|
|
262
|
+
```
|
|
263
|
+
성능 기준을 테스트로 보장
|
|
264
|
+
|
|
265
|
+
## Best Practices
|
|
266
|
+
|
|
267
|
+
- **측정 우선** -- "느린 것 같다"는 최적화 근거가 아님
|
|
268
|
+
- **큰 것부터** -- 10% 개선보다 10x 개선을 먼저 찾기
|
|
269
|
+
- **회귀 방지** -- 성능 테스트를 CI에 포함
|
|
270
|
+
- **예산 설정** -- 성능 예산을 팀과 합의
|
|
271
|
+
- **지속 모니터링** -- 프로덕션 성능을 실시간 추적
|
|
272
|
+
|
|
273
|
+
<Arguments>
|
|
274
|
+
## 사용법
|
|
275
|
+
`/forgen:performance {분석 대상}`
|
|
276
|
+
|
|
277
|
+
### 예시
|
|
278
|
+
- `/forgen:performance API 응답 시간 최적화`
|
|
279
|
+
- `/forgen:performance 프론트엔드 번들 크기 분석`
|
|
280
|
+
- `/forgen:performance src/services/order.ts 쿼리 성능`
|
|
281
|
+
- `/forgen:performance 메모리 리크 진단`
|
|
282
|
+
|
|
283
|
+
### 인자
|
|
284
|
+
- 분석할 대상, 성능 문제, 최적화 목표를 설명
|
|
285
|
+
- 인자 없으면 프로젝트 전반의 성능을 프로파일링
|
|
286
|
+
</Arguments>
|
|
287
|
+
|
|
288
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refactor
|
|
3
|
+
description: This skill should be used when the user asks to "refactor,리팩토링,리팩터,코드정리". Safe refactoring with test-first approach and SOLID principles
|
|
4
|
+
triggers:
|
|
5
|
+
- "refactor"
|
|
6
|
+
- "리팩토링"
|
|
7
|
+
- "리팩터"
|
|
8
|
+
- "코드정리"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<Purpose>
|
|
12
|
+
테스트 확보→변경→검증의 3단계를 통해 기능을 유지하면서 코드 구조를 개선합니다.
|
|
13
|
+
코드 스멜 식별, SOLID 원칙 적용, 리팩토링 카탈로그를 활용해 체계적으로 진행합니다.
|
|
14
|
+
</Purpose>
|
|
15
|
+
|
|
16
|
+
<Steps>
|
|
17
|
+
1. **테스트 확보 (Test First)**
|
|
18
|
+
- 리팩토링 전 기존 동작을 테스트로 고정
|
|
19
|
+
- 테스트 없는 코드: 특성화 테스트(Characterization Test) 먼저 작성
|
|
20
|
+
```typescript
|
|
21
|
+
// 현재 동작을 그대로 문서화하는 테스트
|
|
22
|
+
it('현재 동작 특성화', () => {
|
|
23
|
+
expect(legacyFunction(input)).toMatchSnapshot();
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
- 커버리지 확인: 변경할 코드 경로가 모두 테스트에 포함됐는지 검증
|
|
27
|
+
|
|
28
|
+
2. **코드 스멜 식별**
|
|
29
|
+
- **긴 함수**: 50줄 초과 → 추출(Extract) 대상
|
|
30
|
+
- **중복 코드**: DRY 원칙 위반 → 공통 추출
|
|
31
|
+
- **복잡한 조건**: 중첩 if/else 3단계 초과 → Early Return 또는 전략 패턴
|
|
32
|
+
- **긴 매개변수 목록**: 4개 초과 → 객체로 묶기
|
|
33
|
+
- **거대한 클래스**: 단일 책임 원칙 위반 → 분리
|
|
34
|
+
- **주석으로 설명이 필요한 코드**: 코드 자체를 명확하게 개선
|
|
35
|
+
|
|
36
|
+
3. **SOLID 원칙 적용**
|
|
37
|
+
- **S** (단일 책임): 클래스/함수는 하나의 이유로만 변경
|
|
38
|
+
- **O** (개방-폐쇄): 확장에 열려 있고 수정에 닫혀 있도록 설계
|
|
39
|
+
- **L** (리스코프 치환): 하위 타입은 상위 타입을 완전히 대체 가능
|
|
40
|
+
- **I** (인터페이스 분리): 사용하지 않는 메서드를 강요하지 않음
|
|
41
|
+
- **D** (의존성 역전): 구체 클래스가 아닌 추상화에 의존
|
|
42
|
+
|
|
43
|
+
4. **리팩토링 카탈로그 (Fowler)**
|
|
44
|
+
- **Extract Method**: 코드 블록을 독립적인 함수로 추출
|
|
45
|
+
```typescript
|
|
46
|
+
// Before
|
|
47
|
+
function processOrder(order) {
|
|
48
|
+
// 가격 계산 (20줄)
|
|
49
|
+
let total = 0;
|
|
50
|
+
for (const item of order.items) { total += item.price * item.qty; }
|
|
51
|
+
// ...
|
|
52
|
+
}
|
|
53
|
+
// After
|
|
54
|
+
function processOrder(order) {
|
|
55
|
+
const total = calculateTotal(order.items);
|
|
56
|
+
// ...
|
|
57
|
+
}
|
|
58
|
+
function calculateTotal(items) { /* ... */ }
|
|
59
|
+
```
|
|
60
|
+
- **Move Method**: 다른 클래스에서 더 많이 사용하는 메서드 이동
|
|
61
|
+
- **Replace Conditional with Polymorphism**: switch/if-else 체인 → 다형성
|
|
62
|
+
```typescript
|
|
63
|
+
// Before: if (type === 'A') ... else if (type === 'B') ...
|
|
64
|
+
// After: strategy[type].execute()
|
|
65
|
+
```
|
|
66
|
+
- **Introduce Parameter Object**: 매개변수 그룹 → 객체
|
|
67
|
+
- **Replace Magic Number with Constant**: 리터럴 → 명명된 상수
|
|
68
|
+
- **Inline Variable**: 불필요한 중간 변수 제거
|
|
69
|
+
|
|
70
|
+
5. **변경 (Refactor)**
|
|
71
|
+
- 한 번에 하나의 리팩토링만 적용
|
|
72
|
+
- 각 단계 후 테스트 실행 (`npm test` / `vitest run`)
|
|
73
|
+
- 작은 커밋으로 이력 추적: `refactor: Extract calculateTotal from processOrder`
|
|
74
|
+
- 동작 변경과 구조 변경을 같은 커밋에 섞지 않음
|
|
75
|
+
|
|
76
|
+
6. **검증 (Verify)**
|
|
77
|
+
- 전체 테스트 스위트 통과 확인
|
|
78
|
+
- 타입 검사: `tsc --noEmit`
|
|
79
|
+
- 린트: `eslint src/`
|
|
80
|
+
- 성능 회귀 없음 확인 (주요 경로 벤치마크)
|
|
81
|
+
</Steps>
|
|
82
|
+
|
|
83
|
+
<Policy>
|
|
84
|
+
- 리팩토링과 기능 추가를 동시에 하지 않는다
|
|
85
|
+
- 테스트 없이 리팩토링 시작 금지
|
|
86
|
+
- 각 단계 후 테스트 통과 확인 필수
|
|
87
|
+
- 한 세션에서 수정하는 파일은 최대 5개로 제한
|
|
88
|
+
</Policy>
|
|
89
|
+
|
|
90
|
+
<Arguments>
|
|
91
|
+
## 사용법
|
|
92
|
+
`/forgen:refactor {리팩토링 대상}`
|
|
93
|
+
|
|
94
|
+
### 예시
|
|
95
|
+
- `/forgen:refactor src/services/PaymentService.ts — 200줄 함수 분리`
|
|
96
|
+
- `/forgen:refactor 주문 처리 로직의 중복 코드 제거`
|
|
97
|
+
- `/forgen:refactor UserController를 SOLID 원칙에 맞게 재설계`
|
|
98
|
+
|
|
99
|
+
### 인자
|
|
100
|
+
- 리팩토링할 파일/함수/모듈 명시
|
|
101
|
+
- 목표 (성능, 가독성, 유지보수성, 특정 패턴 적용)
|
|
102
|
+
- 제약 조건 (하위 호환성 유지, 특정 인터페이스 유지 등)
|
|
103
|
+
</Arguments>
|
|
104
|
+
|
|
105
|
+
$ARGUMENTS
|