timsquad 2.0.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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/bin/tsq.js +6 -0
  4. package/dist/commands/feedback.d.ts +3 -0
  5. package/dist/commands/feedback.d.ts.map +1 -0
  6. package/dist/commands/feedback.js +142 -0
  7. package/dist/commands/feedback.js.map +1 -0
  8. package/dist/commands/full.d.ts +3 -0
  9. package/dist/commands/full.d.ts.map +1 -0
  10. package/dist/commands/full.js +87 -0
  11. package/dist/commands/full.js.map +1 -0
  12. package/dist/commands/git/commit.d.ts +3 -0
  13. package/dist/commands/git/commit.d.ts.map +1 -0
  14. package/dist/commands/git/commit.js +88 -0
  15. package/dist/commands/git/commit.js.map +1 -0
  16. package/dist/commands/git/index.d.ts +5 -0
  17. package/dist/commands/git/index.d.ts.map +1 -0
  18. package/dist/commands/git/index.js +5 -0
  19. package/dist/commands/git/index.js.map +1 -0
  20. package/dist/commands/git/pr.d.ts +3 -0
  21. package/dist/commands/git/pr.d.ts.map +1 -0
  22. package/dist/commands/git/pr.js +138 -0
  23. package/dist/commands/git/pr.js.map +1 -0
  24. package/dist/commands/git/release.d.ts +3 -0
  25. package/dist/commands/git/release.d.ts.map +1 -0
  26. package/dist/commands/git/release.js +158 -0
  27. package/dist/commands/git/release.js.map +1 -0
  28. package/dist/commands/git/sync.d.ts +3 -0
  29. package/dist/commands/git/sync.d.ts.map +1 -0
  30. package/dist/commands/git/sync.js +132 -0
  31. package/dist/commands/git/sync.js.map +1 -0
  32. package/dist/commands/init.d.ts +3 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +150 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/log.d.ts +3 -0
  37. package/dist/commands/log.d.ts.map +1 -0
  38. package/dist/commands/log.js +271 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/metrics.d.ts +3 -0
  41. package/dist/commands/metrics.d.ts.map +1 -0
  42. package/dist/commands/metrics.js +299 -0
  43. package/dist/commands/metrics.js.map +1 -0
  44. package/dist/commands/quick.d.ts +3 -0
  45. package/dist/commands/quick.d.ts.map +1 -0
  46. package/dist/commands/quick.js +136 -0
  47. package/dist/commands/quick.js.map +1 -0
  48. package/dist/commands/retro.d.ts +3 -0
  49. package/dist/commands/retro.d.ts.map +1 -0
  50. package/dist/commands/retro.js +280 -0
  51. package/dist/commands/retro.js.map +1 -0
  52. package/dist/commands/status.d.ts +3 -0
  53. package/dist/commands/status.d.ts.map +1 -0
  54. package/dist/commands/status.js +127 -0
  55. package/dist/commands/status.js.map +1 -0
  56. package/dist/commands/watch.d.ts +3 -0
  57. package/dist/commands/watch.d.ts.map +1 -0
  58. package/dist/commands/watch.js +213 -0
  59. package/dist/commands/watch.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +50 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/config.d.ts +34 -0
  65. package/dist/lib/config.d.ts.map +1 -0
  66. package/dist/lib/config.js +108 -0
  67. package/dist/lib/config.js.map +1 -0
  68. package/dist/lib/project.d.ts +47 -0
  69. package/dist/lib/project.d.ts.map +1 -0
  70. package/dist/lib/project.js +191 -0
  71. package/dist/lib/project.js.map +1 -0
  72. package/dist/lib/template.d.ts +33 -0
  73. package/dist/lib/template.d.ts.map +1 -0
  74. package/dist/lib/template.js +151 -0
  75. package/dist/lib/template.js.map +1 -0
  76. package/dist/types/config.d.ts +75 -0
  77. package/dist/types/config.d.ts.map +1 -0
  78. package/dist/types/config.js +66 -0
  79. package/dist/types/config.js.map +1 -0
  80. package/dist/types/feedback.d.ts +59 -0
  81. package/dist/types/feedback.d.ts.map +1 -0
  82. package/dist/types/feedback.js +26 -0
  83. package/dist/types/feedback.js.map +1 -0
  84. package/dist/types/index.d.ts +4 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +5 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/project.d.ts +89 -0
  89. package/dist/types/project.d.ts.map +1 -0
  90. package/dist/types/project.js +44 -0
  91. package/dist/types/project.js.map +1 -0
  92. package/dist/utils/colors.d.ts +30 -0
  93. package/dist/utils/colors.d.ts.map +1 -0
  94. package/dist/utils/colors.js +54 -0
  95. package/dist/utils/colors.js.map +1 -0
  96. package/dist/utils/date.d.ts +25 -0
  97. package/dist/utils/date.d.ts.map +1 -0
  98. package/dist/utils/date.js +65 -0
  99. package/dist/utils/date.js.map +1 -0
  100. package/dist/utils/fs.d.ts +49 -0
  101. package/dist/utils/fs.d.ts.map +1 -0
  102. package/dist/utils/fs.js +84 -0
  103. package/dist/utils/fs.js.map +1 -0
  104. package/dist/utils/prompts.d.ts +31 -0
  105. package/dist/utils/prompts.d.ts.map +1 -0
  106. package/dist/utils/prompts.js +95 -0
  107. package/dist/utils/prompts.js.map +1 -0
  108. package/dist/utils/yaml.d.ts +21 -0
  109. package/dist/utils/yaml.d.ts.map +1 -0
  110. package/dist/utils/yaml.js +40 -0
  111. package/dist/utils/yaml.js.map +1 -0
  112. package/package.json +71 -0
  113. package/templates/common/CLAUDE.md.template +254 -0
  114. package/templates/common/claude/agents/tsq-dba.md +290 -0
  115. package/templates/common/claude/agents/tsq-designer.md +304 -0
  116. package/templates/common/claude/agents/tsq-developer.md +118 -0
  117. package/templates/common/claude/agents/tsq-planner.md +90 -0
  118. package/templates/common/claude/agents/tsq-prompter.md +336 -0
  119. package/templates/common/claude/agents/tsq-qa.md +134 -0
  120. package/templates/common/claude/agents/tsq-retro.md +168 -0
  121. package/templates/common/claude/agents/tsq-security.md +190 -0
  122. package/templates/common/claude/skills/architecture/SKILL.md +123 -0
  123. package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
  124. package/templates/common/claude/skills/coding/SKILL.md +171 -0
  125. package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
  126. package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
  127. package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
  128. package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
  129. package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
  130. package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
  131. package/templates/common/claude/skills/planning/SKILL.md +90 -0
  132. package/templates/common/claude/skills/security/SKILL.md +234 -0
  133. package/templates/common/claude/skills/testing/SKILL.md +146 -0
  134. package/templates/common/claude/skills/typescript/SKILL.md +435 -0
  135. package/templates/common/config.template.yaml +131 -0
  136. package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
  137. package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
  138. package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
  139. package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
  140. package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
  141. package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
  142. package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
  143. package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
  144. package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
  145. package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
  146. package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
  147. package/templates/common/timsquad/generators/data-design.xml +290 -0
  148. package/templates/common/timsquad/generators/prd.xml +280 -0
  149. package/templates/common/timsquad/generators/requirements.xml +220 -0
  150. package/templates/common/timsquad/generators/service-spec.xml +266 -0
  151. package/templates/common/timsquad/logs/_example.md +81 -0
  152. package/templates/common/timsquad/logs/_template.md +46 -0
  153. package/templates/common/timsquad/patterns/cqrs.xml +127 -0
  154. package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
  155. package/templates/common/timsquad/patterns/repository.xml +64 -0
  156. package/templates/common/timsquad/process/state-machine.xml +343 -0
  157. package/templates/common/timsquad/process/validation-rules.xml +308 -0
  158. package/templates/common/timsquad/process/workflow-base.xml +202 -0
  159. package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
  160. package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
  161. package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
  162. package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
  163. package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
  164. package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
  165. package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
  166. package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
  167. package/templates/common/timsquad/ssot/data-design.template.md +132 -0
  168. package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
  169. package/templates/common/timsquad/ssot/env-config.template.md +346 -0
  170. package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
  171. package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
  172. package/templates/common/timsquad/ssot/glossary.template.md +148 -0
  173. package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
  174. package/templates/common/timsquad/ssot/planning.template.md +94 -0
  175. package/templates/common/timsquad/ssot/prd.template.md +102 -0
  176. package/templates/common/timsquad/ssot/requirements.template.md +117 -0
  177. package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
  178. package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
  179. package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
  180. package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
  181. package/templates/common/timsquad/state/workspace.xml +217 -0
