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,210 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ TimSquad Retrospective State
4
+
5
+ 회고 사이클 상태를 실시간으로 추적합니다.
6
+ XPath로 특정 노드에 효율적으로 접근 가능합니다.
7
+
8
+ 주요 XPath:
9
+ - /retrospective-state/current-cycle/@number
10
+ - /retrospective-state/current-cycle/status
11
+ - /retrospective-state/metrics/agents/agent[@id='tsq-developer']/score
12
+ - /retrospective-state/patterns/failure/pattern[@status='active']
13
+ -->
14
+ <retrospective-state>
15
+ <metadata>
16
+ <project>{{PROJECT_NAME}}</project>
17
+ <created>{{TIMESTAMP}}</created>
18
+ <last-updated>{{TIMESTAMP}}</last-updated>
19
+ <version>1.0</version>
20
+ </metadata>
21
+
22
+ <!-- ============================================================
23
+ 현재 회고 사이클
24
+ ============================================================ -->
25
+ <current-cycle number="0">
26
+ <status>inactive</status>
27
+ <!-- 상태: inactive | collecting | analyzing | reporting | applying | completed -->
28
+
29
+ <period>
30
+ <start></start>
31
+ <end></end>
32
+ </period>
33
+
34
+ <phase-at-start></phase-at-start>
35
+ <phase-at-end></phase-at-end>
36
+
37
+ <progress>
38
+ <step id="collect" status="pending">로그/메트릭 수집</step>
39
+ <step id="analyze" status="pending">패턴 분석</step>
40
+ <step id="report" status="pending">리포트 작성</step>
41
+ <step id="review" status="pending">검토/승인</step>
42
+ <step id="apply" status="pending">개선 적용</step>
43
+ </progress>
44
+ </current-cycle>
45
+
46
+ <!-- ============================================================
47
+ 수집된 메트릭 (현재 사이클)
48
+ ============================================================ -->
49
+ <metrics>
50
+ <summary>
51
+ <total-tasks>0</total-tasks>
52
+ <success-rate>0</success-rate>
53
+ <avg-revision-count>0</avg-revision-count>
54
+ <level3-feedback-count>0</level3-feedback-count>
55
+ </summary>
56
+
57
+ <agents>
58
+ <!--
59
+ <agent id="tsq-planner">
60
+ <tasks-completed>0</tasks-completed>
61
+ <success-rate>0</success-rate>
62
+ <avg-revisions>0</avg-revisions>
63
+ <score>0</score>
64
+ <trend>0</trend>
65
+ <competency-scores>
66
+ <competency name="documentation">0</competency>
67
+ <competency name="architecture">0</competency>
68
+ <competency name="communication">0</competency>
69
+ </competency-scores>
70
+ </agent>
71
+
72
+ <agent id="tsq-developer">
73
+ <tasks-completed>0</tasks-completed>
74
+ <success-rate>0</success-rate>
75
+ <avg-revisions>0</avg-revisions>
76
+ <score>0</score>
77
+ <trend>0</trend>
78
+ <competency-scores>
79
+ <competency name="coding">0</competency>
80
+ <competency name="testing">0</competency>
81
+ <competency name="debugging">0</competency>
82
+ </competency-scores>
83
+ </agent>
84
+ -->
85
+ </agents>
86
+
87
+ <feedback>
88
+ <total>0</total>
89
+ <by-level>
90
+ <level-1>0</level-1>
91
+ <level-2>0</level-2>
92
+ <level-3>0</level-3>
93
+ </by-level>
94
+ <avg-resolution-time unit="minutes">0</avg-resolution-time>
95
+ </feedback>
96
+ </metrics>
97
+
98
+ <!-- ============================================================
99
+ 식별된 패턴 (현재 사이클)
100
+ ============================================================ -->
101
+ <patterns>
102
+ <failure>
103
+ <!--
104
+ <pattern id="FP-001" status="active">
105
+ <name>SSOT 미참조 구현</name>
106
+ <category>DM</category>
107
+ <occurrences>3</occurrences>
108
+ <first-seen>2026-02-01</first-seen>
109
+ <last-seen>2026-02-03</last-seen>
110
+ <affected-agents>
111
+ <agent>tsq-developer</agent>
112
+ </affected-agents>
113
+ <cause>구현 전 SSOT 확인 단계 생략</cause>
114
+ <suggested-improvement ref="IMP-001"/>
115
+ </pattern>
116
+ -->
117
+ </failure>
118
+
119
+ <success>
120
+ <!--
121
+ <pattern id="SP-001" status="validated">
122
+ <name>SSOT 먼저, 코드 나중</name>
123
+ <category>DC</category>
124
+ <occurrences>5</occurrences>
125
+ <success-rate>95</success-rate>
126
+ <related-agents>
127
+ <agent>tsq-planner</agent>
128
+ <agent>tsq-developer</agent>
129
+ </related-agents>
130
+ <factor>명확한 계약서 역할</factor>
131
+ <standardization-status>applied</standardization-status>
132
+ </pattern>
133
+ -->
134
+ </success>
135
+ </patterns>
136
+
137
+ <!-- ============================================================
138
+ 제안된 개선 사항 (현재 사이클)
139
+ ============================================================ -->
140
+ <improvements>
141
+ <!--
142
+ <improvement id="IMP-001" status="proposed">
143
+ <type>prompt</type>
144
+ <target>tsq-developer.md</target>
145
+ <description>SSOT 참조 체크리스트 추가</description>
146
+ <related-pattern ref="FP-001"/>
147
+ <proposed-at>2026-02-03T10:00:00</proposed-at>
148
+ <proposed-by>tsq-retro</proposed-by>
149
+ <reviewed-at></reviewed-at>
150
+ <reviewed-by></reviewed-by>
151
+ <applied-at></applied-at>
152
+ <diff>
153
+ <![CDATA[
154
+ + ## 작업 전 체크리스트
155
+ + - [ ] service-spec.md 확인
156
+ + - [ ] data-design.md 확인
157
+ + - [ ] error-codes.md 확인
158
+ ]]>
159
+ </diff>
160
+ </improvement>
161
+ -->
162
+ </improvements>
163
+
164
+ <!-- ============================================================
165
+ 이전 사이클 요약 (최근 5개)
166
+ ============================================================ -->
167
+ <history>
168
+ <!--
169
+ <cycle number="1" status="completed">
170
+ <period start="2026-01-15" end="2026-01-28"/>
171
+ <summary>
172
+ <total-tasks>45</total-tasks>
173
+ <success-rate>87.5</success-rate>
174
+ <patterns-identified>3</patterns-identified>
175
+ <improvements-applied>2</improvements-applied>
176
+ </summary>
177
+ <report-path>.timsquad/retrospective/cycles/cycle-1.md</report-path>
178
+ </cycle>
179
+ -->
180
+ </history>
181
+
182
+ <!-- ============================================================
183
+ 다음 사이클 목표
184
+ ============================================================ -->
185
+ <next-cycle-goals>
186
+ <!--
187
+ <goal id="1">
188
+ <metric>success_rate</metric>
189
+ <target>90%</target>
190
+ <current-baseline>87.5%</current-baseline>
191
+ </goal>
192
+ <goal id="2">
193
+ <metric>level3_feedback_count</metric>
194
+ <target>&lt; 3</target>
195
+ <current-baseline>5</current-baseline>
196
+ </goal>
197
+ -->
198
+ </next-cycle-goals>
199
+
200
+ <!-- ============================================================
201
+ 세션 노트
202
+ ============================================================ -->
203
+ <session-notes>
204
+ <!--
205
+ <note timestamp="2026-02-03T10:00:00" agent="tsq-retro">
206
+ Cycle 1 분석 시작. 로그 45건 수집됨.
207
+ </note>
208
+ -->
209
+ </session-notes>
210
+ </retrospective-state>
@@ -0,0 +1,121 @@
1
+ # ADR-{번호}: {결정 제목}
2
+
3
+ ## 메타데이터
4
+ | 항목 | 내용 |
5
+ |-----|------|
6
+ | **상태** | 제안됨 / 승인됨 / 폐기됨 / 대체됨 |
7
+ | **작성자** | @{작성자} |
8
+ | **작성일** | YYYY-MM-DD |
9
+ | **승인일** | YYYY-MM-DD |
10
+ | **대체** | (이 ADR이 대체하는 이전 ADR, 있으면) |
11
+ | **태그** | #auth #frontend #architecture 등 |
12
+
13
+ ---
14
+
15
+ ## 맥락 (Context)
16
+ > 이 결정이 필요한 배경. 어떤 문제/상황에 직면했는가?
17
+
18
+ {배경 설명}
19
+
20
+ **관련 요구사항:**
21
+ - [requirements.md#기능명](../requirements.md#기능명)
22
+ - [service-spec.md#API명](../service-spec.md#API명)
23
+
24
+ ---
25
+
26
+ ## 결정 (Decision)
27
+ > 무엇을 결정했는가? 명확하고 간결하게.
28
+
29
+ **{결정 내용 한 줄 요약}**
30
+
31
+ {상세 설명 (필요시)}
32
+
33
+ ---
34
+
35
+ ## 이유 (Rationale)
36
+ > 왜 이 결정을 내렸는가? 가장 중요한 섹션.
37
+
38
+ ### 핵심 이유
39
+ 1. **{이유 1 제목}**: {설명}
40
+ 2. **{이유 2 제목}**: {설명}
41
+ 3. **{이유 3 제목}**: {설명}
42
+
43
+ ### 근거 자료
44
+ | 유형 | 링크/출처 | 요약 |
45
+ |-----|----------|-----|
46
+ | UX 리서치 | [Figma](링크) | 사용자 테스트 결과 A안 선호 |
47
+ | 기술 문서 | [공식문서](링크) | 권장 패턴 |
48
+ | 팀 논의 | Slack #channel MM/DD | 합의 내용 |
49
+ | 벤치마크 | [블로그](링크) | 성능 비교 |
50
+ | 경쟁사 분석 | 내부 문서 | A사, B사 동일 방식 |
51
+
52
+ ---
53
+
54
+ ## 대안 검토 (Alternatives Considered)
55
+ > 어떤 대안들을 검토했고, 왜 선택하지 않았는가?
56
+
57
+ ### 대안 1: {대안명}
58
+ - **설명**: {대안 설명}
59
+ - **장점**: {장점}
60
+ - **단점**: {단점}
61
+ - **탈락 이유**: {왜 선택 안 했는지}
62
+
63
+ ### 대안 2: {대안명}
64
+ - **설명**: {대안 설명}
65
+ - **장점**: {장점}
66
+ - **단점**: {단점}
67
+ - **탈락 이유**: {왜 선택 안 했는지}
68
+
69
+ ### 비교 요약
70
+ | 기준 | 선택안 ✅ | 대안 1 | 대안 2 |
71
+ |-----|---------|-------|-------|
72
+ | 성능 | ⭐⭐⭐ | ⭐⭐ | ⭐ |
73
+ | 구현 복잡도 | ⭐⭐ | ⭐⭐⭐ | ⭐ |
74
+ | 유지보수 | ⭐⭐⭐ | ⭐ | ⭐⭐ |
75
+ | 확장성 | ⭐⭐⭐ | ⭐⭐ | ⭐ |
76
+
77
+ ---
78
+
79
+ ## 결과 (Consequences)
80
+ > 이 결정으로 인한 영향. 좋은 점과 주의할 점 모두.
81
+
82
+ ### 긍정적 결과
83
+ - {좋은 점 1}
84
+ - {좋은 점 2}
85
+
86
+ ### 부정적 결과 / 트레이드오프
87
+ - {주의할 점 1}
88
+ - {주의할 점 2}
89
+
90
+ ### 영향받는 영역
91
+ - **코드**: `src/path/to/affected`
92
+ - **문서**: [service-spec.md](../service-spec.md)
93
+ - **팀**: Frontend, Backend
94
+
95
+ ---
96
+
97
+ ## 구현 가이드 (Implementation Notes)
98
+ > 이 결정을 구현할 때 참고할 사항 (선택적)
99
+
100
+ ```typescript
101
+ // 예시 코드 또는 패턴
102
+ ```
103
+
104
+ **주의사항:**
105
+ - {구현 시 주의할 점}
106
+
107
+ ---
108
+
109
+ ## 관련 문서 (Related)
110
+ - **SSOT**: [관련 문서](링크)
111
+ - **이전 ADR**: [ADR-XXX](링크)
112
+ - **이슈/티켓**: [JIRA-123](링크)
113
+ - **PR**: [#456](링크)
114
+
115
+ ---
116
+
117
+ ## 변경 이력
118
+ | 날짜 | 변경 내용 | 작성자 |
119
+ |-----|---------|-------|
120
+ | YYYY-MM-DD | 최초 작성 | @작성자 |
121
+ | YYYY-MM-DD | 상태 변경: 제안됨 → 승인됨 | @승인자 |
@@ -0,0 +1,115 @@
1
+ # ADR-001: 소셜 로그인만 지원 (이메일/비밀번호 로그인 제외)
2
+
3
+ ## 메타데이터
4
+ | 항목 | 내용 |
5
+ |-----|------|
6
+ | **상태** | 승인됨 |
7
+ | **작성자** | @planner |
8
+ | **작성일** | 2026-01-15 |
9
+ | **승인일** | 2026-01-16 |
10
+ | **태그** | #auth #ux #security |
11
+
12
+ ---
13
+
14
+ ## 맥락 (Context)
15
+ MVP 출시를 위한 인증 방식 결정 필요. 개발 리소스 제한(2주)과 보안 요구사항 고려.
16
+
17
+ **관련 요구사항:**
18
+ - [requirements.md#auth](../requirements.md#auth)
19
+ - [security-spec.md#인증](../security-spec.md#인증)
20
+
21
+ ---
22
+
23
+ ## 결정 (Decision)
24
+ **MVP에서는 소셜 로그인(Google, Apple)만 지원. 이메일/비밀번호 로그인은 v1.1에서 검토.**
25
+
26
+ ---
27
+
28
+ ## 이유 (Rationale)
29
+
30
+ ### 핵심 이유
31
+ 1. **보안 부담 감소**: 비밀번호 저장/해싱/재설정 로직 불필요. 보안 사고 리스크 ↓
32
+ 2. **개발 속도**: 인증 구현 2주 → 3일로 단축
33
+ 3. **사용자 경험**: 원클릭 로그인. 가입 전환율 높음 (업계 평균 +40%)
34
+ 4. **타겟 사용자**: 20-30대 테크 친화적 사용자. 소셜 로그인 거부감 낮음
35
+
36
+ ### 근거 자료
37
+ | 유형 | 링크/출처 | 요약 |
38
+ |-----|----------|-----|
39
+ | 사용자 조사 | [설문 결과](notion.so/xxx) | 응답자 87% 소셜 로그인 선호 |
40
+ | 경쟁사 분석 | 내부 문서 | Notion, Linear 초기 소셜만 지원 |
41
+ | 보안 가이드 | OWASP | 비밀번호 관리 복잡성 경고 |
42
+ | 팀 논의 | Slack #product 01/14 | CEO, CTO 합의 |
43
+
44
+ ---
45
+
46
+ ## 대안 검토 (Alternatives Considered)
47
+
48
+ ### 대안 1: 이메일/비밀번호만
49
+ - **장점**: 소셜 계정 없는 사용자 커버
50
+ - **단점**: 보안 구현 복잡, 비밀번호 재설정 필요
51
+ - **탈락 이유**: MVP 일정 초과, 보안 리스크
52
+
53
+ ### 대안 2: 소셜 + 이메일 둘 다
54
+ - **장점**: 모든 사용자 커버
55
+ - **단점**: 개발 기간 2배, 계정 연동 이슈
56
+ - **탈락 이유**: MVP 범위 초과
57
+
58
+ ### 비교 요약
59
+ | 기준 | 소셜만 ✅ | 이메일만 | 둘 다 |
60
+ |-----|---------|--------|------|
61
+ | 개발 기간 | ⭐⭐⭐ (3일) | ⭐⭐ (2주) | ⭐ (3주) |
62
+ | 보안 | ⭐⭐⭐ | ⭐ | ⭐⭐ |
63
+ | 사용자 커버리지 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
64
+ | UX | ⭐⭐⭐ | ⭐ | ⭐⭐ |
65
+
66
+ ---
67
+
68
+ ## 결과 (Consequences)
69
+
70
+ ### 긍정적 결과
71
+ - 인증 구현 3일 완료
72
+ - 비밀번호 관련 보안 이슈 원천 차단
73
+ - 가입 전환율 예상치 상회
74
+
75
+ ### 부정적 결과 / 트레이드오프
76
+ - 소셜 계정 없는 사용자 이탈 (예상 3-5%)
77
+ - Google/Apple 장애 시 로그인 불가
78
+ - B2B 확장 시 기업 SSO 추가 필요
79
+
80
+ ### 영향받는 영역
81
+ - **코드**: `src/auth/`, `src/middleware/`
82
+ - **문서**: [service-spec.md#auth](../service-spec.md#auth)
83
+ - **팀**: Backend, Frontend
84
+
85
+ ---
86
+
87
+ ## 구현 가이드 (Implementation Notes)
88
+
89
+ ```typescript
90
+ // OAuth 프로바이더 설정
91
+ const authProviders = ['google', 'apple'] as const;
92
+
93
+ // 이메일/비밀번호 엔드포인트는 구현하지 않음
94
+ // POST /auth/register ❌
95
+ // POST /auth/login ❌
96
+ // POST /auth/forgot-password ❌
97
+ ```
98
+
99
+ **v1.1 고려사항:**
100
+ - 이메일 로그인 추가 시 기존 소셜 계정과 연동 로직 필요
101
+ - Magic Link 방식 검토 (비밀번호 없는 이메일 로그인)
102
+
103
+ ---
104
+
105
+ ## 관련 문서 (Related)
106
+ - **SSOT**: [service-spec.md#auth](../service-spec.md#auth)
107
+ - **이슈**: [JIRA-AUTH-001](링크)
108
+
109
+ ---
110
+
111
+ ## 변경 이력
112
+ | 날짜 | 변경 내용 | 작성자 |
113
+ |-----|---------|-------|
114
+ | 2026-01-15 | 최초 작성 | @planner |
115
+ | 2026-01-16 | 승인 | @leader |
@@ -0,0 +1,132 @@
1
+ # {PROJECT_NAME} 데이터 설계서
2
+
3
+ **Version**: 1.0
4
+ **Created**: {DATE}
5
+ **Database**: PostgreSQL / MySQL / MongoDB
6
+
7
+ ---
8
+
9
+ ## 1. ERD
10
+
11
+ ```
12
+ ┌─────────────────┐ ┌─────────────────┐
13
+ │ users │ │ posts │
14
+ ├─────────────────┤ ├─────────────────┤
15
+ │ id (PK) │───┐ │ id (PK) │
16
+ │ email │ │ │ user_id (FK) │──┐
17
+ │ name │ └──▶│ title │ │
18
+ │ password_hash │ │ content │ │
19
+ │ created_at │ │ created_at │ │
20
+ │ updated_at │ │ updated_at │ │
21
+ └─────────────────┘ └─────────────────┘ │
22
+
23
+ ┌─────────────────┐ │
24
+ │ comments │ │
25
+ ├─────────────────┤ │
26
+ │ id (PK) │ │
27
+ │ post_id (FK) │◀─┘
28
+ │ user_id (FK) │
29
+ │ content │
30
+ │ created_at │
31
+ └─────────────────┘
32
+ ```
33
+
34
+ ---
35
+
36
+ ## 2. 테이블 정의
37
+
38
+ ### 2.1 users
39
+
40
+ 사용자 정보를 저장하는 테이블.
41
+
42
+ | Column | Type | Nullable | Default | Description |
43
+ |--------|------|:--------:|---------|-------------|
44
+ | id | UUID | NO | gen_random_uuid() | PK |
45
+ | email | VARCHAR(255) | NO | | 이메일 (UNIQUE) |
46
+ | name | VARCHAR(100) | NO | | 이름 |
47
+ | password_hash | VARCHAR(255) | NO | | 암호화된 비밀번호 |
48
+ | status | VARCHAR(20) | NO | 'active' | active, inactive, suspended |
49
+ | created_at | TIMESTAMP | NO | now() | 생성일 |
50
+ | updated_at | TIMESTAMP | NO | now() | 수정일 |
51
+
52
+ **Indexes:**
53
+ | Name | Columns | Type | Description |
54
+ |------|---------|------|-------------|
55
+ | users_pkey | id | PK | |
56
+ | users_email_unique | email | UNIQUE | 이메일 중복 방지 |
57
+ | users_status_idx | status | INDEX | 상태 조회용 |
58
+
59
+ ---
60
+
61
+ ### 2.2 [table_name]
62
+
63
+ [테이블 설명]
64
+
65
+ | Column | Type | Nullable | Default | Description |
66
+ |--------|------|:--------:|---------|-------------|
67
+ | | | | | |
68
+
69
+ **Indexes:**
70
+ | Name | Columns | Type | Description |
71
+ |------|---------|------|-------------|
72
+ | | | | |
73
+
74
+ **Foreign Keys:**
75
+ | Column | References | On Delete | On Update |
76
+ |--------|------------|-----------|-----------|
77
+ | | | | |
78
+
79
+ ---
80
+
81
+ ## 3. ENUM 정의
82
+
83
+ ### 3.1 user_status
84
+
85
+ | Value | Description |
86
+ |-------|-------------|
87
+ | active | 활성 |
88
+ | inactive | 비활성 |
89
+ | suspended | 정지 |
90
+
91
+ ---
92
+
93
+ ## 4. 데이터 마이그레이션
94
+
95
+ ### 4.1 초기 데이터
96
+
97
+ ```sql
98
+ -- Admin 사용자
99
+ INSERT INTO users (email, name, password_hash, status)
100
+ VALUES ('admin@example.com', 'Admin', '$2b$...', 'active');
101
+ ```
102
+
103
+ ### 4.2 마이그레이션 이력
104
+
105
+ | Version | Date | Description |
106
+ |---------|------|-------------|
107
+ | 001 | {DATE} | 초기 스키마 생성 |
108
+
109
+ ---
110
+
111
+ ## 5. 백업 및 복구
112
+
113
+ ### 5.1 백업 정책
114
+
115
+ | 유형 | 주기 | 보존 기간 |
116
+ |-----|-----|----------|
117
+ | Full Backup | 일 1회 | 30일 |
118
+ | Incremental | 시간 1회 | 7일 |
119
+
120
+ ### 5.2 복구 절차
121
+
122
+ 1.
123
+ 2.
124
+ 3.
125
+
126
+ ---
127
+
128
+ ## 6. 변경 이력
129
+
130
+ | 버전 | 날짜 | 변경 내용 | 작성자 |
131
+ |-----|-----|----------|-------|
132
+ | 1.0 | {DATE} | 최초 작성 | |