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,220 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
TimSquad Requirements Generator v1.0
|
|
4
|
+
PRD๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ธ ์๊ตฌ์ฌํญ์ ์ ์ํฉ๋๋ค.
|
|
5
|
+
-->
|
|
6
|
+
<generator name="requirements" version="1.0" output=".timsquad/ssot/requirements.md">
|
|
7
|
+
<metadata>
|
|
8
|
+
<description>์๊ตฌ์ฌํญ ์ ์์ ์์ฑ๊ธฐ</description>
|
|
9
|
+
<purpose>PRD์ ๊ธฐ๋ฅ์ ์์ธ ์๊ตฌ์ฌํญ์ผ๋ก ๋ถํด</purpose>
|
|
10
|
+
<depends-on>prd.md</depends-on>
|
|
11
|
+
</metadata>
|
|
12
|
+
|
|
13
|
+
<instructions>
|
|
14
|
+
<![CDATA[
|
|
15
|
+
PRD๋ฅผ ๋จผ์ ์ฝ๊ณ , ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์์ธ ์๊ตฌ์ฌํญ์ ์ ์ํฉ๋๋ค.
|
|
16
|
+
|
|
17
|
+
1. prd.md์์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ฝ์ด์ต๋๋ค
|
|
18
|
+
2. ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์ ์ ์คํ ๋ฆฌ์ ์์ธ ์๊ตฌ์ฌํญ์ ์ง๋ฌธํฉ๋๋ค
|
|
19
|
+
3. ๋น๊ธฐ๋ฅ ์๊ตฌ์ฌํญ(์ฑ๋ฅ, ๋ณด์ ๋ฑ)๋ ์ ์ํฉ๋๋ค
|
|
20
|
+
|
|
21
|
+
์ ์ ์์น:
|
|
22
|
+
- ์ ์ ์คํ ๋ฆฌ: "~๋ก์, ~ํ๊ณ ์ถ๋ค, ~ํ๊ธฐ ์ํด" ํ์
|
|
23
|
+
- ์๊ตฌ์ฌํญ: "์์คํ
์ ~ํด์ผ ํ๋ค" ํ์
|
|
24
|
+
- ํ
์คํธ ๊ฐ๋ฅํ ์์ค์ผ๋ก ๊ตฌ์ฒดํ
|
|
25
|
+
]]>
|
|
26
|
+
</instructions>
|
|
27
|
+
|
|
28
|
+
<!-- ============================================================
|
|
29
|
+
์น์
1: PRD ์ฐธ์กฐ
|
|
30
|
+
============================================================ -->
|
|
31
|
+
<section id="prd_ref" title="PRD ์ฐธ์กฐ" auto-load="true">
|
|
32
|
+
<source>.timsquad/ssot/prd.md</source>
|
|
33
|
+
<extract>
|
|
34
|
+
<field name="features" from="## 2. ํต์ฌ ๊ธฐ๋ฅ" />
|
|
35
|
+
<field name="target_user" from="ํ๊ฒ ์ฌ์ฉ์" />
|
|
36
|
+
</extract>
|
|
37
|
+
</section>
|
|
38
|
+
|
|
39
|
+
<!-- ============================================================
|
|
40
|
+
์น์
2: ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ (๊ธฐ๋ฅ๋ณ ๋ฐ๋ณต)
|
|
41
|
+
============================================================ -->
|
|
42
|
+
<section id="functional" title="๊ธฐ๋ฅ ์๊ตฌ์ฌํญ" repeatable="true" iterate-from="prd_ref.features">
|
|
43
|
+
<context>
|
|
44
|
+
ํ์ฌ ๊ธฐ๋ฅ: {{current_feature.name}}
|
|
45
|
+
์ค๋ช
: {{current_feature.description}}
|
|
46
|
+
</context>
|
|
47
|
+
|
|
48
|
+
<field name="user_story" type="text" required="true">
|
|
49
|
+
<prompt>"{{current_feature.name}}" ๊ธฐ๋ฅ์ ์ ์ ์คํ ๋ฆฌ๋ฅผ ๋งํด์ฃผ์ธ์</prompt>
|
|
50
|
+
<hint>์: ์ฌ์ฉ์๋ก์, ์ค๋ ฅ ๋ง๋ ์๋๋ฅผ ์ฐพ๊ณ ์ถ๋ค</hint>
|
|
51
|
+
<refinement>
|
|
52
|
+
"{{prd_ref.target_user}}๋ก์, ~ํ๊ณ ์ถ๋ค, ~ํ๊ธฐ ์ํด" ํ์์ผ๋ก ์ ์
|
|
53
|
+
</refinement>
|
|
54
|
+
</field>
|
|
55
|
+
|
|
56
|
+
<field name="acceptance_criteria" type="list" required="true">
|
|
57
|
+
<prompt>์ด ๊ธฐ๋ฅ์ด ์๋ฃ๋์๋ค๊ณ ํ ์ ์๋ ์กฐ๊ฑด์? (์ฌ๋ฌ ๊ฐ ์
๋ ฅ, ๋น ์ค๋ก ์ข
๋ฃ)</prompt>
|
|
58
|
+
<hint>
|
|
59
|
+
- ๋งค์นญ ์์ฒญ ์ 3์ด ๋ด ๊ฒฐ๊ณผ ํ์
|
|
60
|
+
- ์ต์ 3๋ช
์ ์ถ์ฒ ์๋ ํ์
|
|
61
|
+
</hint>
|
|
62
|
+
<refinement>
|
|
63
|
+
- "~ํ ์ ์๋ค", "~๋๋ค" ํ์
|
|
64
|
+
- ์ธก์ ๊ฐ๋ฅํ ๊ธฐ์ค ํฌํจ
|
|
65
|
+
</refinement>
|
|
66
|
+
</field>
|
|
67
|
+
|
|
68
|
+
<field name="edge_cases" type="list" required="false">
|
|
69
|
+
<prompt>์์ธ ์ํฉ์ด๋ ์ฃ์ง ์ผ์ด์ค๊ฐ ์๋์?</prompt>
|
|
70
|
+
<hint>
|
|
71
|
+
- ๋งค์นญ ์๋๊ฐ ์๋ ๊ฒฝ์ฐ
|
|
72
|
+
- ๋์์ ์ฌ๋ฌ ์์ฒญ์ด ์จ ๊ฒฝ์ฐ
|
|
73
|
+
</hint>
|
|
74
|
+
</field>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
<!-- ============================================================
|
|
78
|
+
์น์
3: ๋น๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
|
|
79
|
+
============================================================ -->
|
|
80
|
+
<section id="non_functional" title="๋น๊ธฐ๋ฅ ์๊ตฌ์ฌํญ">
|
|
81
|
+
<field name="performance" type="text" required="false">
|
|
82
|
+
<prompt>์ฑ๋ฅ ์๊ตฌ์ฌํญ์ด ์๋์? (์๋ต ์๊ฐ, ๋์ ์ฌ์ฉ์ ๋ฑ)</prompt>
|
|
83
|
+
<example>API ์๋ต ์๊ฐ 500ms ์ด๋ด, ๋์ ์ ์ 1,000๋ช
์ง์</example>
|
|
84
|
+
<default>API ์๋ต ์๊ฐ 1์ด ์ด๋ด</default>
|
|
85
|
+
</field>
|
|
86
|
+
|
|
87
|
+
<field name="security" type="list" required="false">
|
|
88
|
+
<prompt>๋ณด์ ์๊ตฌ์ฌํญ์ด ์๋์?</prompt>
|
|
89
|
+
<example>
|
|
90
|
+
- ๊ฐ์ธ์ ๋ณด ์ํธํ ์ ์ฅ
|
|
91
|
+
- JWT ๊ธฐ๋ฐ ์ธ์ฆ
|
|
92
|
+
</example>
|
|
93
|
+
<default>
|
|
94
|
+
- HTTPS ํ์
|
|
95
|
+
- ๋น๋ฐ๋ฒํธ ํด์ ์ ์ฅ
|
|
96
|
+
- JWT ์ธ์ฆ
|
|
97
|
+
</default>
|
|
98
|
+
</field>
|
|
99
|
+
|
|
100
|
+
<field name="availability" type="text" required="false">
|
|
101
|
+
<prompt>๊ฐ์ฉ์ฑ ์๊ตฌ์ฌํญ? (์: 99.9% uptime)</prompt>
|
|
102
|
+
<default>99% uptime (MVP ๊ธฐ์ค)</default>
|
|
103
|
+
</field>
|
|
104
|
+
|
|
105
|
+
<field name="scalability" type="text" required="false">
|
|
106
|
+
<prompt>ํ์ฅ์ฑ ์๊ตฌ์ฌํญ?</prompt>
|
|
107
|
+
<default>์ํ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ</default>
|
|
108
|
+
</field>
|
|
109
|
+
</section>
|
|
110
|
+
|
|
111
|
+
<!-- ============================================================
|
|
112
|
+
์น์
4: ์ ์ฝ์ฌํญ
|
|
113
|
+
============================================================ -->
|
|
114
|
+
<section id="constraints" title="์ ์ฝ์ฌํญ">
|
|
115
|
+
<field name="tech_constraints" type="list" required="false">
|
|
116
|
+
<prompt>๊ธฐ์ ์ ์ ์ฝ์ฌํญ์ด ์๋์?</prompt>
|
|
117
|
+
<example>
|
|
118
|
+
- iOS/Android ์ฑ ์์ (์น ์ ์ฉ)
|
|
119
|
+
- ์ค์๊ฐ ๊ธฐ๋ฅ์ Supabase Realtime ์ฌ์ฉ
|
|
120
|
+
</example>
|
|
121
|
+
</field>
|
|
122
|
+
|
|
123
|
+
<field name="business_constraints" type="list" required="false">
|
|
124
|
+
<prompt>๋น์ฆ๋์ค ์ ์ฝ์ฌํญ์ด ์๋์?</prompt>
|
|
125
|
+
<example>
|
|
126
|
+
- MVP๋ ์ฑ๊ฐํด ์ง์ญ๋ง
|
|
127
|
+
- ์ด๊ธฐ ๋ฌด๋ฃ, ์ถํ ํ๋ฆฌ๋ฏธ์ ๋ชจ๋ธ
|
|
128
|
+
</example>
|
|
129
|
+
</field>
|
|
130
|
+
</section>
|
|
131
|
+
|
|
132
|
+
<!-- ============================================================
|
|
133
|
+
์ถ๋ ฅ ํ
ํ๋ฆฟ
|
|
134
|
+
============================================================ -->
|
|
135
|
+
<output-template>
|
|
136
|
+
<
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 1. ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
|
|
146
|
+
|
|
147
|
+
{{#each functional}}
|
|
148
|
+
### 1.{{@index + 1}} {{feature_name}}
|
|
149
|
+
|
|
150
|
+
**์ ์ ์คํ ๋ฆฌ:**
|
|
151
|
+
> {{user_story}}
|
|
152
|
+
|
|
153
|
+
**์ธ์ ์กฐ๊ฑด:**
|
|
154
|
+
{{#each acceptance_criteria}}
|
|
155
|
+
- [ ] {{this}}
|
|
156
|
+
{{/each}}
|
|
157
|
+
|
|
158
|
+
{{#if edge_cases}}
|
|
159
|
+
**์ฃ์ง ์ผ์ด์ค:**
|
|
160
|
+
{{#each edge_cases}}
|
|
161
|
+
- {{this}}
|
|
162
|
+
{{/each}}
|
|
163
|
+
{{/if}}
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
{{/each}}
|
|
168
|
+
|
|
169
|
+
## 2. ๋น๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
|
|
170
|
+
|
|
171
|
+
### 2.1 ์ฑ๋ฅ
|
|
172
|
+
{{non_functional.performance}}
|
|
173
|
+
|
|
174
|
+
### 2.2 ๋ณด์
|
|
175
|
+
{{#each non_functional.security}}
|
|
176
|
+
- {{this}}
|
|
177
|
+
{{/each}}
|
|
178
|
+
|
|
179
|
+
### 2.3 ๊ฐ์ฉ์ฑ
|
|
180
|
+
{{non_functional.availability}}
|
|
181
|
+
|
|
182
|
+
### 2.4 ํ์ฅ์ฑ
|
|
183
|
+
{{non_functional.scalability}}
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 3. ์ ์ฝ์ฌํญ
|
|
188
|
+
|
|
189
|
+
### 3.1 ๊ธฐ์ ์ ์ ์ฝ
|
|
190
|
+
{{#each constraints.tech_constraints}}
|
|
191
|
+
- {{this}}
|
|
192
|
+
{{/each}}
|
|
193
|
+
{{#unless constraints.tech_constraints}}
|
|
194
|
+
- (์์)
|
|
195
|
+
{{/unless}}
|
|
196
|
+
|
|
197
|
+
### 3.2 ๋น์ฆ๋์ค ์ ์ฝ
|
|
198
|
+
{{#each constraints.business_constraints}}
|
|
199
|
+
- {{this}}
|
|
200
|
+
{{/each}}
|
|
201
|
+
{{#unless constraints.business_constraints}}
|
|
202
|
+
- (์์)
|
|
203
|
+
{{/unless}}
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 4. ์๊ตฌ์ฌํญ ์ถ์ ๋งคํธ๋ฆญ์ค
|
|
208
|
+
|
|
209
|
+
| ID | ๊ธฐ๋ฅ | ์ฐ์ ์์ | ์ํ |
|
|
210
|
+
|----|-----|:-------:|:----:|
|
|
211
|
+
{{#each functional}}
|
|
212
|
+
| REQ-{{@index + 1 | pad:3}} | {{feature_name}} | {{priority}} | โฌ |
|
|
213
|
+
{{/each}}
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
*Generated by TimSquad v2.0*
|
|
218
|
+
]]>
|
|
219
|
+
</output-template>
|
|
220
|
+
</generator>
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
TimSquad Service Spec Generator v1.0
|
|
4
|
+
API ๋ช
์ธ์๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ก ํธ์๋-๋ฐฑ์๋ ๊ณ์ฝ์ ์ญํ .
|
|
5
|
+
-->
|
|
6
|
+
<generator name="service-spec" version="1.0" output=".timsquad/ssot/service-spec.md">
|
|
7
|
+
<metadata>
|
|
8
|
+
<description>์๋น์ค ๋ช
์ธ์ (API Specification) ์์ฑ๊ธฐ</description>
|
|
9
|
+
<purpose>ํ๋ก ํธ์๋-๋ฐฑ์๋ ๊ฐ API ๊ณ์ฝ ์ ์</purpose>
|
|
10
|
+
<depends-on>prd.md, requirements.md</depends-on>
|
|
11
|
+
</metadata>
|
|
12
|
+
|
|
13
|
+
<instructions>
|
|
14
|
+
<![CDATA[
|
|
15
|
+
PRD์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๊ธฐ๋ฐ์ผ๋ก API ์๋ํฌ์ธํธ๋ฅผ ์ ์ํฉ๋๋ค.
|
|
16
|
+
|
|
17
|
+
1. ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ํ์ํ API ์๋ํฌ์ธํธ๋ฅผ ๋์ถ
|
|
18
|
+
2. HTTP ๋ฉ์๋, URL, Request/Response ์คํค๋ง ์ ์
|
|
19
|
+
3. ์๋ฌ ์ฝ๋๋ error-codes.md์ ์ฐ๋
|
|
20
|
+
|
|
21
|
+
์ ์ ์์น:
|
|
22
|
+
- RESTful ์ปจ๋ฒค์
์ค์
|
|
23
|
+
- URL: ์๋ฌธ์, ๋ณต์ํ ๋ช
์ฌ (/users, /matches)
|
|
24
|
+
- ์๋ต: { success, data, error } ํต์ผ ํ์
|
|
25
|
+
]]>
|
|
26
|
+
</instructions>
|
|
27
|
+
|
|
28
|
+
<!-- ============================================================
|
|
29
|
+
์น์
1: API ๊ทธ๋ฃน ์ ์
|
|
30
|
+
============================================================ -->
|
|
31
|
+
<section id="api_groups" title="API ๊ทธ๋ฃน" repeatable="true">
|
|
32
|
+
<instructions>
|
|
33
|
+
๊ธฐ๋ฅ ๋จ์๋ก API๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค.
|
|
34
|
+
์: Auth, Users, Matches, Messages
|
|
35
|
+
</instructions>
|
|
36
|
+
|
|
37
|
+
<field name="group_name" type="text" required="true">
|
|
38
|
+
<prompt>API ๊ทธ๋ฃน ์ด๋ฆ? (์: Auth, Users, Matches)</prompt>
|
|
39
|
+
<refinement>์๋ฌธ ๋๋ฌธ์ ์์, ๋จ์/๋ณต์ ์ผ๊ด์ฑ</refinement>
|
|
40
|
+
</field>
|
|
41
|
+
|
|
42
|
+
<field name="base_path" type="text" required="true">
|
|
43
|
+
<prompt>๊ธฐ๋ณธ ๊ฒฝ๋ก? (์: /api/v1/auth)</prompt>
|
|
44
|
+
<auto-suggest>/api/v1/{{group_name | lowercase}}</auto-suggest>
|
|
45
|
+
<refinement>์๋ฌธ์, ๋ณต์ํ</refinement>
|
|
46
|
+
</field>
|
|
47
|
+
|
|
48
|
+
<field name="description" type="text" required="false">
|
|
49
|
+
<prompt>์ด ๊ทธ๋ฃน์ ์ญํ ?</prompt>
|
|
50
|
+
</field>
|
|
51
|
+
</section>
|
|
52
|
+
|
|
53
|
+
<!-- ============================================================
|
|
54
|
+
์น์
2: ์๋ํฌ์ธํธ ์ ์ (๊ทธ๋ฃน๋ณ ๋ฐ๋ณต)
|
|
55
|
+
============================================================ -->
|
|
56
|
+
<section id="endpoints" title="์๋ํฌ์ธํธ" repeatable="true" parent="api_groups">
|
|
57
|
+
<context>ํ์ฌ ๊ทธ๋ฃน: {{current_group.group_name}}</context>
|
|
58
|
+
|
|
59
|
+
<field name="name" type="text" required="true">
|
|
60
|
+
<prompt>์๋ํฌ์ธํธ ์ด๋ฆ? (์: Login, GetProfile)</prompt>
|
|
61
|
+
</field>
|
|
62
|
+
|
|
63
|
+
<field name="method" type="select" required="true">
|
|
64
|
+
<prompt>HTTP ๋ฉ์๋?</prompt>
|
|
65
|
+
<options>
|
|
66
|
+
<option value="GET">GET - ์กฐํ</option>
|
|
67
|
+
<option value="POST">POST - ์์ฑ</option>
|
|
68
|
+
<option value="PUT">PUT - ์ ์ฒด ์์ </option>
|
|
69
|
+
<option value="PATCH">PATCH - ๋ถ๋ถ ์์ </option>
|
|
70
|
+
<option value="DELETE">DELETE - ์ญ์ </option>
|
|
71
|
+
</options>
|
|
72
|
+
</field>
|
|
73
|
+
|
|
74
|
+
<field name="path" type="text" required="true">
|
|
75
|
+
<prompt>๊ฒฝ๋ก? (์: /login, /:id)</prompt>
|
|
76
|
+
<refinement>
|
|
77
|
+
- ํ๋ผ๋ฏธํฐ๋ :id ํ์
|
|
78
|
+
- ์๋ฌธ์, ํ์ดํ ๊ตฌ๋ถ
|
|
79
|
+
</refinement>
|
|
80
|
+
</field>
|
|
81
|
+
|
|
82
|
+
<field name="description" type="text" required="true">
|
|
83
|
+
<prompt>์ด API์ ์ญํ ?</prompt>
|
|
84
|
+
</field>
|
|
85
|
+
|
|
86
|
+
<field name="auth_required" type="boolean" required="true">
|
|
87
|
+
<prompt>์ธ์ฆ ํ์? (y/n)</prompt>
|
|
88
|
+
<default>true</default>
|
|
89
|
+
</field>
|
|
90
|
+
|
|
91
|
+
<field name="request_body" type="schema" required="false">
|
|
92
|
+
<prompt>Request Body ํ๋? (ํ๋๋ช
:ํ์
ํ์, ์ฌ๋ฌ ์ค)</prompt>
|
|
93
|
+
<hint>
|
|
94
|
+
email:string
|
|
95
|
+
password:string
|
|
96
|
+
</hint>
|
|
97
|
+
<skip-if method="GET|DELETE" />
|
|
98
|
+
</field>
|
|
99
|
+
|
|
100
|
+
<field name="response_data" type="schema" required="true">
|
|
101
|
+
<prompt>Response data ํ๋?</prompt>
|
|
102
|
+
<hint>
|
|
103
|
+
user:object
|
|
104
|
+
token:string
|
|
105
|
+
</hint>
|
|
106
|
+
</field>
|
|
107
|
+
|
|
108
|
+
<field name="errors" type="list" required="false">
|
|
109
|
+
<prompt>๋ฐ์ ๊ฐ๋ฅํ ์๋ฌ ์ฝ๋? (์: AUTH_001, AUTH_002)</prompt>
|
|
110
|
+
<link-to>error-codes.md</link-to>
|
|
111
|
+
</field>
|
|
112
|
+
</section>
|
|
113
|
+
|
|
114
|
+
<!-- ============================================================
|
|
115
|
+
์น์
3: ๊ณตํต ์ ์
|
|
116
|
+
============================================================ -->
|
|
117
|
+
<section id="common" title="๊ณตํต ์ ์">
|
|
118
|
+
<field name="base_url" type="text" required="true">
|
|
119
|
+
<prompt>API Base URL?</prompt>
|
|
120
|
+
<default>https://api.{{project_name}}.com</default>
|
|
121
|
+
</field>
|
|
122
|
+
|
|
123
|
+
<field name="version" type="text" required="true">
|
|
124
|
+
<prompt>API ๋ฒ์ ?</prompt>
|
|
125
|
+
<default>v1</default>
|
|
126
|
+
</field>
|
|
127
|
+
|
|
128
|
+
<field name="auth_method" type="select" required="true">
|
|
129
|
+
<prompt>์ธ์ฆ ๋ฐฉ์?</prompt>
|
|
130
|
+
<options>
|
|
131
|
+
<option value="jwt">JWT Bearer Token</option>
|
|
132
|
+
<option value="session">Session Cookie</option>
|
|
133
|
+
<option value="api_key">API Key</option>
|
|
134
|
+
</options>
|
|
135
|
+
<default>jwt</default>
|
|
136
|
+
</field>
|
|
137
|
+
</section>
|
|
138
|
+
|
|
139
|
+
<!-- ============================================================
|
|
140
|
+
์ถ๋ ฅ ํ
ํ๋ฆฟ
|
|
141
|
+
============================================================ -->
|
|
142
|
+
<output-template>
|
|
143
|
+
<![CDATA[
|
|
144
|
+
# {{project_name}} ์๋น์ค ๋ช
์ธ์
|
|
145
|
+
|
|
146
|
+
**์์ฑ์ผ**: {{DATE}}
|
|
147
|
+
**๋ฒ์ **: {{common.version}}
|
|
148
|
+
**Base URL**: `{{common.base_url}}/{{common.version}}`
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## ๊ณตํต ์ฌํญ
|
|
153
|
+
|
|
154
|
+
### ์ธ์ฆ
|
|
155
|
+
- ๋ฐฉ์: {{common.auth_method | upper}}
|
|
156
|
+
{{#if common.auth_method == "jwt"}}
|
|
157
|
+
- Header: `Authorization: Bearer <token>`
|
|
158
|
+
{{/if}}
|
|
159
|
+
|
|
160
|
+
### ์๋ต ํ์
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"success": true,
|
|
164
|
+
"data": { ... },
|
|
165
|
+
"error": null
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### ์๋ฌ ์๋ต
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"success": false,
|
|
173
|
+
"data": null,
|
|
174
|
+
"error": {
|
|
175
|
+
"code": "ERROR_CODE",
|
|
176
|
+
"message": "์๋ฌ ๋ฉ์์ง"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
{{#each api_groups}}
|
|
184
|
+
## {{@index + 1}}. {{group_name}}
|
|
185
|
+
|
|
186
|
+
> {{description}}
|
|
187
|
+
|
|
188
|
+
Base Path: `{{base_path}}`
|
|
189
|
+
|
|
190
|
+
{{#each endpoints where group=group_name}}
|
|
191
|
+
### {{@index + 1}}.{{@parent_index + 1}} {{name}}
|
|
192
|
+
|
|
193
|
+
| ํญ๋ชฉ | ๊ฐ |
|
|
194
|
+
|-----|---|
|
|
195
|
+
| **URL** | `{{method}} {{../base_path}}{{path}}` |
|
|
196
|
+
| **์ค๋ช
** | {{description}} |
|
|
197
|
+
| **์ธ์ฆ** | {{#if auth_required}}ํ์{{else}}๋ถํ์{{/if}} |
|
|
198
|
+
|
|
199
|
+
{{#if request_body}}
|
|
200
|
+
#### Request Body
|
|
201
|
+
|
|
202
|
+
| Field | Type | Required | Description |
|
|
203
|
+
|-------|------|:--------:|-------------|
|
|
204
|
+
{{#each request_body}}
|
|
205
|
+
| {{name}} | {{type}} | {{#if required}}O{{else}}-{{/if}} | {{description}} |
|
|
206
|
+
{{/each}}
|
|
207
|
+
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
{{#each request_body}}
|
|
211
|
+
"{{name}}": {{example}}{{#unless @last}},{{/unless}}
|
|
212
|
+
{{/each}}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
{{/if}}
|
|
216
|
+
|
|
217
|
+
#### Response
|
|
218
|
+
|
|
219
|
+
| Field | Type | Description |
|
|
220
|
+
|-------|------|-------------|
|
|
221
|
+
{{#each response_data}}
|
|
222
|
+
| {{name}} | {{type}} | {{description}} |
|
|
223
|
+
{{/each}}
|
|
224
|
+
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"success": true,
|
|
228
|
+
"data": {
|
|
229
|
+
{{#each response_data}}
|
|
230
|
+
"{{name}}": {{example}}{{#unless @last}},{{/unless}}
|
|
231
|
+
{{/each}}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
{{#if errors}}
|
|
237
|
+
#### Errors
|
|
238
|
+
|
|
239
|
+
| Code | Description |
|
|
240
|
+
|------|-------------|
|
|
241
|
+
{{#each errors}}
|
|
242
|
+
| {{this}} | โ error-codes.md ์ฐธ์กฐ |
|
|
243
|
+
{{/each}}
|
|
244
|
+
{{/if}}
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
{{/each}}
|
|
249
|
+
{{/each}}
|
|
250
|
+
|
|
251
|
+
## API ๋ชฉ๋ก ์์ฝ
|
|
252
|
+
|
|
253
|
+
| Group | Method | Endpoint | Description | Auth |
|
|
254
|
+
|-------|--------|----------|-------------|:----:|
|
|
255
|
+
{{#each api_groups}}
|
|
256
|
+
{{#each endpoints where group=group_name}}
|
|
257
|
+
| {{../group_name}} | {{method}} | {{../base_path}}{{path}} | {{name}} | {{#if auth_required}}๐{{else}}-{{/if}} |
|
|
258
|
+
{{/each}}
|
|
259
|
+
{{/each}}
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
*Generated by TimSquad v2.0*
|
|
264
|
+
]]>
|
|
265
|
+
</output-template>
|
|
266
|
+
</generator>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# developer ์์
๋ก๊ทธ - 2026-02-02
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 15:30 | ์์
๋ก๊ทธ์ธ ์ฝ๋ฐฑ ์ฒ๋ฆฌ ๊ตฌํ
|
|
6
|
+
|
|
7
|
+
### What (์์
๋ด์ฉ)
|
|
8
|
+
- Google OAuth ์ฝ๋ฐฑ ํธ๋ค๋ฌ ๊ตฌํ
|
|
9
|
+
- Apple OAuth ์ฝ๋ฐฑ ํธ๋ค๋ฌ ๊ตฌํ
|
|
10
|
+
- ์ ๊ท ์ฌ์ฉ์ ์๋ ์์ฑ ๋ก์ง ์ถ๊ฐ
|
|
11
|
+
- JWT ํ ํฐ ๋ฐ๊ธ ๋ฐ ์ฟ ํค ์ค์
|
|
12
|
+
|
|
13
|
+
### Why (์์
์ด์ )
|
|
14
|
+
MVP ์ธ์ฆ ์์คํ
๊ตฌํ. ์์
๋ก๊ทธ์ธ๋ง ์ง์ํ๊ธฐ๋ก ๊ฒฐ์ ๋์ด Google/Apple OAuth๋ง ๊ตฌํ.
|
|
15
|
+
|
|
16
|
+
**๊ด๋ จ ๊ฒฐ์ :** [ADR-001 ์์
๋ก๊ทธ์ธ๋ง ์ง์](../ssot/adr/ADR-001-social-login-only.md)
|
|
17
|
+
|
|
18
|
+
### Reference (๊ทผ๊ฑฐ/์ฐธ์กฐ)
|
|
19
|
+
| ์ ํ | ๋งํฌ | ์ค๋ช
|
|
|
20
|
+
|-----|------|-----|
|
|
21
|
+
| SSOT | [service-spec.md#auth](../ssot/service-spec.md#auth) | ์ธ์ฆ API ๋ช
์ธ |
|
|
22
|
+
| ADR | [ADR-001](../ssot/adr/ADR-001.md) | ์์
๋ก๊ทธ์ธ๋ง ์ง์ ๊ฒฐ์ |
|
|
23
|
+
| ์ธ๋ถ | [Google OAuth ๋ฌธ์](https://developers.google.com/identity) | ๊ตฌํ ์ฐธ๊ณ |
|
|
24
|
+
| ์ธ๋ถ | [Apple Sign-in ๋ฌธ์](https://developer.apple.com/sign-in-with-apple/) | ๊ตฌํ ์ฐธ๊ณ |
|
|
25
|
+
|
|
26
|
+
### ๋ณ๊ฒฝ ํ์ผ
|
|
27
|
+
```
|
|
28
|
+
src/routes/auth/callback.ts (์ ๊ท)
|
|
29
|
+
src/services/oauth.service.ts (์ ๊ท)
|
|
30
|
+
src/services/user.service.ts (์์ - createFromOAuth ์ถ๊ฐ)
|
|
31
|
+
src/utils/jwt.ts (์์ - ์ฟ ํค ์ค์ ์ต์
์ถ๊ฐ)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### ๊ฒฐ๊ณผ
|
|
35
|
+
- โ
์ฑ๊ณต
|
|
36
|
+
- ํ
์คํธ: 8/8 ํต๊ณผ
|
|
37
|
+
- Google ๋ก๊ทธ์ธ E2E ํ์ธ ์๋ฃ
|
|
38
|
+
- Apple์ ์ค๊ธฐ๊ธฐ ํ
์คํธ ํ์
|
|
39
|
+
|
|
40
|
+
### ํ์ ์์
/ ํผ๋๋ฐฑ ์์ฒญ
|
|
41
|
+
- [ ] @qa Apple ๋ก๊ทธ์ธ ์ค๊ธฐ๊ธฐ ํ
์คํธ ์์ฒญ
|
|
42
|
+
- [ ] @frontend ์ฝ๋ฐฑ ํ ๋ฆฌ๋ค์ด๋ ํธ URL ํ์ ํ์
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 11:00 | ๋ก๊ทธ์ธ ๋ชจ๋ฌ ์ปดํฌ๋ํธ ๊ตฌํ
|
|
47
|
+
|
|
48
|
+
### What (์์
๋ด์ฉ)
|
|
49
|
+
- LoginModal ์ปดํฌ๋ํธ ์์ฑ
|
|
50
|
+
- Google/Apple ๋ก๊ทธ์ธ ๋ฒํผ ์ถ๊ฐ
|
|
51
|
+
- ๋ชจ๋ฌ ์ด๊ธฐ/๋ซ๊ธฐ ์ ๋๋ฉ์ด์
|
|
52
|
+
|
|
53
|
+
### Why (์์
์ด์ )
|
|
54
|
+
๋ก๊ทธ์ธ UI๋ฅผ ๋ณ๋ ํ์ด์ง๊ฐ ์๋ ๋ชจ๋ฌ๋ก ๊ตฌํ. ํ์ด์ง ์ด๋ ์์ด ๋น ๋ฅธ ๋ก๊ทธ์ธ ๊ฒฝํ ์ ๊ณต.
|
|
55
|
+
|
|
56
|
+
**๊ด๋ จ ๊ฒฐ์ :** [ADR-002 ๋ก๊ทธ์ธ ๋ชจ๋ฌ ๋ฐฉ์](../ssot/adr/ADR-002-login-modal.md)
|
|
57
|
+
|
|
58
|
+
### Reference (๊ทผ๊ฑฐ/์ฐธ์กฐ)
|
|
59
|
+
| ์ ํ | ๋งํฌ | ์ค๋ช
|
|
|
60
|
+
|-----|------|-----|
|
|
61
|
+
| SSOT | [ui-ux-spec.md#login-modal](../ssot/ui-ux-spec.md#login-modal) | ๋ชจ๋ฌ ๋์์ธ ๋ช
์ธ |
|
|
62
|
+
| ADR | [ADR-002](../ssot/adr/ADR-002.md) | ๋ชจ๋ฌ ๋ฐฉ์ ๊ฒฐ์ |
|
|
63
|
+
| ์ธ๋ถ | [Radix Dialog](https://radix-ui.com/docs/primitives/components/dialog) | ์ปดํฌ๋ํธ ์ฐธ๊ณ |
|
|
64
|
+
| ๋
ผ์ | Slack #design 02/01 | ์ ๋๋ฉ์ด์
๋ฐฉํฅ ๋
ผ์ |
|
|
65
|
+
|
|
66
|
+
### ๋ณ๊ฒฝ ํ์ผ
|
|
67
|
+
```
|
|
68
|
+
src/components/auth/LoginModal.tsx (์ ๊ท)
|
|
69
|
+
src/components/auth/SocialButton.tsx (์ ๊ท)
|
|
70
|
+
src/hooks/useLoginModal.ts (์ ๊ท)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### ๊ฒฐ๊ณผ
|
|
74
|
+
- โ
์ฑ๊ณต
|
|
75
|
+
- Storybook ์คํ ๋ฆฌ ์ถ๊ฐ ์๋ฃ
|
|
76
|
+
- ๋์์ด๋ ๋ฆฌ๋ทฐ ์๋ฃ
|
|
77
|
+
|
|
78
|
+
### ํ์ ์์
/ ํผ๋๋ฐฑ ์์ฒญ
|
|
79
|
+
- [ ] @backend OAuth ์ฝ๋ฐฑ URL ์ฐ๋ ๋๊ธฐ
|
|
80
|
+
|
|
81
|
+
---
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# {์์ด์ ํธ} ์์
๋ก๊ทธ - {YYYY-MM-DD}
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## {HH:MM} | {์์
์ ๋ชฉ}
|
|
6
|
+
|
|
7
|
+
### What (์์
๋ด์ฉ)
|
|
8
|
+
- {์ํํ ์์
1}
|
|
9
|
+
- {์ํํ ์์
2}
|
|
10
|
+
- {์ํํ ์์
3}
|
|
11
|
+
|
|
12
|
+
### Why (์์
์ด์ )
|
|
13
|
+
> ๊ฐ๋จํ ๊ฒฝ์ฐ: 1-2์ค๋ก ์์ฑ
|
|
14
|
+
> ์ค์ํ ๊ฒฐ์ ์ด ํฌํจ๋ ๊ฒฝ์ฐ: ADR ๋งํฌ
|
|
15
|
+
|
|
16
|
+
{๊ฐ๋จํ ์ด์ }
|
|
17
|
+
|
|
18
|
+
**๊ด๋ จ ๊ฒฐ์ :** [ADR-XXX](../ssot/adr/ADR-XXX.md) (์๋ ๊ฒฝ์ฐ)
|
|
19
|
+
|
|
20
|
+
### Reference (๊ทผ๊ฑฐ/์ฐธ์กฐ)
|
|
21
|
+
| ์ ํ | ๋งํฌ | ์ค๋ช
|
|
|
22
|
+
|-----|------|-----|
|
|
23
|
+
| SSOT | [service-spec.md#xxx](../ssot/service-spec.md#xxx) | API ๋ช
์ธ |
|
|
24
|
+
| SSOT | [ui-ux-spec.md#xxx](../ssot/ui-ux-spec.md#xxx) | ํ๋ฉด ์ค๊ณ |
|
|
25
|
+
| ADR | [ADR-001](../ssot/adr/ADR-001.md) | ๊ด๋ จ ๊ฒฐ์ |
|
|
26
|
+
| ์ธ๋ถ | [๋ฌธ์๋ช
](URL) | ์ฐธ๊ณ ์๋ฃ |
|
|
27
|
+
| ๋
ผ์ | Slack #channel MM/DD | ํ ๋
ผ์ |
|
|
28
|
+
|
|
29
|
+
### ๋ณ๊ฒฝ ํ์ผ
|
|
30
|
+
```
|
|
31
|
+
src/path/to/file.ts (์ ๊ท/์์ /์ญ์ )
|
|
32
|
+
src/path/to/another.ts (์์ )
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### ๊ฒฐ๊ณผ
|
|
36
|
+
- โ
์ฑ๊ณต / โ ๏ธ ๋ถ๋ถ ์ฑ๊ณต / โ ์คํจ
|
|
37
|
+
- ํ
์คํธ: X/Y ํต๊ณผ
|
|
38
|
+
- ๋น๊ณ : {์ถ๊ฐ ๋ฉ๋ชจ}
|
|
39
|
+
|
|
40
|
+
### ํ์ ์์
/ ํผ๋๋ฐฑ ์์ฒญ
|
|
41
|
+
- [ ] @{๋ด๋น์} {์์ฒญ ๋ด์ฉ}
|
|
42
|
+
- [ ] @{๋ด๋น์} {์์ฒญ ๋ด์ฉ}
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
<!-- ๋ค์ ์์
๋ก๊ทธ๋ ์์ ์ถ๊ฐ -->
|