@kood/claude-code 0.6.6 → 0.7.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.
Files changed (170) hide show
  1. package/dist/index.js +7 -1
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/analyst.md +5 -0
  4. package/templates/.claude/agents/architect.md +5 -0
  5. package/templates/.claude/agents/build-fixer.md +1 -0
  6. package/templates/.claude/agents/code-reviewer.md +1 -0
  7. package/templates/.claude/agents/critic.md +4 -0
  8. package/templates/.claude/agents/deep-executor.md +1 -0
  9. package/templates/.claude/agents/dependency-manager.md +2 -0
  10. package/templates/.claude/agents/deployment-validator.md +2 -0
  11. package/templates/.claude/agents/designer.md +2 -0
  12. package/templates/.claude/agents/document-writer.md +3 -0
  13. package/templates/.claude/agents/explore.md +1 -0
  14. package/templates/.claude/agents/git-operator.md +2 -0
  15. package/templates/.claude/agents/implementation-executor.md +2 -0
  16. package/templates/.claude/agents/ko-to-en-translator.md +3 -0
  17. package/templates/.claude/agents/lint-fixer.md +2 -0
  18. package/templates/.claude/agents/planner.md +3 -0
  19. package/templates/.claude/agents/pm.md +349 -0
  20. package/templates/.claude/agents/qa-tester.md +1 -0
  21. package/templates/.claude/agents/refactor-advisor.md +4 -0
  22. package/templates/.claude/agents/researcher.md +9 -1
  23. package/templates/.claude/agents/scientist.md +1 -0
  24. package/templates/.claude/agents/security-reviewer.md +1 -0
  25. package/templates/.claude/agents/tdd-guide.md +1 -0
  26. package/templates/.claude/agents/vision.md +1 -0
  27. package/templates/.claude/instructions/agent-patterns/agent-teams-usage.md +376 -0
  28. package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
  29. package/templates/.claude/scripts/agent-teams/check-availability.sh +238 -0
  30. package/templates/.claude/scripts/agent-teams/setup-tmux.sh +125 -0
  31. package/templates/.claude/skills/agent-teams-setup/SKILL.md +460 -0
  32. package/templates/.claude/skills/brainstorm/SKILL.md +1 -0
  33. package/templates/.claude/skills/bug-fix/SKILL.md +1 -0
  34. package/templates/.claude/skills/crawler/SKILL.md +2 -0
  35. package/templates/.claude/skills/docs-creator/SKILL.md +1 -0
  36. package/templates/.claude/skills/docs-fetch/SKILL.md +6 -4
  37. package/templates/.claude/skills/docs-refactor/SKILL.md +1 -0
  38. package/templates/.claude/skills/elon-musk/SKILL.md +1 -0
  39. package/templates/.claude/skills/execute/SKILL.md +1 -0
  40. package/templates/.claude/skills/feedback/SKILL.md +1 -0
  41. package/templates/.claude/skills/figma-to-code/SKILL.md +1 -0
  42. package/templates/.claude/skills/genius-thinking/SKILL.md +1 -0
  43. package/templates/.claude/skills/global-uiux-design/SKILL.md +1 -0
  44. package/templates/.claude/skills/korea-uiux-design/SKILL.md +1 -0
  45. package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +1 -0
  46. package/templates/.claude/skills/plan/SKILL.md +1 -0
  47. package/templates/.claude/skills/prd/SKILL.md +1 -0
  48. package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
  49. package/templates/.claude/skills/project-optimizer/SKILL.md +375 -0
  50. package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
  51. package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
  52. package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
  53. package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
  54. package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
  55. package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
  56. package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
  57. package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
  58. package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
  59. package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
  60. package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
  61. package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
  62. package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
  63. package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
  64. package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
  65. package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
  66. package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
  67. package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
  68. package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
  69. package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
  70. package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
  71. package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
  72. package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
  73. package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
  74. package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
  75. package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
  76. package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
  77. package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
  78. package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
  79. package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
  80. package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
  81. package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
  82. package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
  83. package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
  84. package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
  85. package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
  86. package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
  87. package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
  88. package/templates/.claude/skills/ralph/SKILL.md +1 -0
  89. package/templates/.claude/skills/refactor/SKILL.md +1 -0
  90. package/templates/.claude/skills/research/SKILL.md +1 -0
  91. package/templates/.claude/skills/sql-optimizer/SKILL.md +438 -0
  92. package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
  93. package/templates/.claude/skills/startup-validator/SKILL.md +1 -0
  94. package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
  95. package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +94 -27
  96. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
  97. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
  98. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
  99. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
  100. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
  101. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
  102. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
  103. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
  104. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
  105. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
  106. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
  107. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
  108. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
  109. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
  110. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
  111. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
  112. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
  113. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
  114. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
  115. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
  116. package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
  117. package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +571 -0
  118. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
  119. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
  120. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
  121. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
  122. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
  123. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
  124. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
  125. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
  126. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
  127. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
  128. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
  129. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
  130. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
  131. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
  132. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
  133. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
  134. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
  135. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
  136. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
  137. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
  138. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
  139. package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
  140. package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
  141. package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
  142. package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
  143. package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
  144. package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
  145. package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
  146. package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
  147. package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
  148. package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
  149. package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
  150. package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
  151. package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
  152. package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
  153. package/templates/tanstack-start/docs/architecture.md +238 -167
  154. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
  155. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
  156. package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
  157. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
  158. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
  159. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
  160. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
  161. package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
  162. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
  163. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
  164. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
  165. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
  166. package/templates/tauri/CLAUDE.md +189 -0
  167. package/templates/tauri/docs/guides/distribution.md +261 -0
  168. package/templates/tauri/docs/guides/getting-started.md +302 -0
  169. package/templates/tauri/docs/guides/mobile.md +288 -0
  170. package/templates/tauri/docs/library/tauri/index.md +510 -0