@@ -0,0 +1,391 @@
1
+ ---
2
+ title: "외부 연동 명세서 (Integration Specification)"
3
+ version: 1.0.0
4
+ last_updated: {{DATE}}
5
+ author: tsq-planner
6
+ status: draft
7
+ project: {{PROJECT_NAME}}
8
+ required_level: 3
9
+ ---
10
+
11
+ # 외부 연동 명세서 (Integration Specification)
12
+
13
+ > 외부 API, 서드파티 서비스, Webhook 연동을 정의합니다.
14
+ > Level 3 (Enterprise) 또는 platform 타입 프로젝트 필수 문서입니다.
15
+
16
+ ---
17
+
18
+ ## 1. 연동 개요
19
+
20
+ ### 1.1 연동 서비스 목록
21
+
22
+ | 서비스 | 용도 | 제공사 | 우선순위 | 상태 |
23
+ |-------|------|--------|:--------:|:----:|
24
+ | 결제 | 카드/계좌 결제 | Stripe/Toss | P0 | 📋 |
25
+ | 인증 | OAuth 로그인 | Google/Kakao | P1 | 📋 |
26
+ | 이메일 | 알림/마케팅 | SendGrid | P1 | 📋 |
27
+ | SMS | 인증/알림 | Twilio | P2 | 📋 |
28
+ | 스토리지 | 파일 업로드 | AWS S3 | P1 | 📋 |
29
+ | 모니터링 | 에러 추적 | Sentry | P1 | 📋 |
30
+ | 분석 | 사용자 행동 | Amplitude | P2 | 📋 |
31
+
32
+ > 상태: 📋 계획 / 🚧 개발 중 / ✅ 완료 / ⏸️ 보류
33
+
34
+ ### 1.2 연동 아키텍처
35
+
36
+ ```
37
+ ┌─────────────────────────────────────────────────────────────┐
38
+ │ {{PROJECT_NAME}} │
39
+ │ │
40
+ │ ┌─────────────────────────────────────────────────────┐ │
41
+ │ │ Integration Layer │ │
42
+ │ │ │ │
43
+ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
44
+ │ │ │ Payment │ │ Auth │ │ Storage │ ... │ │
45
+ │ │ │ Adapter │ │ Adapter │ │ Adapter │ │ │
46
+ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
47
+ │ └───────┼────────────┼────────────┼────────────────────┘ │
48
+ │ │ │ │ │
49
+ └──────────┼────────────┼────────────┼─────────────────────────┘
50
+ │ │ │
51
+ ▼ ▼ ▼
52
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
53
+ │ Stripe │ │ Google │ │ AWS S3 │
54
+ │ Toss │ │ Kakao │ │ │
55
+ └──────────┘ └──────────┘ └──────────┘
56
+ ```
57
+
58
+ ---
59
+
60
+ ## 2. 결제 연동
61
+
62
+ ### 2.1 서비스 정보
63
+
64
+ | 항목 | 값 |
65
+ |-----|---|
66
+ | **제공사** | Stripe / Toss Payments |
67
+ | **API 버전** | 2023-10-16 |
68
+ | **환경** | Sandbox (Dev/Staging) / Live (Prod) |
69
+ | **문서** | https://stripe.com/docs/api |
70
+
71
+ ### 2.2 지원 결제 수단
72
+
73
+ | 결제 수단 | 지원 | 비고 |
74
+ |---------|:----:|------|
75
+ | 신용카드 | ✅ | Visa, Master, Amex |
76
+ | 체크카드 | ✅ | |
77
+ | 계좌이체 | ✅ | 실시간 |
78
+ | 가상계좌 | ✅ | 무통장입금 |
79
+ | 간편결제 | ⚪ | 카카오페이, 네이버페이 |
80
+
81
+ ### 2.3 API 엔드포인트
82
+
83
+ | 기능 | Method | Endpoint | 설명 |
84
+ |-----|--------|----------|------|
85
+ | 결제 생성 | POST | `/v1/payments` | 결제 의도 생성 |
86
+ | 결제 확인 | POST | `/v1/payments/{id}/confirm` | 결제 승인 |
87
+ | 결제 취소 | POST | `/v1/payments/{id}/cancel` | 전체/부분 취소 |
88
+ | 결제 조회 | GET | `/v1/payments/{id}` | 상태 조회 |
89
+ | 환불 요청 | POST | `/v1/refunds` | 환불 처리 |
90
+
91
+ ### 2.4 Webhook 이벤트
92
+
93
+ | 이벤트 | 트리거 | 처리 |
94
+ |-------|-------|------|
95
+ | `payment.success` | 결제 성공 | 주문 상태 업데이트 |
96
+ | `payment.failed` | 결제 실패 | 알림 발송, 재시도 |
97
+ | `payment.refunded` | 환불 완료 | 재고 복원 |
98
+ | `payment.disputed` | 분쟁 발생 | 관리자 알림 |
99
+
100
+ ### 2.5 에러 처리
101
+
102
+ | 에러 코드 | 설명 | 대응 |
103
+ |----------|------|------|
104
+ | `card_declined` | 카드 거절 | 다른 결제 수단 안내 |
105
+ | `insufficient_funds` | 잔액 부족 | 금액 확인 안내 |
106
+ | `expired_card` | 만료된 카드 | 카드 정보 업데이트 |
107
+ | `processing_error` | 처리 오류 | 재시도 (3회) |
108
+
109
+ ---
110
+
111
+ ## 3. 인증 연동 (OAuth)
112
+
113
+ ### 3.1 지원 제공자
114
+
115
+ | 제공자 | Client ID | Scope | Callback URL |
116
+ |-------|-----------|-------|--------------|
117
+ | Google | `GOOGLE_CLIENT_ID` | email, profile | `/auth/google/callback` |
118
+ | Kakao | `KAKAO_CLIENT_ID` | profile, email | `/auth/kakao/callback` |
119
+ | Naver | `NAVER_CLIENT_ID` | name, email | `/auth/naver/callback` |
120
+ | Apple | `APPLE_CLIENT_ID` | name, email | `/auth/apple/callback` |
121
+
122
+ ### 3.2 OAuth 플로우
123
+
124
+ ```
125
+ ┌──────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐
126
+ │Client│ │ Server │ │ Provider │ │ DB │
127
+ └──┬───┘ └────┬────┘ └────┬─────┘ └────┬─────┘
128
+ │ │ │ │
129
+ │ 1. Login │ │ │
130
+ │─────────────>│ │ │
131
+ │ │ │ │
132
+ │ 2. Redirect │ │ │
133
+ │<─────────────│ │ │
134
+ │ │ │ │
135
+ │ 3. Auth Request │ │
136
+ │─────────────────────────────>│ │
137
+ │ │ │ │
138
+ │ 4. Auth Code│ │ │
139
+ │<─────────────────────────────│ │
140
+ │ │ │ │
141
+ │ 5. Callback │ │ │
142
+ │─────────────>│ │ │
143
+ │ │ 6. Token Exchange │
144
+ │ │──────────────>│ │
145
+ │ │ │ │
146
+ │ │ 7. User Info │ │
147
+ │ │<──────────────│ │
148
+ │ │ │ │
149
+ │ │ 8. Create/Update User │
150
+ │ │────────────────────────────────>
151
+ │ │ │ │
152
+ │ 9. JWT │ │ │
153
+ │<─────────────│ │ │
154
+ ```
155
+
156
+ ### 3.3 사용자 매핑
157
+
158
+ | Provider 필드 | 내부 필드 | 비고 |
159
+ |--------------|----------|------|
160
+ | `sub` / `id` | `provider_id` | 고유 식별자 |
161
+ | `email` | `email` | 이메일 검증 필요 |
162
+ | `name` / `nickname` | `name` | |
163
+ | `picture` / `profile_image` | `avatar_url` | 선택적 |
164
+
165
+ ---
166
+
167
+ ## 4. 이메일 연동
168
+
169
+ ### 4.1 서비스 정보
170
+
171
+ | 항목 | 값 |
172
+ |-----|---|
173
+ | **제공사** | SendGrid |
174
+ | **API 버전** | v3 |
175
+ | **일일 한도** | 10,000 (Free), Unlimited (Paid) |
176
+
177
+ ### 4.2 이메일 템플릿
178
+
179
+ | 템플릿 ID | 용도 | 트리거 |
180
+ |----------|------|--------|
181
+ | `welcome` | 회원가입 환영 | 가입 완료 |
182
+ | `verify-email` | 이메일 인증 | 가입/변경 요청 |
183
+ | `reset-password` | 비밀번호 재설정 | 재설정 요청 |
184
+ | `order-confirm` | 주문 확인 | 결제 완료 |
185
+ | `order-shipped` | 배송 알림 | 배송 시작 |
186
+
187
+ ### 4.3 API 사용
188
+
189
+ ```typescript
190
+ // 이메일 발송
191
+ interface SendEmailRequest {
192
+ to: string;
193
+ template_id: string;
194
+ dynamic_template_data: Record<string, any>;
195
+ }
196
+
197
+ // POST /v3/mail/send
198
+ ```
199
+
200
+ ---
201
+
202
+ ## 5. 파일 스토리지 연동
203
+
204
+ ### 5.1 서비스 정보
205
+
206
+ | 항목 | 값 |
207
+ |-----|---|
208
+ | **제공사** | AWS S3 |
209
+ | **리전** | ap-northeast-2 |
210
+ | **버킷** | `{{PROJECT_NAME}}-{env}` |
211
+
212
+ ### 5.2 폴더 구조
213
+
214
+ ```
215
+ s3://{{PROJECT_NAME}}-prod/
216
+ ├── uploads/ # 사용자 업로드
217
+ │ ├── images/
218
+ │ ├── documents/
219
+ │ └── temp/
220
+ ├── assets/ # 정적 자산
221
+ │ ├── images/
222
+ │ └── fonts/
223
+ └── backups/ # 백업
224
+ ```
225
+
226
+ ### 5.3 업로드 정책
227
+
228
+ | 항목 | 값 |
229
+ |-----|---|
230
+ | 최대 파일 크기 | 10MB (이미지), 50MB (문서) |
231
+ | 허용 형식 | jpg, png, gif, pdf, docx, xlsx |
232
+ | 업로드 방식 | Pre-signed URL |
233
+ | 만료 시간 | 15분 |
234
+
235
+ ### 5.4 Pre-signed URL 플로우
236
+
237
+ ```
238
+ ┌──────┐ ┌─────────┐ ┌─────────┐
239
+ │Client│ │ Server │ │ S3 │
240
+ └──┬───┘ └────┬────┘ └────┬────┘
241
+ │ │ │
242
+ │ 1. Request URL │
243
+ │─────────────>│ │
244
+ │ │ │
245
+ │ │ 2. Generate │
246
+ │ │ Pre-signed │
247
+ │ │ │
248
+ │ 3. Return URL│ │
249
+ │<─────────────│ │
250
+ │ │ │
251
+ │ 4. Direct Upload │
252
+ │─────────────────────────────>│
253
+ │ │ │
254
+ │ 5. Upload Complete │
255
+ │<─────────────────────────────│
256
+ │ │ │
257
+ │ 6. Confirm │ │
258
+ │─────────────>│ │
259
+ ```
260
+
261
+ ---
262
+
263
+ ## 6. Webhook 수신
264
+
265
+ ### 6.1 공통 설정
266
+
267
+ | 항목 | 값 |
268
+ |-----|---|
269
+ | 엔드포인트 | `/webhooks/{provider}` |
270
+ | 인증 | Signature 검증 |
271
+ | 재시도 | 3회 (exponential backoff) |
272
+ | 타임아웃 | 30초 |
273
+
274
+ ### 6.2 Webhook 보안
275
+
276
+ ```typescript
277
+ // Signature 검증 예시 (Stripe)
278
+ function verifyWebhook(payload: string, signature: string): boolean {
279
+ const expectedSig = crypto
280
+ .createHmac('sha256', process.env.WEBHOOK_SECRET)
281
+ .update(payload)
282
+ .digest('hex');
283
+
284
+ return crypto.timingSafeEqual(
285
+ Buffer.from(signature),
286
+ Buffer.from(expectedSig)
287
+ );
288
+ }
289
+ ```
290
+
291
+ ### 6.3 멱등성 처리
292
+
293
+ | 처리 | 설명 |
294
+ |-----|------|
295
+ | Event ID 저장 | DB에 처리된 이벤트 기록 |
296
+ | 중복 체크 | 동일 ID 재수신 시 무시 |
297
+ | 순서 보장 | timestamp 기반 처리 |
298
+
299
+ ---
300
+
301
+ ## 7. 모니터링/분석 연동
302
+
303
+ ### 7.1 에러 추적 (Sentry)
304
+
305
+ ```typescript
306
+ // 초기화
307
+ Sentry.init({
308
+ dsn: process.env.SENTRY_DSN,
309
+ environment: process.env.NODE_ENV,
310
+ tracesSampleRate: 0.1,
311
+ });
312
+
313
+ // 에러 캡처
314
+ Sentry.captureException(error, {
315
+ tags: { module: 'payment' },
316
+ extra: { orderId: order.id },
317
+ });
318
+ ```
319
+
320
+ ### 7.2 분석 (Amplitude)
321
+
322
+ ```typescript
323
+ // 이벤트 추적
324
+ amplitude.track('purchase_completed', {
325
+ order_id: order.id,
326
+ amount: order.total,
327
+ items: order.items.length,
328
+ });
329
+ ```
330
+
331
+ ---
332
+
333
+ ## 8. Rate Limiting & 재시도
334
+
335
+ ### 8.1 제공사별 한도
336
+
337
+ | 서비스 | Rate Limit | 초과 시 |
338
+ |-------|-----------|---------|
339
+ | Stripe | 100 req/s | 429 + Retry-After |
340
+ | SendGrid | 600 req/min | 429 |
341
+ | S3 | 3,500 PUT/s | 503 |
342
+
343
+ ### 8.2 재시도 전략
344
+
345
+ ```typescript
346
+ const retryConfig = {
347
+ maxRetries: 3,
348
+ baseDelay: 1000, // 1초
349
+ maxDelay: 30000, // 30초
350
+ factor: 2, // exponential
351
+ retryableErrors: [429, 500, 502, 503, 504],
352
+ };
353
+ ```
354
+
355
+ ---
356
+
357
+ ## 9. 테스트 전략
358
+
359
+ ### 9.1 환경별 설정
360
+
361
+ | 환경 | 연동 방식 |
362
+ |-----|----------|
363
+ | Unit Test | Mock 사용 |
364
+ | Integration | Sandbox API |
365
+ | Staging | Sandbox API |
366
+ | Production | Live API |
367
+
368
+ ### 9.2 테스트 데이터
369
+
370
+ | 서비스 | 테스트 데이터 |
371
+ |-------|-------------|
372
+ | Stripe | `4242 4242 4242 4242` (성공) |
373
+ | Stripe | `4000 0000 0000 0002` (거절) |
374
+ | OAuth | 테스트 계정 사용 |
375
+
376
+ ---
377
+
378
+ ## 10. 관련 문서
379
+
380
+ - [API 명세](./service-spec.md) - 내부 API
381
+ - [환경 설정](./env-config.md) - API 키 관리
382
+ - [에러 코드](./error-codes.md) - 에러 정의
383
+ - [보안 명세](./security-spec.md) - 인증/암호화
384
+
385
+ ---
386
+
387
+ ## 변경 이력
388
+
389
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
390
+ |------|------|--------|----------|
391
+ | 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |
@@ -0,0 +1,94 @@
1
+ # {PROJECT_NAME} 기획서
2
+
3
+ **Version**: 1.0
4
+ **Created**: {DATE}
5
+ **PRD Reference**: [prd.md](./prd.md)
6
+
7
+ ---
8
+
9
+ ## 1. 프로젝트 개요
10
+
11
+ ### 1.1 요약
12
+ PRD에서 정의한 목표를 달성하기 위한 실행 계획.
13
+
14
+ ### 1.2 범위
15
+ - **In Scope**:
16
+ - **Out of Scope**:
17
+
18
+ ---
19
+
20
+ ## 2. 마일스톤
21
+
22
+ | Phase | 목표 | 산출물 | 완료 기준 |
23
+ |-------|-----|--------|----------|
24
+ | Phase 1 | | | |
25
+ | Phase 2 | | | |
26
+ | Phase 3 | | | |
27
+
28
+ ---
29
+
30
+ ## 3. 기술 스택
31
+
32
+ ### 3.1 Frontend
33
+ | 기술 | 용도 | 선택 이유 |
34
+ |-----|------|----------|
35
+ | | | |
36
+
37
+ ### 3.2 Backend
38
+ | 기술 | 용도 | 선택 이유 |
39
+ |-----|------|----------|
40
+ | | | |
41
+
42
+ ### 3.3 Infrastructure
43
+ | 기술 | 용도 | 선택 이유 |
44
+ |-----|------|----------|
45
+ | | | |
46
+
47
+ ---
48
+
49
+ ## 4. 아키텍처 개요
50
+
51
+ ```
52
+ [아키텍처 다이어그램]
53
+ ```
54
+
55
+ ### 4.1 주요 컴포넌트
56
+ | 컴포넌트 | 역할 | 기술 |
57
+ |---------|-----|-----|
58
+ | | | |
59
+
60
+ ---
61
+
62
+ ## 5. 팀 구성
63
+
64
+ | 역할 | 담당 | 책임 |
65
+ |-----|-----|-----|
66
+ | | | |
67
+
68
+ ---
69
+
70
+ ## 6. 의존성
71
+
72
+ ### 6.1 외부 의존성
73
+ | 서비스/API | 용도 | 대안 |
74
+ |-----------|-----|-----|
75
+ | | | |
76
+
77
+ ### 6.2 내부 의존성
78
+ -
79
+
80
+ ---
81
+
82
+ ## 7. 리스크 관리
83
+
84
+ | 리스크 | 확률 | 영향 | 대응 계획 |
85
+ |-------|-----|-----|----------|
86
+ | | | | |
87
+
88
+ ---
89
+
90
+ ## 8. 변경 이력
91
+
92
+ | 버전 | 날짜 | 변경 내용 | 작성자 |
93
+ |-----|-----|----------|-------|
94
+ | 1.0 | {DATE} | 최초 작성 | |
@@ -0,0 +1,102 @@
1
+ # {PROJECT_NAME} PRD
2
+
3
+ **Version**: 1.0
4
+ **Created**: {DATE}
5
+ **Author**:
6
+
7
+ ---
8
+
9
+ ## 1. 개요
10
+
11
+ ### 1.1 한 줄 정의
12
+ >
13
+
14
+ ### 1.2 배경
15
+ 왜 이 프로젝트가 필요한가?
16
+
17
+ ### 1.3 목표
18
+ - **Primary**:
19
+ - **Secondary**:
20
+
21
+ ### 1.4 비목표 (Non-Goals)
22
+ 이 프로젝트에서 하지 않을 것:
23
+ -
24
+
25
+ ---
26
+
27
+ ## 2. 타겟 사용자
28
+
29
+ ### 2.1 Primary User
30
+ - **Who**:
31
+ - **Pain Point**:
32
+ - **Need**:
33
+
34
+ ### 2.2 Secondary User
35
+ - **Who**:
36
+ - **Pain Point**:
37
+ - **Need**:
38
+
39
+ ---
40
+
41
+ ## 3. 핵심 기능
42
+
43
+ ### 3.1 Must Have (P0)
44
+ | 기능 | 설명 | 성공 기준 |
45
+ |-----|------|----------|
46
+ | | | |
47
+
48
+ ### 3.2 Should Have (P1)
49
+ | 기능 | 설명 | 성공 기준 |
50
+ |-----|------|----------|
51
+ | | | |
52
+
53
+ ### 3.3 Nice to Have (P2)
54
+ | 기능 | 설명 |
55
+ |-----|------|
56
+ | | |
57
+
58
+ ---
59
+
60
+ ## 4. 성공 지표
61
+
62
+ ### 4.1 정량적 지표
63
+ | 지표 | 목표 | 측정 방법 |
64
+ |-----|------|----------|
65
+ | | | |
66
+
67
+ ### 4.2 정성적 지표
68
+ -
69
+
70
+ ---
71
+
72
+ ## 5. 제약사항
73
+
74
+ ### 5.1 기술적 제약
75
+ -
76
+
77
+ ### 5.2 비즈니스 제약
78
+ -
79
+
80
+ ### 5.3 일정
81
+ - **시작**:
82
+ - **목표 완료**:
83
+
84
+ ---
85
+
86
+ ## 6. 리스크
87
+
88
+ | 리스크 | 영향 | 대응 |
89
+ |-------|-----|-----|
90
+ | | | |
91
+
92
+ ---
93
+
94
+ ## 7. 참고
95
+
96
+ ### 7.1 관련 문서
97
+ -
98
+
99
+ ### 7.2 용어 정의
100
+ | 용어 | 정의 |
101
+ |-----|------|
102
+ | | |
@@ -0,0 +1,117 @@
1
+ # {PROJECT_NAME} 요건 정의서
2
+
3
+ **Version**: 1.0
4
+ **Created**: {DATE}
5
+ **PRD Reference**: [prd.md](./prd.md)
6
+
7
+ ---
8
+
9
+ ## 1. 기능 요건 (Functional Requirements)
10
+
11
+ ### 1.1 사용자 인증
12
+
13
+ | ID | 요건 | 우선순위 | 상태 |
14
+ |----|-----|:--------:|:----:|
15
+ | FR-AUTH-001 | | P0 | 🔲 |
16
+ | FR-AUTH-002 | | P0 | 🔲 |
17
+
18
+ ### 1.2 핵심 기능
19
+
20
+ | ID | 요건 | 우선순위 | 상태 |
21
+ |----|-----|:--------:|:----:|
22
+ | FR-CORE-001 | | P0 | 🔲 |
23
+ | FR-CORE-002 | | P1 | 🔲 |
24
+
25
+ ### 1.3 관리 기능
26
+
27
+ | ID | 요건 | 우선순위 | 상태 |
28
+ |----|-----|:--------:|:----:|
29
+ | FR-ADMIN-001 | | P1 | 🔲 |
30
+
31
+ ---
32
+
33
+ ## 2. 비기능 요건 (Non-Functional Requirements)
34
+
35
+ ### 2.1 성능
36
+
37
+ | ID | 요건 | 목표치 | 측정 방법 |
38
+ |----|-----|-------|----------|
39
+ | NFR-PERF-001 | API 응답 시간 | < 200ms (p95) | APM |
40
+ | NFR-PERF-002 | 동시 사용자 | 1,000명 | 부하 테스트 |
41
+
42
+ ### 2.2 가용성
43
+
44
+ | ID | 요건 | 목표치 |
45
+ |----|-----|-------|
46
+ | NFR-AVAIL-001 | 서비스 가용성 | 99.9% |
47
+ | NFR-AVAIL-002 | RTO (복구 시간) | < 1시간 |
48
+
49
+ ### 2.3 보안
50
+
51
+ | ID | 요건 | 상세 |
52
+ |----|-----|-----|
53
+ | NFR-SEC-001 | 인증 | JWT/세션 기반 |
54
+ | NFR-SEC-002 | 암호화 | TLS 1.3, AES-256 |
55
+ | NFR-SEC-003 | 데이터 보호 | 개인정보 암호화 저장 |
56
+
57
+ ### 2.4 확장성
58
+
59
+ | ID | 요건 | 상세 |
60
+ |----|-----|-----|
61
+ | NFR-SCALE-001 | 수평 확장 | 컨테이너 기반 오토스케일 |
62
+
63
+ ---
64
+
65
+ ## 3. 제약 조건
66
+
67
+ ### 3.1 기술적 제약
68
+ -
69
+
70
+ ### 3.2 환경 제약
71
+ -
72
+
73
+ ### 3.3 규제/컴플라이언스
74
+ -
75
+
76
+ ---
77
+
78
+ ## 4. 인터페이스 요건
79
+
80
+ ### 4.1 사용자 인터페이스
81
+ -
82
+
83
+ ### 4.2 외부 시스템 인터페이스
84
+ | 시스템 | 연동 방식 | 목적 |
85
+ |-------|---------|-----|
86
+ | | | |
87
+
88
+ ---
89
+
90
+ ## 5. 데이터 요건
91
+
92
+ ### 5.1 데이터 저장
93
+ -
94
+
95
+ ### 5.2 데이터 보존
96
+ | 데이터 유형 | 보존 기간 | 삭제 정책 |
97
+ |-----------|---------|----------|
98
+ | | | |
99
+
100
+ ---
101
+
102
+ ## 6. 상태 범례
103
+
104
+ | 상태 | 의미 |
105
+ |-----|------|
106
+ | 🔲 | 미착수 |
107
+ | 🔄 | 진행중 |
108
+ | ✅ | 완료 |
109
+ | ❌ | 취소/제외 |
110
+
111
+ ---
112
+
113
+ ## 7. 변경 이력
114
+
115
+ | 버전 | 날짜 | 변경 내용 | 작성자 |
116
+ |-----|-----|----------|-------|
117
+ | 1.0 | {DATE} | 최초 작성 | |