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.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/bin/tsq.js +6 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +142 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/full.d.ts +3 -0
- package/dist/commands/full.d.ts.map +1 -0
- package/dist/commands/full.js +87 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/git/commit.d.ts +3 -0
- package/dist/commands/git/commit.d.ts.map +1 -0
- package/dist/commands/git/commit.js +88 -0
- package/dist/commands/git/commit.js.map +1 -0
- package/dist/commands/git/index.d.ts +5 -0
- package/dist/commands/git/index.d.ts.map +1 -0
- package/dist/commands/git/index.js +5 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/pr.d.ts +3 -0
- package/dist/commands/git/pr.d.ts.map +1 -0
- package/dist/commands/git/pr.js +138 -0
- package/dist/commands/git/pr.js.map +1 -0
- package/dist/commands/git/release.d.ts +3 -0
- package/dist/commands/git/release.d.ts.map +1 -0
- package/dist/commands/git/release.js +158 -0
- package/dist/commands/git/release.js.map +1 -0
- package/dist/commands/git/sync.d.ts +3 -0
- package/dist/commands/git/sync.d.ts.map +1 -0
- package/dist/commands/git/sync.js +132 -0
- package/dist/commands/git/sync.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +271 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/metrics.d.ts +3 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +299 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/quick.d.ts +3 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +136 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/retro.d.ts +3 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +280 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +213 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +108 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/project.d.ts +47 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +191 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/template.d.ts +33 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +151 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/config.d.ts +75 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/feedback.d.ts +59 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +26 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +89 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +44 -0
- package/dist/types/project.js.map +1 -0
- package/dist/utils/colors.d.ts +30 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +54 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/date.d.ts +25 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +65 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/fs.d.ts +49 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +84 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompts.d.ts +31 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +95 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/yaml.d.ts +21 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +40 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +71 -0
- package/templates/common/CLAUDE.md.template +254 -0
- package/templates/common/claude/agents/tsq-dba.md +290 -0
- package/templates/common/claude/agents/tsq-designer.md +304 -0
- package/templates/common/claude/agents/tsq-developer.md +118 -0
- package/templates/common/claude/agents/tsq-planner.md +90 -0
- package/templates/common/claude/agents/tsq-prompter.md +336 -0
- package/templates/common/claude/agents/tsq-qa.md +134 -0
- package/templates/common/claude/agents/tsq-retro.md +168 -0
- package/templates/common/claude/agents/tsq-security.md +190 -0
- package/templates/common/claude/skills/architecture/SKILL.md +123 -0
- package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
- package/templates/common/claude/skills/coding/SKILL.md +171 -0
- package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
- package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
- package/templates/common/claude/skills/planning/SKILL.md +90 -0
- package/templates/common/claude/skills/security/SKILL.md +234 -0
- package/templates/common/claude/skills/testing/SKILL.md +146 -0
- package/templates/common/claude/skills/typescript/SKILL.md +435 -0
- package/templates/common/config.template.yaml +131 -0
- package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
- package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
- package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
- package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
- package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
- package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
- package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
- package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
- package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
- package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
- package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
- package/templates/common/timsquad/generators/data-design.xml +290 -0
- package/templates/common/timsquad/generators/prd.xml +280 -0
- package/templates/common/timsquad/generators/requirements.xml +220 -0
- package/templates/common/timsquad/generators/service-spec.xml +266 -0
- package/templates/common/timsquad/logs/_example.md +81 -0
- package/templates/common/timsquad/logs/_template.md +46 -0
- package/templates/common/timsquad/patterns/cqrs.xml +127 -0
- package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
- package/templates/common/timsquad/patterns/repository.xml +64 -0
- package/templates/common/timsquad/process/state-machine.xml +343 -0
- package/templates/common/timsquad/process/validation-rules.xml +308 -0
- package/templates/common/timsquad/process/workflow-base.xml +202 -0
- package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
- package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
- package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
- package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
- package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
- package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
- package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
- package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
- package/templates/common/timsquad/ssot/data-design.template.md +132 -0
- package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
- package/templates/common/timsquad/ssot/env-config.template.md +346 -0
- package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
- package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
- package/templates/common/timsquad/ssot/glossary.template.md +148 -0
- package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
- package/templates/common/timsquad/ssot/planning.template.md +94 -0
- package/templates/common/timsquad/ssot/prd.template.md +102 -0
- package/templates/common/timsquad/ssot/requirements.template.md +117 -0
- package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
- package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
- package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
- package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
- 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>< 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} | 최초 작성 | |
|