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,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
+ <![CDATA[
137
+ # {{project_name}} ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ
138
+
139
+ **์ƒ์„ฑ์ผ**: {{DATE}}
140
+ **๋ฒ„์ „**: 1.0
141
+ **PRD ์ฐธ์กฐ**: [prd.md](./prd.md)
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
+ <!-- ๋‹ค์Œ ์ž‘์—… ๋กœ๊ทธ๋Š” ์œ„์— ์ถ”๊ฐ€ -->