@@ -0,0 +1,438 @@
1
+ ---
2
+ name: sql-optimizer
3
+ description: PostgreSQL SQL 쿼리 최적화. ORM/Raw SQL 안티패턴 감지, EXPLAIN ANALYZE 분석, 인덱스 제안, 쿼리 리라이팅.
4
+ user-invocable: true
5
+ metadata:
6
+ author: kood
7
+ version: "1.0.0"
8
+ ---
9
+
10
+ @../../instructions/workflow-patterns/sequential-thinking.md
11
+ @../../instructions/agent-patterns/parallel-execution.md
12
+ @../../instructions/agent-patterns/model-routing.md
13
+ @../../instructions/agent-patterns/agent-teams-usage.md
14
+ @../../instructions/validation/forbidden-patterns.md
15
+ @../../instructions/validation/required-behaviors.md
16
+
17
+ # SQL Optimizer Skill
18
+
19
+ > PostgreSQL 쿼리 최적화. ORM 코드 + Raw SQL 안티패턴 감지 → EXPLAIN 분석 → 최적화 제안 → 자동 수정.
20
+
21
+ ---
22
+
23
+ <purpose>
24
+
25
+ ORM(Prisma, Drizzle, TypeORM, Sequelize) 또는 Raw SQL 쿼리의 성능 문제 감지 및 최적화.
26
+
27
+ **입력:** SQL 쿼리, ORM 코드, 파일 경로, 또는 "프로젝트 전체 분석"
28
+ **출력:** 안티패턴 리포트 + 최적화된 쿼리/코드 + 인덱스 제안
29
+
30
+ **ORM별 수정 코드:** @./orm-patterns.md
31
+
32
+ </purpose>
33
+
34
+ ---
35
+
36
+ <trigger_conditions>
37
+
38
+ | 트리거 | 반응 |
39
+ |--------|------|
40
+ | `/sql-optimizer src/db/queries.ts` | 파일 내 SQL/ORM 코드 분석 |
41
+ | `/sql-optimizer SELECT * FROM users...` | 단일 쿼리 최적화 |
42
+ | `/sql-optimizer` (인자 없음) | 프로젝트 전체 DB 레이어 스캔 |
43
+ | "쿼리가 느려요" / "slow" | 슬로우 쿼리 분석 가이드 |
44
+ | "N+1 문제" / "인덱스 추천" | 특정 문제 집중 분석 |
45
+
46
+ </trigger_conditions>
47
+
48
+ ---
49
+
50
+ <argument_validation>
51
+
52
+ ```
53
+ $ARGUMENTS 없음 → 프로젝트 전체 DB 레이어 스캔:
54
+ "프로젝트에서 SQL/ORM 관련 파일을 탐색하여 최적화할 쿼리를 찾겠습니다."
55
+ → Phase 1 전체 스캔 실행
56
+
57
+ $ARGUMENTS = 파일 경로 → 해당 파일 분석
58
+ $ARGUMENTS = SQL 쿼리 → 단일 쿼리 분석
59
+ $ARGUMENTS = "slow" → pg_stat_statements 기반 분석 가이드
60
+ ```
61
+
62
+ </argument_validation>
63
+
64
+ ---
65
+
66
+ <detection_rules>
67
+
68
+ ## 안티패턴 감지 규칙
69
+
70
+ ### CRITICAL (즉시 수정)
71
+
72
+ | ID | 패턴 | 감지 방법 | 영향 |
73
+ |----|------|----------|------|
74
+ | C1 | **N+1 쿼리** | for 루프 내 ORM 관계 접근 | 쿼리 수 N배 증가 |
75
+ | C2 | **Cartesian Product** | JOIN 조건 없는 다중 테이블 | 행 수 폭발 |
76
+ | C3 | **무제한 SELECT** | LIMIT 없이 대량 테이블 조회 | 메모리 폭발 |
77
+ | C4 | **SELECT \*** | 불필요한 컬럼 전체 로드 | 네트워크/메모리 낭비 |
78
+
79
+ ### HIGH (성능 리스크)
80
+
81
+ | ID | 패턴 | 감지 방법 | 영향 |
82
+ |----|------|----------|------|
83
+ | H1 | **Seq Scan** | EXPLAIN에서 10만+ 행 Seq Scan | 풀 테이블 스캔 |
84
+ | H2 | **서브쿼리 in WHERE** | IN (SELECT ...) 패턴 | 반복 실행 |
85
+ | H3 | **과다 JOIN** | 5개+ 테이블 조인 | 플래너 부하 |
86
+ | H4 | **ORM include 남용** | Prisma include 3단계+ 중첩 | 메모리 폭발 |
87
+ | H5 | **Lazy Loading 루프** | TypeORM Promise 관계 루프 접근 | N+1 변형 |
88
+
89
+ ### MEDIUM (최적화 기회)
90
+
91
+ | ID | 패턴 | 감지 방법 | 영향 |
92
+ |----|------|----------|------|
93
+ | M1 | **DISTINCT 마스킹** | DISTINCT + JOIN | 잘못된 JOIN 은폐 |
94
+ | M2 | **서브쿼리 → CTE** | 중첩 서브쿼리 2단계+ | 가독성/성능 |
95
+ | M3 | **Window Function 미사용** | 집계 서브쿼리 | 불필요한 스캔 |
96
+ | M4 | **Partial Index 미적용** | 상수 WHERE 조건 반복 | 인덱스 크기 낭비 |
97
+ | M5 | **Covering Index 부재** | SELECT 컬럼 ≠ 인덱스 | 테이블 룩업 |
98
+ | M6 | **Prepared Statement 미사용** | Drizzle에서 .prepare() 없음 | 파싱 반복 |
99
+
100
+ ### LOW (베스트 프랙티스)
101
+
102
+ | ID | 패턴 | 감지 방법 | 영향 |
103
+ |----|------|----------|------|
104
+ | L1 | **ANALYZE 미실행** | 대량 INSERT/UPDATE 후 | 통계 부정확 |
105
+ | L2 | **Connection Pool 미설정** | Serverless + 매번 new Client | 연결 소모 |
106
+ | L3 | **Expression Index 부재** | WHERE LOWER(col) 등 | 인덱스 미사용 |
107
+
108
+ </detection_rules>
109
+
110
+ ---
111
+
112
+ <index_strategy>
113
+
114
+ ## 인덱스 추천 전략
115
+
116
+ ### 유형 선택
117
+
118
+ | 상황 | 인덱스 유형 | 예시 |
119
+ |------|-----------|------|
120
+ | WHERE = / ORDER BY | B-tree (기본) | `CREATE INDEX idx ON t(col)` |
121
+ | WHERE LOWER(col) | Expression | `CREATE INDEX idx ON t(LOWER(col))` |
122
+ | WHERE status = 'active' | Partial | `CREATE INDEX idx ON t(col) WHERE status = 'active'` |
123
+ | SELECT a,b WHERE a = ? | Covering | `CREATE INDEX idx ON t(a) INCLUDE (b)` |
124
+ | JSONB 필드 검색 | GIN | `CREATE INDEX idx ON t USING gin(data)` |
125
+ | 시계열 대량 (100만+) | BRIN | `CREATE INDEX idx ON t USING brin(created_at)` |
126
+
127
+ ### 복합 인덱스 컬럼 순서
128
+
129
+ ```sql
130
+ -- 규칙: 동등 조건 → 범위 조건 → 정렬
131
+ -- WHERE status = 'active' AND created_at > '2024-01-01' ORDER BY priority
132
+ CREATE INDEX idx_optimal ON tasks(status, created_at, priority);
133
+ ```
134
+
135
+ ### 인덱스 제안 전 필수 확인
136
+
137
+ ```sql
138
+ -- 1. 기존 인덱스 중복 확인 (새 인덱스가 기존과 겹치는지)
139
+ SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'target_table';
140
+
141
+ -- 2. 사용되지 않는 인덱스 찾기 (idx_scan = 0이면 삭제 후보)
142
+ SELECT indexname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid)) as size
143
+ FROM pg_stat_user_indexes WHERE tablename = 'target_table'
144
+ ORDER BY idx_scan ASC;
145
+ ```
146
+
147
+ </index_strategy>
148
+
149
+ ---
150
+
151
+ <explain_analysis>
152
+
153
+ ## EXPLAIN ANALYZE 분석 가이드
154
+
155
+ ### 실행 패턴
156
+
157
+ ```sql
158
+ -- 기본 분석 (FORMAT JSON → 프로그래밍 파싱 용이)
159
+ EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT ...;
160
+
161
+ -- 수정 쿼리 안전 분석 (롤백 필수)
162
+ BEGIN;
163
+ EXPLAIN (ANALYZE, BUFFERS) UPDATE/DELETE ...;
164
+ ROLLBACK;
165
+
166
+ -- 상세 분석 (SETTINGS: PG 12+)
167
+ EXPLAIN (ANALYZE, VERBOSE, BUFFERS, SETTINGS) SELECT ...;
168
+ ```
169
+
170
+ ### 문제 식별 기준 (정량적)
171
+
172
+ | 신호 | 임계값 | 조치 |
173
+ |------|--------|------|
174
+ | **Seq Scan** | 행 10만+ 테이블 | 인덱스 추가 |
175
+ | **예상 rows / 실제 rows** | 비율 10x+ 차이 | `ANALYZE table_name` |
176
+ | **Nested Loop** | 내부 루프 1만+ rows | Hash Join 유도 또는 인덱스 |
177
+ | **Sort** | Cost 1000+ | ORDER BY 컬럼에 인덱스 |
178
+ | **Buffers shared read** | 1만+ 블록 | 인덱스 또는 shared_buffers 증가 |
179
+ | **Filter: Rows Removed** | 제거율 90%+ | WHERE 조건 최적화 |
180
+
181
+ ### pg_stat_statements 슬로우 쿼리
182
+
183
+ ```sql
184
+ -- TOP 10 느린 쿼리 (avg_ms 기준)
185
+ SELECT left(query, 80) as query, calls,
186
+ (total_exec_time/calls)::numeric(10,2) as avg_ms, rows
187
+ FROM pg_stat_statements
188
+ WHERE calls > 10
189
+ ORDER BY total_exec_time DESC LIMIT 10;
190
+
191
+ -- 캐시 미스율 높은 쿼리
192
+ SELECT left(query, 80) as query, shared_blks_read,
193
+ (100.0 * shared_blks_read / NULLIF(shared_blks_hit + shared_blks_read, 0))::numeric(5,2) as miss_pct
194
+ FROM pg_stat_statements
195
+ WHERE shared_blks_hit + shared_blks_read > 0
196
+ ORDER BY miss_pct DESC LIMIT 10;
197
+ ```
198
+
199
+ </explain_analysis>
200
+
201
+ ---
202
+
203
+ <workflow>
204
+
205
+ ## 실행 흐름
206
+
207
+ | 단계 | 작업 | 도구 | 에이전트 |
208
+ |------|------|------|---------|
209
+ | **0** | ARGUMENT 파싱, 모드 결정 | - | - |
210
+ | **1** | DB 레이어 파일 탐색, ORM 종류+버전 감지 | Glob, Read | explore x2 (haiku) 병렬 |
211
+ | **2** | 복잡도 판단 | sequentialthinking (1단계) | - |
212
+ | **3** | detection_rules 기반 안티패턴 분석 | Read, Grep | architect + code-reviewer (sonnet) 병렬 |
213
+ | **4** | 최적화 방법 2-3개 선정 | sequentialthinking (2-5단계) | - |
214
+ | **5** | 옵션 제시 (장단점, 추천안) | - | - |
215
+ | **6** | 사용자 선택 후 코드 수정 | Edit | implementation-executor (sonnet) |
216
+ | **7** | typecheck + EXPLAIN 비교 검증 | Bash | - |
217
+
218
+ </workflow>
219
+
220
+ ---
221
+
222
+ <thinking_strategy>
223
+
224
+ ## Sequential Thinking 가이드
225
+
226
+ ### 복잡도별 전략
227
+
228
+ | 복잡도 | 사고 횟수 | 기준 |
229
+ |--------|----------|------|
230
+ | **간단** | 3 | 단일 쿼리, 명확한 안티패턴 1-2개 |
231
+ | **보통** | 5 | 2-5개 쿼리, ORM 패턴 혼합 |
232
+ | **복잡** | 7+ | 다중 파일, 인덱스+쿼리+ORM 복합 |
233
+
234
+ ### 보통 복잡도 (5단계)
235
+
236
+ ```
237
+ thought 1: "user.service.ts 분석 - Prisma v7, findMany 3개, for 루프 2개
238
+ → 보통 복잡도 (5개 쿼리, ORM 패턴)"
239
+
240
+ thought 2: "안티패턴 식별:
241
+ C1 - line 45: findMany + for 루프 = N+1 (100명 조회 시 101쿼리)
242
+ H4 - line 72: include 3단계 중첩 (user→posts→comments→author)
243
+ M6 - line 90: 동일 쿼리 반복인데 prepare 미사용"
244
+
245
+ thought 3: "수정 방법:
246
+ C1 → select + 관계 로딩 또는 findMany + in 배치
247
+ H4 → select + _count 또는 별도 쿼리 분리
248
+ M6 → prepare() 추가"
249
+
250
+ thought 4: "옵션 비교:
251
+ A) ORM만: select 변환 (즉시, DB 변경 없음, 쿼리 80% 감소)
252
+ B) ORM+인덱스: + Partial Index (마이그레이션 필요, 90% 감소)
253
+ C) Raw SQL: 완전 제어 (유지보수 비용 증가)"
254
+
255
+ thought 5: "추천: 옵션 B - ORM 최적화 + Partial Index
256
+ 근거: 단계적 적용 가능, ORM 먼저 → 인덱스 추가
257
+ 인덱스: CREATE INDEX idx_posts_author ON posts(author_id) WHERE published = true"
258
+ ```
259
+
260
+ </thinking_strategy>
261
+
262
+ ---
263
+
264
+ <parallel_agent_execution>
265
+
266
+ ## 병렬 에이전트 실행
267
+
268
+ ```typescript
269
+ // Phase 1: DB 레이어 탐색 (병렬)
270
+ Task(subagent_type="explore", model="haiku",
271
+ prompt="SQL/ORM 파일 탐색: prisma/, drizzle/, *.sql, migration, repository, service")
272
+
273
+ Task(subagent_type="explore", model="haiku",
274
+ prompt="ORM 설정 분석: schema.prisma (버전 확인), drizzle.config.ts, 관계/인덱스 정의, 연결 풀")
275
+
276
+ // Phase 3: 안티패턴 분석 (병렬)
277
+ Task(subagent_type="architect", model="sonnet",
278
+ prompt="쿼리 아키텍처 분석: N+1, JOIN 구조, 서브쿼리, 인덱스 전략 (기존 vs 필요)")
279
+
280
+ Task(subagent_type="code-reviewer", model="sonnet",
281
+ prompt="ORM 안티패턴 리뷰: include/select, 배치 처리, Connection Pool, ORM 버전별 API 차이")
282
+ ```
283
+
284
+ </parallel_agent_execution>
285
+
286
+ ---
287
+
288
+ <option_presentation>
289
+
290
+ ## 옵션 제시 형식
291
+
292
+ ```markdown
293
+ ## SQL 최적화 분석 결과
294
+
295
+ ### 감지된 문제
296
+
297
+ | 심각도 | ID | 문제 | 위치 | 영향 |
298
+ |--------|-----|------|------|------|
299
+ | CRITICAL | C1 | N+1 쿼리 | src/users.ts:45 | 쿼리 100→2 |
300
+ | HIGH | H1 | Seq Scan (50만 행) | users 테이블 | 풀 스캔 |
301
+
302
+ ---
303
+
304
+ ### 옵션 1: ORM 코드 최적화 (추천)
305
+
306
+ | 장점 | 단점 |
307
+ |------|------|
308
+ | 코드만 수정, DB 변경 없음 | ORM 제약 내 최적화 |
309
+
310
+ **예상 효과:** 쿼리 수 80% 감소
311
+ **수정 파일:** src/users.ts:45, src/posts.ts:23
312
+
313
+ ### 옵션 2: + 인덱스 추가
314
+
315
+ | 장점 | 단점 |
316
+ |------|------|
317
+ | 근본적 성능 개선 | DB 마이그레이션 필요 |
318
+
319
+ **예상 효과:** 쿼리 시간 90% 감소
320
+
321
+ ---
322
+
323
+ 추천: 옵션 [N]. [근거]
324
+ 어떤 옵션을 선택하시겠습니까? (1/2/3)
325
+ ```
326
+
327
+ </option_presentation>
328
+
329
+ ---
330
+
331
+ <validation>
332
+
333
+ ## 검증 체크리스트
334
+
335
+ ### Phase 0-1 (탐색)
336
+
337
+ ```text
338
+ ✅ ARGUMENT 확인 (없으면 프로젝트 전체 스캔)
339
+ ✅ ORM 종류 + 버전 감지 (package.json, schema 파일)
340
+ ✅ Task (explore) x2 병렬로 DB 레이어 탐색
341
+ ```
342
+
343
+ ### Phase 2-5 (분석 + 옵션)
344
+
345
+ ```text
346
+ ✅ Sequential Thinking 최소 3단계 (보통 5단계)
347
+ ✅ 안티패턴 CRITICAL → HIGH → MEDIUM → LOW 순서
348
+ ✅ 옵션 최소 2개, 권장 3개 + 장단점 + 예상 효과
349
+ ✅ 수정 파일 위치 (file:line 포함)
350
+ ✅ 인덱스 제안 시 기존 인덱스 중복 확인 + CREATE INDEX 문
351
+ ✅ ORM 수정 시 Before/After 코드 제공
352
+ ```
353
+
354
+ ### Phase 6-7 (수정 + 검증)
355
+
356
+ ```text
357
+ ✅ npx tsc --noEmit (typecheck 통과)
358
+ ✅ 기존 테스트 통과 (npm test)
359
+ ✅ 수정 전후 EXPLAIN ANALYZE 비교 권장
360
+ ✅ 인덱스 추가 시 마이그레이션 파일 생성
361
+ ```
362
+
363
+ ### 절대 금지
364
+
365
+ ```text
366
+ ❌ EXPLAIN 없이 "이게 더 빠를 것" 추측
367
+ ❌ 코드 탐색 없이 안티패턴 추측
368
+ ❌ 옵션 1개만 제시
369
+ ❌ 기존 인덱스 확인 없이 인덱스 제안 (중복 위험)
370
+ ❌ ORM 버전 미확인 (Prisma v5 select vs v7 omit)
371
+ ❌ 수정 후 typecheck 미실행
372
+ ❌ 100만+ 행 테이블에 무조건 B-tree (BRIN 고려)
373
+ ❌ Partial Index 추가 시 기존 전체 인덱스 중복 무시
374
+ ```
375
+
376
+ </validation>
377
+
378
+ ---
379
+
380
+ <examples>
381
+
382
+ ## 실전 예시
383
+
384
+ ### 예시 1: Prisma N+1 최적화
385
+
386
+ ```
387
+ 사용자: /sql-optimizer src/services/user.service.ts
388
+
389
+ Phase 0: 파일 경로 모드
390
+ Phase 1: ORM 감지 → Prisma v7 (package.json + schema.prisma)
391
+ Phase 2-4: Sequential Thinking (5단계)
392
+ thought 1: "Prisma v7, findMany 3개, for 루프 2개 - 보통 복잡도"
393
+ thought 2: "C1 line:45 N+1, H4 line:72 include 3단계"
394
+ thought 3: "select 변환, _count, 배치 로딩"
395
+ thought 4: "A) select만 vs B) +인덱스 vs C) Raw SQL"
396
+ thought 5: "옵션 B 추천 - 단계적 적용"
397
+
398
+ Phase 5: 옵션 제시 (3개)
399
+ Phase 6: 선택 후 Edit 수정
400
+ Phase 7: 검증
401
+ $ npx tsc --noEmit → ✅
402
+ $ npm test → ✅
403
+ EXPLAIN ANALYZE 비교 → 쿼리 시간 85% 감소
404
+ ```
405
+
406
+ ### 예시 2: 프로젝트 전체 스캔
407
+
408
+ ```
409
+ 사용자: /sql-optimizer
410
+
411
+ Phase 1 (병렬):
412
+ explore: "prisma/, *.sql, service 파일 탐색" → 12 파일 발견
413
+ explore: "schema.prisma, 인덱스 정의 분석" → 8 인덱스, 3 누락
414
+
415
+ Phase 3 (병렬):
416
+ architect: 쿼리 아키텍처 → C1 x2, H1 x1, H2 x1
417
+ code-reviewer: ORM 패턴 → H4 x1, M4 x2, M6 x3
418
+
419
+ 결과: CRITICAL 2 / HIGH 3 / MEDIUM 5
420
+ → 우선순위별 옵션 제시 → 선택 후 수정 + 검증
421
+ ```
422
+
423
+ ### 예시 3: 슬로우 쿼리
424
+
425
+ ```
426
+ 사용자: /sql-optimizer slow
427
+
428
+ 1. pg_stat_statements 분석 쿼리 제공 (복사 가능)
429
+ 2. 사용자가 결과 공유
430
+ 3. EXPLAIN ANALYZE 실행 가이드
431
+ 4. 결과 분석:
432
+ - Seq Scan on orders (50만 행, H1) → Partial Index
433
+ - Nested Loop 3만 rows (H3) → Hash Join 유도
434
+ 5. 인덱스 CREATE 문 + 쿼리 리라이팅 제안
435
+ 6. 마이그레이션 파일 생성
436
+ ```
437
+
438
+ </examples>
@@ -0,0 +1,218 @@
1
+ # ORM별 최적화 패턴
2
+
3
+ > SQL Optimizer 스킬에서 참조하는 ORM별 안티패턴 + 수정 코드
4
+
5
+ ---
6
+
7
+ ## Prisma (v5+, select/omit 지원)
8
+
9
+ ```typescript
10
+ // ❌ C1: N+1 - include 없이 루프 접근
11
+ const users = await prisma.user.findMany()
12
+ for (const user of users) {
13
+ const posts = await prisma.post.findMany({ where: { authorId: user.id } })
14
+ }
15
+
16
+ // ✅ 수정: select로 필요 필드만 (v5+)
17
+ const users = await prisma.user.findMany({
18
+ select: {
19
+ id: true,
20
+ name: true,
21
+ posts: {
22
+ select: { id: true, title: true },
23
+ take: 10,
24
+ orderBy: { createdAt: 'desc' }
25
+ }
26
+ }
27
+ })
28
+
29
+ // ❌ H4: include 깊은 중첩 (3단계+)
30
+ await prisma.user.findMany({
31
+ include: { posts: { include: { comments: { include: { author: true } } } } }
32
+ })
33
+
34
+ // ✅ 수정: select + 필요 깊이만 + _count
35
+ await prisma.user.findMany({
36
+ select: {
37
+ id: true,
38
+ posts: {
39
+ select: {
40
+ id: true,
41
+ title: true,
42
+ _count: { select: { comments: true } }
43
+ }
44
+ }
45
+ }
46
+ })
47
+
48
+ // ❌ C4: 배치 없이 대량 생성
49
+ for (const item of items) {
50
+ await prisma.item.create({ data: item })
51
+ }
52
+
53
+ // ✅ 수정: createMany 배치
54
+ await prisma.item.createMany({ data: items })
55
+
56
+ // ❌ L2: Serverless 환경 매번 new PrismaClient
57
+ export async function handler() {
58
+ const prisma = new PrismaClient() // 연결 풀 소모
59
+ return prisma.user.findMany()
60
+ }
61
+
62
+ // ✅ 수정: 전역 인스턴스 재사용
63
+ const prisma = new PrismaClient()
64
+ export async function handler() {
65
+ return prisma.user.findMany()
66
+ }
67
+ ```
68
+
69
+ ### Prisma 버전별 차이
70
+
71
+ | 기능 | v5 | v6 | v7 |
72
+ |------|-----|-----|-----|
73
+ | `select` | ✅ | ✅ | ✅ |
74
+ | `omit` | ✅ (Preview) | ✅ | ✅ |
75
+ | `relationLoadStrategy: 'join'` | ✅ (v5.9+) | ✅ | ✅ |
76
+ | Pure TS Client (Rust 제거) | ❌ | ❌ | ✅ |
77
+
78
+ ---
79
+
80
+ ## Drizzle
81
+
82
+ ```typescript
83
+ // ❌ M6: prepared statement 미사용 (반복 쿼리)
84
+ for (const id of userIds) {
85
+ await db.select().from(users).where(eq(users.id, id))
86
+ }
87
+
88
+ // ✅ 수정: prepare + IN 조건 (PostgreSQL named prepared statement)
89
+ const getUsers = db
90
+ .select({ id: users.id, name: users.name })
91
+ .from(users)
92
+ .where(inArray(users.id, sql.placeholder('ids')))
93
+ .prepare('get_users_batch')
94
+
95
+ await getUsers.execute({ ids: userIds })
96
+
97
+ // ❌ C4: select() 전체 컬럼
98
+ const result = await db.select().from(users)
99
+
100
+ // ✅ 수정: partial select
101
+ const result = await db
102
+ .select({ id: users.id, email: users.email })
103
+ .from(users)
104
+
105
+ // ✅ JSON 집계 (N+1 방지, 단일 쿼리)
106
+ const usersWithPosts = await db
107
+ .select({
108
+ id: users.id,
109
+ name: users.name,
110
+ posts: sql`json_agg(${posts}) FILTER (WHERE ${posts.id} IS NOT NULL)`
111
+ })
112
+ .from(users)
113
+ .leftJoin(posts, eq(users.id, posts.userId))
114
+ .groupBy(users.id)
115
+ .limit(20)
116
+ .prepare('get_users_with_posts')
117
+ .execute()
118
+ ```
119
+
120
+ ---
121
+
122
+ ## TypeORM
123
+
124
+ ```typescript
125
+ // ❌ H5: lazy loading 루프
126
+ const users = await User.find()
127
+ for (const user of users) {
128
+ const posts = await user.posts // Promise<Post[]> - 매번 쿼리
129
+ }
130
+
131
+ // ✅ 수정: leftJoinAndSelect + 필드 선택
132
+ const users = await createQueryBuilder('user')
133
+ .leftJoinAndSelect('user.posts', 'post')
134
+ .select(['user.id', 'user.name', 'post.id', 'post.title'])
135
+ .getMany()
136
+
137
+ // ✅ 성능 극대화: getRawMany (3.5x 빠름, 엔티티 변환 생략)
138
+ const users = await createQueryBuilder('user')
139
+ .leftJoin('user.posts', 'post')
140
+ .select(['user.id', 'user.name', 'post.id', 'post.title'])
141
+ .getRawMany()
142
+
143
+ // ✅ 배치 로드 (IN 쿼리, N+1 대안)
144
+ const users = await User.find()
145
+ const userIds = users.map(u => u.id)
146
+ const posts = await Post.find({ where: { userId: In(userIds) } })
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Raw SQL
152
+
153
+ ```sql
154
+ -- ❌ H2: WHERE IN 서브쿼리
155
+ SELECT * FROM orders
156
+ WHERE customer_id IN (SELECT id FROM customers WHERE country = 'KR');
157
+
158
+ -- ✅ 수정: JOIN + 필요 컬럼만
159
+ SELECT o.id, o.total, o.created_at
160
+ FROM orders o
161
+ INNER JOIN customers c ON o.customer_id = c.id
162
+ WHERE c.country = 'KR';
163
+
164
+ -- ❌ M3: 집계 서브쿼리 (Window Function 미사용)
165
+ SELECT *, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as order_count
166
+ FROM users u;
167
+
168
+ -- ✅ 수정: LEFT JOIN + GROUP BY
169
+ SELECT u.id, u.name, COUNT(o.id) as order_count
170
+ FROM users u
171
+ LEFT JOIN orders o ON u.id = o.user_id
172
+ GROUP BY u.id, u.name;
173
+
174
+ -- ❌ M4: Partial Index 미적용
175
+ SELECT * FROM orders WHERE status = 'pending' AND created_at > NOW() - INTERVAL '7 days';
176
+ -- CREATE INDEX idx_orders_created ON orders(created_at); -- 전체 인덱스
177
+
178
+ -- ✅ 수정: Partial Index (최대 275x 성능 향상)
179
+ CREATE INDEX idx_orders_pending ON orders(created_at)
180
+ WHERE status = 'pending';
181
+
182
+ -- ❌ M1: DISTINCT 마스킹 (잘못된 JOIN 은폐)
183
+ SELECT DISTINCT u.* FROM users u
184
+ JOIN orders o ON u.id = o.user_id;
185
+
186
+ -- ✅ 수정: JOIN 로직 수정 또는 EXISTS
187
+ SELECT u.* FROM users u
188
+ WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
189
+ ```
190
+
191
+ ---
192
+
193
+ ## 대량 데이터 로드 최적화
194
+
195
+ ```sql
196
+ -- Step 1: 트랜잭션 시작
197
+ BEGIN;
198
+
199
+ -- Step 2: 인덱스 임시 제거 + 트리거 비활성화
200
+ DROP INDEX IF EXISTS idx_target;
201
+ ALTER TABLE target DISABLE TRIGGER ALL;
202
+
203
+ -- Step 3: 메모리 설정 증가
204
+ SET maintenance_work_mem = '1GB';
205
+
206
+ -- Step 4: COPY 사용 (INSERT 대비 10x 빠름)
207
+ COPY target FROM STDIN;
208
+
209
+ -- Step 5: 트리거 복구 + 인덱스 재생성
210
+ ALTER TABLE target ENABLE TRIGGER ALL;
211
+ CREATE INDEX idx_target ON target(col);
212
+
213
+ -- Step 6: 트랜잭션 완료
214
+ COMMIT;
215
+
216
+ -- Step 7: 통계 업데이트 (트랜잭션 외부에서 실행)
217
+ ANALYZE target;
218
+ ```
@@ -7,6 +7,7 @@ user-invocable: true
7
7
  @../../instructions/workflow-patterns/sequential-thinking.md
8
8
  @../../instructions/agent-patterns/parallel-execution.md
9
9
  @../../instructions/agent-patterns/model-routing.md
10
+ @../../instructions/agent-patterns/agent-teams-usage.md
10
11
  @../../instructions/validation/forbidden-patterns.md
11
12
  @../../instructions/validation/required-behaviors.md
12
13