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,288 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <directory-structure architecture="fsd" target="frontend">
3
+ <description>Feature-Sliced Design for React/Next.js Frontend</description>
4
+
5
+ <root name="src">
6
+ <!-- Layer 1: App -->
7
+ <dir name="app" layer="app">
8
+ <description>앱 초기화, 프로바이더, 전역 스타일, 라우팅</description>
9
+
10
+ <dir name="providers">
11
+ <description>React Context Providers 조합</description>
12
+ <file name="index.tsx" example="모든 프로바이더를 조합하는 컴포넌트" />
13
+ <file name="with-auth.tsx" />
14
+ <file name="with-theme.tsx" />
15
+ <file name="with-query.tsx" />
16
+ </dir>
17
+
18
+ <dir name="routing">
19
+ <description>라우팅 설정 (React Router / Next.js)</description>
20
+ <file name="index.tsx" />
21
+ <file name="routes.ts" />
22
+ </dir>
23
+
24
+ <dir name="styles">
25
+ <description>전역 스타일</description>
26
+ <file name="global.css" />
27
+ <file name="variables.css" />
28
+ </dir>
29
+
30
+ <file name="index.tsx" example="앱 진입점" />
31
+ </dir>
32
+
33
+ <!-- Layer 2: Pages -->
34
+ <dir name="pages" layer="pages">
35
+ <description>라우트별 페이지. widgets, features 조합</description>
36
+
37
+ <dir name="home">
38
+ <file name="ui.tsx" example="HomePage 컴포넌트" />
39
+ <file name="index.ts" example="export { HomePage } from './ui'" />
40
+ </dir>
41
+
42
+ <dir name="profile">
43
+ <dir name="ui">
44
+ <file name="ProfilePage.tsx" />
45
+ <file name="ProfileEditPage.tsx" />
46
+ </dir>
47
+ <file name="index.ts" />
48
+ </dir>
49
+
50
+ <dir name="order">
51
+ <dir name="ui">
52
+ <file name="OrderListPage.tsx" />
53
+ <file name="OrderDetailPage.tsx" />
54
+ </dir>
55
+ <file name="model.ts" example="페이지 로컬 상태" />
56
+ <file name="index.ts" />
57
+ </dir>
58
+ </dir>
59
+
60
+ <!-- Layer 3: Widgets -->
61
+ <dir name="widgets" layer="widgets">
62
+ <description>독립적인 UI 블록. 여러 features 조합 가능</description>
63
+
64
+ <dir name="header">
65
+ <dir name="ui">
66
+ <file name="Header.tsx" />
67
+ <file name="Navigation.tsx" />
68
+ <file name="UserMenu.tsx" />
69
+ </dir>
70
+ <file name="index.ts" />
71
+ </dir>
72
+
73
+ <dir name="sidebar">
74
+ <dir name="ui">
75
+ <file name="Sidebar.tsx" />
76
+ <file name="SidebarItem.tsx" />
77
+ </dir>
78
+ <file name="model.ts" example="sidebar 열림/닫힘 상태" />
79
+ <file name="index.ts" />
80
+ </dir>
81
+
82
+ <dir name="order-summary">
83
+ <description>주문 요약 위젯 (여러 features 조합)</description>
84
+ <dir name="ui">
85
+ <file name="OrderSummary.tsx" />
86
+ </dir>
87
+ <file name="index.ts" />
88
+ </dir>
89
+ </dir>
90
+
91
+ <!-- Layer 4: Features -->
92
+ <dir name="features" layer="features">
93
+ <description>사용자 시나리오. 비즈니스 기능 단위</description>
94
+
95
+ <dir name="auth">
96
+ <description>인증 기능 (로그인, 로그아웃, 회원가입)</description>
97
+ <dir name="ui">
98
+ <file name="LoginForm.tsx" />
99
+ <file name="SignupForm.tsx" />
100
+ <file name="LogoutButton.tsx" />
101
+ </dir>
102
+ <dir name="model">
103
+ <file name="auth.store.ts" example="인증 상태 관리" />
104
+ <file name="use-auth.ts" example="인증 관련 훅" />
105
+ </dir>
106
+ <dir name="api">
107
+ <file name="auth.api.ts" example="로그인/로그아웃 API 호출" />
108
+ </dir>
109
+ <file name="index.ts" example="export { LoginForm, useAuth, logout }" />
110
+ </dir>
111
+
112
+ <dir name="add-to-cart">
113
+ <description>장바구니 추가 기능</description>
114
+ <dir name="ui">
115
+ <file name="AddToCartButton.tsx" />
116
+ </dir>
117
+ <dir name="model">
118
+ <file name="use-add-to-cart.ts" />
119
+ </dir>
120
+ <dir name="api">
121
+ <file name="cart.api.ts" />
122
+ </dir>
123
+ <file name="index.ts" />
124
+ </dir>
125
+
126
+ <dir name="search">
127
+ <description>검색 기능</description>
128
+ <dir name="ui">
129
+ <file name="SearchInput.tsx" />
130
+ <file name="SearchResults.tsx" />
131
+ </dir>
132
+ <dir name="model">
133
+ <file name="search.store.ts" />
134
+ <file name="use-search.ts" />
135
+ </dir>
136
+ <dir name="api">
137
+ <file name="search.api.ts" />
138
+ </dir>
139
+ <file name="index.ts" />
140
+ </dir>
141
+
142
+ <dir name="checkout">
143
+ <description>결제 프로세스</description>
144
+ <dir name="ui">
145
+ <file name="CheckoutForm.tsx" />
146
+ <file name="PaymentMethod.tsx" />
147
+ <file name="OrderConfirmation.tsx" />
148
+ </dir>
149
+ <dir name="model">
150
+ <file name="checkout.store.ts" />
151
+ <file name="use-checkout.ts" />
152
+ </dir>
153
+ <dir name="api">
154
+ <file name="checkout.api.ts" />
155
+ </dir>
156
+ <dir name="lib">
157
+ <file name="validation.ts" />
158
+ </dir>
159
+ <file name="index.ts" />
160
+ </dir>
161
+ </dir>
162
+
163
+ <!-- Layer 5: Entities -->
164
+ <dir name="entities" layer="entities">
165
+ <description>비즈니스 엔티티. 데이터 모델 + 관련 UI</description>
166
+
167
+ <dir name="user">
168
+ <dir name="ui">
169
+ <file name="UserCard.tsx" />
170
+ <file name="UserAvatar.tsx" />
171
+ </dir>
172
+ <dir name="model">
173
+ <file name="user.types.ts" example="interface User { id: string; name: string; email: string; }" />
174
+ <file name="user.store.ts" />
175
+ </dir>
176
+ <dir name="api">
177
+ <file name="user.api.ts" />
178
+ </dir>
179
+ <file name="index.ts" example="export { UserCard, UserAvatar, type User }" />
180
+ </dir>
181
+
182
+ <dir name="product">
183
+ <dir name="ui">
184
+ <file name="ProductCard.tsx" />
185
+ <file name="ProductImage.tsx" />
186
+ <file name="ProductPrice.tsx" />
187
+ </dir>
188
+ <dir name="model">
189
+ <file name="product.types.ts" />
190
+ </dir>
191
+ <dir name="api">
192
+ <file name="product.api.ts" />
193
+ </dir>
194
+ <file name="index.ts" />
195
+ </dir>
196
+
197
+ <dir name="order">
198
+ <dir name="ui">
199
+ <file name="OrderCard.tsx" />
200
+ <file name="OrderStatus.tsx" />
201
+ <file name="OrderItemList.tsx" />
202
+ </dir>
203
+ <dir name="model">
204
+ <file name="order.types.ts" />
205
+ </dir>
206
+ <dir name="api">
207
+ <file name="order.api.ts" />
208
+ </dir>
209
+ <file name="index.ts" />
210
+ </dir>
211
+ </dir>
212
+
213
+ <!-- Layer 6: Shared -->
214
+ <dir name="shared" layer="shared">
215
+ <description>공유 리소스. 비즈니스 로직 없음</description>
216
+
217
+ <dir name="ui">
218
+ <description>UI Kit - 도메인 무관한 컴포넌트</description>
219
+ <file name="Button.tsx" />
220
+ <file name="Input.tsx" />
221
+ <file name="Modal.tsx" />
222
+ <file name="Card.tsx" />
223
+ <file name="Spinner.tsx" />
224
+ <file name="index.ts" />
225
+ </dir>
226
+
227
+ <dir name="lib">
228
+ <description>유틸리티 함수</description>
229
+ <file name="format-date.ts" />
230
+ <file name="format-currency.ts" />
231
+ <file name="cn.ts" example="className 병합 유틸" />
232
+ <file name="index.ts" />
233
+ </dir>
234
+
235
+ <dir name="api">
236
+ <description>API 기반 설정</description>
237
+ <file name="api-client.ts" example="axios/fetch 인스턴스" />
238
+ <file name="api-types.ts" />
239
+ <file name="index.ts" />
240
+ </dir>
241
+
242
+ <dir name="config">
243
+ <description>앱 설정</description>
244
+ <file name="env.ts" />
245
+ <file name="constants.ts" />
246
+ <file name="index.ts" />
247
+ </dir>
248
+
249
+ <dir name="types">
250
+ <description>공통 타입</description>
251
+ <file name="common.ts" />
252
+ <file name="index.ts" />
253
+ </dir>
254
+
255
+ <dir name="hooks">
256
+ <description>공통 훅</description>
257
+ <file name="use-debounce.ts" />
258
+ <file name="use-local-storage.ts" />
259
+ <file name="use-media-query.ts" />
260
+ <file name="index.ts" />
261
+ </dir>
262
+ </dir>
263
+ </root>
264
+
265
+ <import-rules>
266
+ <rule>상위 레이어만 하위 레이어를 import 가능</rule>
267
+ <rule>같은 레이어 내 슬라이스 간 import 금지</rule>
268
+ <rule>모든 import는 Public API (index.ts)를 통해서만</rule>
269
+
270
+ <allowed from="app" to="pages,widgets,features,entities,shared" />
271
+ <allowed from="pages" to="widgets,features,entities,shared" />
272
+ <allowed from="widgets" to="features,entities,shared" />
273
+ <allowed from="features" to="entities,shared" />
274
+ <allowed from="entities" to="shared" />
275
+ <allowed from="shared" to="없음" />
276
+
277
+ <forbidden>같은 레이어 내 cross-import (features/auth → features/checkout 금지)</forbidden>
278
+ </import-rules>
279
+
280
+ <path-aliases>
281
+ <alias name="@/app" path="src/app" />
282
+ <alias name="@/pages" path="src/pages" />
283
+ <alias name="@/widgets" path="src/widgets" />
284
+ <alias name="@/features" path="src/features" />
285
+ <alias name="@/entities" path="src/entities" />
286
+ <alias name="@/shared" path="src/shared" />
287
+ </path-aliases>
288
+ </directory-structure>
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: hexagonal-architecture
3
+ description: Hexagonal Architecture (Ports and Adapters)
4
+ aliases: [ports-and-adapters, onion-architecture]
5
+ suitable-for: [api-backend, platform, fintech]
6
+ target: backend
7
+ ---
8
+
9
+ # Hexagonal Architecture (Ports and Adapters)
10
+
11
+ <architecture name="hexagonal">
12
+ <philosophy>
13
+ <principle>애플리케이션을 육각형의 중심에, 외부 세계를 가장자리에</principle>
14
+ <principle>포트(인터페이스)로 경계 정의, 어댑터로 연결</principle>
15
+ <principle>인바운드(Driving) vs 아웃바운드(Driven) 명확 구분</principle>
16
+ <principle>도메인은 외부에 대해 무지해야 함</principle>
17
+ </philosophy>
18
+
19
+ <core-concepts>
20
+ <concept name="port">
21
+ <description>애플리케이션 경계의 인터페이스</description>
22
+ <type name="inbound">외부에서 애플리케이션으로 들어오는 요청 (Use Case)</type>
23
+ <type name="outbound">애플리케이션에서 외부로 나가는 요청 (SPI)</type>
24
+ </concept>
25
+
26
+ <concept name="adapter">
27
+ <description>포트의 구체적 구현</description>
28
+ <type name="primary">외부 → 애플리케이션 (Controller, CLI, Message Consumer)</type>
29
+ <type name="secondary">애플리케이션 → 외부 (Repository, API Client, Message Publisher)</type>
30
+ </concept>
31
+
32
+ <concept name="application-core">
33
+ <description>비즈니스 로직의 핵심. 포트로만 외부와 소통</description>
34
+ </concept>
35
+ </core-concepts>
36
+
37
+ <layers>
38
+ <layer name="domain" position="center">
39
+ <description>비즈니스 엔티티와 규칙. 가장 안정적</description>
40
+ </layer>
41
+
42
+ <layer name="application" position="inner-ring">
43
+ <description>유스케이스와 포트 정의</description>
44
+ </layer>
45
+
46
+ <layer name="adapters" position="outer-ring">
47
+ <description>포트 구현. Primary + Secondary</description>
48
+ </layer>
49
+
50
+ <layer name="infrastructure" position="edge">
51
+ <description>프레임워크, 설정, 조립</description>
52
+ </layer>
53
+ </layers>
54
+
55
+ <dependency-flow>
56
+ <rule>의존성은 항상 바깥에서 안으로 향함</rule>
57
+ <rule>안쪽 레이어는 바깥쪽을 모름</rule>
58
+ <rule>포트 = 안쪽에서 정의, 어댑터 = 바깥에서 구현</rule>
59
+ </dependency-flow>
60
+ </architecture>
@@ -0,0 +1,300 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <directory-structure architecture="hexagonal" target="backend">
3
+ <description>Hexagonal Architecture (Ports and Adapters) for Node.js Backend</description>
4
+
5
+ <root name="src">
6
+ <!-- Domain (Core Center) -->
7
+ <dir name="domain" layer="center">
8
+ <description>비즈니스 핵심. 외부 의존성 완전 제거</description>
9
+
10
+ <dir name="model">
11
+ <description>도메인 모델 (Aggregate Root, Entity, Value Object)</description>
12
+
13
+ <dir name="user">
14
+ <file name="user.ts" example="Aggregate Root" />
15
+ <file name="user-id.ts" example="Value Object (Branded Type)" />
16
+ <file name="email.ts" example="Value Object with validation" />
17
+ <file name="password.ts" example="Value Object (hashed)" />
18
+ </dir>
19
+
20
+ <dir name="order">
21
+ <file name="order.ts" />
22
+ <file name="order-id.ts" />
23
+ <file name="order-item.ts" />
24
+ <file name="order-status.ts" example="enum OrderStatus" />
25
+ </dir>
26
+
27
+ <dir name="product">
28
+ <file name="product.ts" />
29
+ <file name="product-id.ts" />
30
+ <file name="money.ts" example="Value Object for price" />
31
+ </dir>
32
+ </dir>
33
+
34
+ <dir name="service">
35
+ <description>도메인 서비스 (여러 엔티티에 걸친 로직)</description>
36
+ <file name="pricing.service.ts" />
37
+ <file name="inventory.service.ts" />
38
+ </dir>
39
+
40
+ <dir name="event">
41
+ <description>도메인 이벤트</description>
42
+ <file name="domain-event.ts" />
43
+ <file name="user-registered.event.ts" />
44
+ <file name="order-placed.event.ts" />
45
+ <file name="payment-completed.event.ts" />
46
+ </dir>
47
+
48
+ <dir name="error">
49
+ <description>도메인 에러</description>
50
+ <file name="domain-error.ts" />
51
+ <file name="validation-error.ts" />
52
+ <file name="not-found-error.ts" />
53
+ <file name="business-rule-error.ts" />
54
+ </dir>
55
+ </dir>
56
+
57
+ <!-- Application (Inner Ring - Use Cases + Ports) -->
58
+ <dir name="application" layer="inner-ring">
59
+ <description>애플리케이션 서비스와 포트 정의</description>
60
+
61
+ <dir name="port">
62
+ <description>포트 인터페이스 (애플리케이션 경계)</description>
63
+
64
+ <dir name="inbound">
65
+ <description>인바운드 포트 (Primary Ports / Driving)</description>
66
+ <note>외부에서 애플리케이션을 호출하기 위한 인터페이스</note>
67
+
68
+ <dir name="user">
69
+ <file name="register-user.port.ts" example="interface RegisterUserUseCase { execute(cmd: RegisterUserCommand): Promise&lt;UserId&gt;; }" />
70
+ <file name="get-user.port.ts" />
71
+ <file name="update-user.port.ts" />
72
+ </dir>
73
+
74
+ <dir name="order">
75
+ <file name="create-order.port.ts" />
76
+ <file name="cancel-order.port.ts" />
77
+ <file name="get-order.port.ts" />
78
+ </dir>
79
+ </dir>
80
+
81
+ <dir name="outbound">
82
+ <description>아웃바운드 포트 (Secondary Ports / Driven)</description>
83
+ <note>애플리케이션이 외부 리소스에 접근하기 위한 인터페이스</note>
84
+
85
+ <file name="user-repository.port.ts" example="interface UserRepository { findById(id: UserId): Promise&lt;User | null&gt;; save(user: User): Promise&lt;void&gt;; }" />
86
+ <file name="order-repository.port.ts" />
87
+ <file name="product-repository.port.ts" />
88
+ <file name="payment-gateway.port.ts" />
89
+ <file name="email-sender.port.ts" />
90
+ <file name="event-publisher.port.ts" />
91
+ </dir>
92
+ </dir>
93
+
94
+ <dir name="service">
95
+ <description>애플리케이션 서비스 (유스케이스 구현)</description>
96
+
97
+ <dir name="user">
98
+ <file name="register-user.service.ts" example="RegisterUserUseCase 구현" />
99
+ <file name="get-user.service.ts" />
100
+ <file name="update-user.service.ts" />
101
+ </dir>
102
+
103
+ <dir name="order">
104
+ <file name="create-order.service.ts" />
105
+ <file name="cancel-order.service.ts" />
106
+ <file name="get-order.service.ts" />
107
+ </dir>
108
+ </dir>
109
+
110
+ <dir name="command">
111
+ <description>Command 객체 (유스케이스 입력)</description>
112
+ <file name="register-user.command.ts" />
113
+ <file name="create-order.command.ts" />
114
+ <file name="update-user.command.ts" />
115
+ </dir>
116
+
117
+ <dir name="query">
118
+ <description>Query 객체 (조회 입력)</description>
119
+ <file name="get-user.query.ts" />
120
+ <file name="get-order.query.ts" />
121
+ <file name="list-orders.query.ts" />
122
+ </dir>
123
+
124
+ <dir name="dto">
125
+ <description>Result DTO (유스케이스 출력)</description>
126
+ <file name="user-result.dto.ts" />
127
+ <file name="order-result.dto.ts" />
128
+ </dir>
129
+ </dir>
130
+
131
+ <!-- Adapters (Outer Ring) -->
132
+ <dir name="adapter" layer="outer-ring">
133
+ <description>포트 구현 (Primary + Secondary Adapters)</description>
134
+
135
+ <dir name="inbound">
136
+ <description>Primary Adapters (Driving Adapters)</description>
137
+ <note>외부에서 애플리케이션으로 들어오는 진입점</note>
138
+
139
+ <dir name="http">
140
+ <description>HTTP REST API 어댑터</description>
141
+ <file name="user.controller.ts" />
142
+ <file name="order.controller.ts" />
143
+ <file name="health.controller.ts" />
144
+
145
+ <dir name="dto">
146
+ <description>HTTP 요청/응답 DTO</description>
147
+ <file name="register-user.request.ts" />
148
+ <file name="create-order.request.ts" />
149
+ <file name="user.response.ts" />
150
+ <file name="order.response.ts" />
151
+ </dir>
152
+
153
+ <dir name="mapper">
154
+ <description>HTTP DTO ↔ Command/Query 매퍼</description>
155
+ <file name="user.mapper.ts" />
156
+ <file name="order.mapper.ts" />
157
+ </dir>
158
+ </dir>
159
+
160
+ <dir name="grpc">
161
+ <description>gRPC 어댑터 (선택적)</description>
162
+ <file name="user.grpc.ts" />
163
+ <file name="order.grpc.ts" />
164
+ </dir>
165
+
166
+ <dir name="cli">
167
+ <description>CLI 어댑터 (선택적)</description>
168
+ <file name="migrate.cli.ts" />
169
+ <file name="seed.cli.ts" />
170
+ </dir>
171
+
172
+ <dir name="message">
173
+ <description>메시지 컨슈머 어댑터</description>
174
+ <file name="order-event.consumer.ts" />
175
+ <file name="payment-event.consumer.ts" />
176
+ </dir>
177
+ </dir>
178
+
179
+ <dir name="outbound">
180
+ <description>Secondary Adapters (Driven Adapters)</description>
181
+ <note>애플리케이션에서 외부로 나가는 구현</note>
182
+
183
+ <dir name="persistence">
184
+ <description>영속성 어댑터 (Repository 구현)</description>
185
+
186
+ <dir name="prisma">
187
+ <file name="prisma-user.repository.ts" example="UserRepository 구현" />
188
+ <file name="prisma-order.repository.ts" />
189
+ <file name="prisma-product.repository.ts" />
190
+ </dir>
191
+
192
+ <dir name="mapper">
193
+ <description>DB 모델 ↔ 도메인 모델 매퍼</description>
194
+ <file name="user.mapper.ts" />
195
+ <file name="order.mapper.ts" />
196
+ </dir>
197
+ </dir>
198
+
199
+ <dir name="external">
200
+ <description>외부 서비스 어댑터</description>
201
+ <file name="stripe-payment.adapter.ts" />
202
+ <file name="sendgrid-email.adapter.ts" />
203
+ <file name="aws-s3-storage.adapter.ts" />
204
+ </dir>
205
+
206
+ <dir name="message">
207
+ <description>메시지 퍼블리셔 어댑터</description>
208
+ <file name="kafka-event.publisher.ts" />
209
+ <file name="redis-event.publisher.ts" />
210
+ </dir>
211
+ </dir>
212
+ </dir>
213
+
214
+ <!-- Infrastructure (Edge) -->
215
+ <dir name="infrastructure" layer="edge">
216
+ <description>프레임워크 설정 및 조립</description>
217
+
218
+ <dir name="http">
219
+ <description>HTTP 서버 설정</description>
220
+ <file name="app.ts" example="Hono 앱 인스턴스" />
221
+ <file name="routes.ts" />
222
+ <file name="middleware.ts" />
223
+ <file name="error-handler.ts" />
224
+ </dir>
225
+
226
+ <dir name="database">
227
+ <description>데이터베이스 설정</description>
228
+ <file name="prisma.ts" />
229
+ <dir name="migrations" />
230
+ </dir>
231
+
232
+ <dir name="config">
233
+ <description>환경 설정</description>
234
+ <file name="env.ts" />
235
+ <file name="constants.ts" />
236
+ </dir>
237
+
238
+ <dir name="di">
239
+ <description>의존성 주입 컨테이너</description>
240
+ <file name="container.ts" example="어댑터와 서비스 조립" />
241
+ <file name="tokens.ts" example="DI 토큰 정의" />
242
+ </dir>
243
+
244
+ <dir name="logging">
245
+ <file name="logger.ts" />
246
+ </dir>
247
+
248
+ <dir name="monitoring">
249
+ <file name="metrics.ts" />
250
+ <file name="tracing.ts" />
251
+ </dir>
252
+ </dir>
253
+
254
+ <!-- Entry Point -->
255
+ <file name="index.ts" layer="infrastructure">
256
+ <description>애플리케이션 진입점</description>
257
+ </file>
258
+ </root>
259
+
260
+ <import-rules>
261
+ <rule from="domain" to="없음">domain은 외부 의존성 없음</rule>
262
+ <rule from="application" to="domain">포트는 domain 타입만 사용</rule>
263
+ <rule from="adapter" to="application,domain">어댑터는 포트 구현, 도메인 사용</rule>
264
+ <rule from="infrastructure" to="all">infrastructure는 모든 레이어 조립</rule>
265
+ </import-rules>
266
+
267
+ <testing-structure>
268
+ <dir name="__tests__">
269
+ <dir name="unit">
270
+ <description>유닛 테스트 (도메인, 서비스)</description>
271
+ <dir name="domain" />
272
+ <dir name="application" />
273
+ </dir>
274
+
275
+ <dir name="integration">
276
+ <description>통합 테스트 (어댑터)</description>
277
+ <dir name="adapter">
278
+ <dir name="inbound" note="컨트롤러 테스트" />
279
+ <dir name="outbound" note="리포지토리 테스트" />
280
+ </dir>
281
+ </dir>
282
+
283
+ <dir name="e2e">
284
+ <description>E2E 테스트</description>
285
+ </dir>
286
+
287
+ <dir name="fixtures">
288
+ <description>테스트 픽스처</description>
289
+ <file name="user.fixture.ts" />
290
+ <file name="order.fixture.ts" />
291
+ </dir>
292
+
293
+ <dir name="mocks">
294
+ <description>목 어댑터</description>
295
+ <file name="mock-user-repository.ts" />
296
+ <file name="mock-payment-gateway.ts" />
297
+ </dir>
298
+ </dir>
299
+ </testing-structure>
300
+ </directory-structure>