@mandujs/core 0.12.1 → 0.13.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 (177) hide show
  1. package/README.ko.md +304 -304
  2. package/README.md +653 -653
  3. package/package.json +8 -8
  4. package/src/brain/architecture/analyzer.ts +28 -26
  5. package/src/brain/doctor/analyzer.ts +1 -1
  6. package/src/bundler/build.ts +91 -91
  7. package/src/bundler/css.ts +302 -302
  8. package/src/bundler/dev.ts +0 -1
  9. package/src/change/history.ts +3 -3
  10. package/src/change/snapshot.ts +10 -9
  11. package/src/change/transaction.ts +2 -2
  12. package/src/client/Link.tsx +227 -227
  13. package/src/client/globals.ts +44 -44
  14. package/src/client/hooks.ts +267 -267
  15. package/src/client/index.ts +5 -5
  16. package/src/client/island.ts +8 -8
  17. package/src/client/router.ts +435 -435
  18. package/src/client/runtime.ts +23 -23
  19. package/src/client/serialize.ts +404 -404
  20. package/src/client/window-state.ts +101 -101
  21. package/src/config/mandu.ts +94 -96
  22. package/src/config/validate.ts +213 -215
  23. package/src/config/watcher.ts +311 -311
  24. package/src/constants.ts +40 -40
  25. package/src/content/content-layer.ts +314 -314
  26. package/src/content/content.test.ts +433 -433
  27. package/src/content/data-store.ts +245 -245
  28. package/src/content/digest.ts +133 -133
  29. package/src/content/index.ts +164 -164
  30. package/src/content/loader-context.ts +172 -172
  31. package/src/content/loaders/api.ts +216 -216
  32. package/src/content/loaders/file.ts +169 -169
  33. package/src/content/loaders/glob.ts +252 -252
  34. package/src/content/loaders/index.ts +34 -34
  35. package/src/content/loaders/types.ts +137 -137
  36. package/src/content/meta-store.ts +209 -209
  37. package/src/content/types.ts +282 -282
  38. package/src/content/watcher.ts +135 -135
  39. package/src/contract/client-safe.test.ts +42 -42
  40. package/src/contract/client-safe.ts +114 -114
  41. package/src/contract/client.ts +16 -16
  42. package/src/contract/define.ts +459 -459
  43. package/src/contract/handler.ts +10 -10
  44. package/src/contract/normalize.test.ts +276 -276
  45. package/src/contract/normalize.ts +404 -404
  46. package/src/contract/registry.test.ts +206 -206
  47. package/src/contract/registry.ts +568 -568
  48. package/src/contract/schema.ts +48 -48
  49. package/src/contract/types.ts +58 -58
  50. package/src/contract/validator.ts +32 -32
  51. package/src/devtools/ai/context-builder.ts +375 -375
  52. package/src/devtools/ai/index.ts +25 -25
  53. package/src/devtools/ai/mcp-connector.ts +465 -465
  54. package/src/devtools/client/catchers/error-catcher.ts +327 -327
  55. package/src/devtools/client/catchers/index.ts +18 -18
  56. package/src/devtools/client/catchers/network-proxy.ts +363 -363
  57. package/src/devtools/client/components/index.ts +39 -39
  58. package/src/devtools/client/components/kitchen-root.tsx +362 -362
  59. package/src/devtools/client/components/mandu-character.tsx +241 -241
  60. package/src/devtools/client/components/overlay.tsx +368 -368
  61. package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
  62. package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
  63. package/src/devtools/client/components/panel/index.ts +32 -32
  64. package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
  65. package/src/devtools/client/components/panel/network-panel.tsx +292 -292
  66. package/src/devtools/client/components/panel/panel-container.tsx +259 -259
  67. package/src/devtools/client/filters/context-filters.ts +282 -282
  68. package/src/devtools/client/filters/index.ts +16 -16
  69. package/src/devtools/client/index.ts +63 -63
  70. package/src/devtools/client/persistence.ts +335 -335
  71. package/src/devtools/client/state-manager.ts +478 -478
  72. package/src/devtools/design-tokens.ts +263 -263
  73. package/src/devtools/hook/create-hook.ts +207 -207
  74. package/src/devtools/hook/index.ts +13 -13
  75. package/src/devtools/index.ts +439 -439
  76. package/src/devtools/init.ts +266 -266
  77. package/src/devtools/protocol.ts +237 -237
  78. package/src/devtools/server/index.ts +17 -17
  79. package/src/devtools/server/source-context.ts +444 -444
  80. package/src/devtools/types.ts +319 -319
  81. package/src/devtools/worker/index.ts +25 -25
  82. package/src/devtools/worker/redaction-worker.ts +222 -222
  83. package/src/devtools/worker/worker-manager.ts +409 -409
  84. package/src/error/classifier.ts +2 -2
  85. package/src/error/domains.ts +265 -265
  86. package/src/error/formatter.ts +32 -32
  87. package/src/error/result.ts +46 -46
  88. package/src/error/stack-analyzer.ts +5 -0
  89. package/src/error/types.ts +6 -6
  90. package/src/errors/extractor.ts +409 -409
  91. package/src/errors/index.ts +19 -19
  92. package/src/filling/auth.ts +308 -308
  93. package/src/filling/context.ts +569 -569
  94. package/src/filling/deps.ts +238 -238
  95. package/src/generator/contract-glue.ts +2 -1
  96. package/src/generator/generate.ts +12 -10
  97. package/src/generator/index.ts +3 -3
  98. package/src/generator/templates.ts +80 -79
  99. package/src/guard/analyzer.ts +360 -360
  100. package/src/guard/ast-analyzer.ts +806 -806
  101. package/src/guard/auto-correct.ts +1 -1
  102. package/src/guard/check.ts +128 -128
  103. package/src/guard/contract-guard.ts +9 -9
  104. package/src/guard/file-type.test.ts +24 -24
  105. package/src/guard/healing.ts +2 -0
  106. package/src/guard/index.ts +2 -0
  107. package/src/guard/negotiation.ts +430 -4
  108. package/src/guard/presets/atomic.ts +70 -70
  109. package/src/guard/presets/clean.ts +77 -77
  110. package/src/guard/presets/cqrs.test.ts +175 -0
  111. package/src/guard/presets/cqrs.ts +107 -0
  112. package/src/guard/presets/fsd.ts +79 -79
  113. package/src/guard/presets/hexagonal.ts +68 -68
  114. package/src/guard/presets/index.ts +291 -288
  115. package/src/guard/reporter.ts +445 -445
  116. package/src/guard/rules.ts +12 -12
  117. package/src/guard/statistics.ts +578 -578
  118. package/src/guard/suggestions.ts +358 -352
  119. package/src/guard/types.ts +348 -347
  120. package/src/guard/validator.ts +834 -834
  121. package/src/guard/watcher.ts +404 -404
  122. package/src/index.ts +1 -0
  123. package/src/intent/index.ts +310 -310
  124. package/src/island/index.ts +304 -304
  125. package/src/logging/index.ts +22 -22
  126. package/src/logging/transports.ts +365 -365
  127. package/src/paths.test.ts +47 -0
  128. package/src/paths.ts +47 -0
  129. package/src/plugins/index.ts +38 -38
  130. package/src/plugins/registry.ts +377 -377
  131. package/src/plugins/types.ts +363 -363
  132. package/src/report/build.ts +1 -1
  133. package/src/report/index.ts +1 -1
  134. package/src/router/fs-patterns.ts +387 -387
  135. package/src/router/fs-routes.ts +344 -401
  136. package/src/router/fs-scanner.ts +497 -497
  137. package/src/router/fs-types.ts +270 -278
  138. package/src/router/index.ts +81 -81
  139. package/src/runtime/boundary.tsx +232 -232
  140. package/src/runtime/compose.ts +222 -222
  141. package/src/runtime/lifecycle.ts +381 -381
  142. package/src/runtime/logger.test.ts +345 -345
  143. package/src/runtime/logger.ts +677 -677
  144. package/src/runtime/router.test.ts +476 -476
  145. package/src/runtime/router.ts +105 -105
  146. package/src/runtime/security.ts +155 -155
  147. package/src/runtime/server.ts +24 -24
  148. package/src/runtime/session-key.ts +328 -328
  149. package/src/runtime/ssr.ts +367 -367
  150. package/src/runtime/streaming-ssr.ts +1245 -1245
  151. package/src/runtime/trace.ts +144 -144
  152. package/src/seo/index.ts +214 -214
  153. package/src/seo/integration/ssr.ts +307 -307
  154. package/src/seo/render/basic.ts +427 -427
  155. package/src/seo/render/index.ts +143 -143
  156. package/src/seo/render/jsonld.ts +539 -539
  157. package/src/seo/render/opengraph.ts +191 -191
  158. package/src/seo/render/robots.ts +116 -116
  159. package/src/seo/render/sitemap.ts +137 -137
  160. package/src/seo/render/twitter.ts +126 -126
  161. package/src/seo/resolve/index.ts +353 -353
  162. package/src/seo/resolve/opengraph.ts +143 -143
  163. package/src/seo/resolve/robots.ts +73 -73
  164. package/src/seo/resolve/title.ts +94 -94
  165. package/src/seo/resolve/twitter.ts +73 -73
  166. package/src/seo/resolve/url.ts +97 -97
  167. package/src/seo/routes/index.ts +290 -290
  168. package/src/seo/types.ts +575 -575
  169. package/src/slot/validator.ts +39 -39
  170. package/src/spec/index.ts +3 -3
  171. package/src/spec/load.ts +76 -76
  172. package/src/spec/lock.ts +56 -56
  173. package/src/utils/bun.ts +8 -8
  174. package/src/utils/lru-cache.ts +75 -75
  175. package/src/utils/safe-io.ts +188 -188
  176. package/src/utils/string-safe.ts +298 -298
  177. package/src/watcher/rules.ts +5 -5
@@ -1,288 +1,291 @@
1
- /**
2
- * Guard Presets
3
- *
4
- * 아키텍처 프리셋 모음
5
- */
6
-
7
- import type { GuardPreset, PresetDefinition } from "../types";
8
- import { fsdPreset, FSD_HIERARCHY } from "./fsd";
9
- import { cleanPreset, CLEAN_HIERARCHY } from "./clean";
10
- import { hexagonalPreset, HEXAGONAL_HIERARCHY } from "./hexagonal";
11
- import { atomicPreset, ATOMIC_HIERARCHY } from "./atomic";
12
-
13
- // Re-export
14
- export { fsdPreset, FSD_HIERARCHY } from "./fsd";
15
- export { cleanPreset, CLEAN_HIERARCHY } from "./clean";
16
- export { hexagonalPreset, HEXAGONAL_HIERARCHY } from "./hexagonal";
17
- export { atomicPreset, ATOMIC_HIERARCHY } from "./atomic";
18
-
19
- /**
20
- * Mandu 권장 프리셋 (FSD + Clean 조합)
21
- *
22
- * 풀스택 프로젝트에 최적화
23
- */
24
- export const manduPreset: PresetDefinition = {
25
- name: "mandu",
26
- description: "Mandu 권장 아키텍처 - client/server 분리 + strict shared",
27
-
28
- hierarchy: [
29
- // Client (FSD)
30
- "client/app",
31
- "client/pages",
32
- "client/widgets",
33
- "client/features",
34
- "client/entities",
35
- "client/shared",
36
- // Shared (strict)
37
- "shared/contracts",
38
- "shared/types",
39
- "shared/utils/client",
40
- "shared/utils/server",
41
- "shared/schema",
42
- "shared/env",
43
- "shared/unsafe",
44
- // Server (Clean)
45
- "server/api",
46
- "server/application",
47
- "server/domain",
48
- "server/infra",
49
- "server/core",
50
- ],
51
-
52
- layers: [
53
- // Client layers
54
- {
55
- name: "client/app",
56
- pattern: "src/client/app/**",
57
- canImport: [
58
- "client/pages",
59
- "client/widgets",
60
- "client/features",
61
- "client/entities",
62
- "client/shared",
63
- "shared/contracts",
64
- "shared/types",
65
- "shared/utils/client",
66
- ],
67
- description: "클라이언트 앱 진입점",
68
- },
69
- {
70
- name: "client/pages",
71
- pattern: "src/client/pages/**",
72
- canImport: [
73
- "client/widgets",
74
- "client/features",
75
- "client/entities",
76
- "client/shared",
77
- "shared/contracts",
78
- "shared/types",
79
- "shared/utils/client",
80
- ],
81
- description: "클라이언트 페이지",
82
- },
83
- {
84
- name: "client/widgets",
85
- pattern: "src/client/widgets/**",
86
- canImport: [
87
- "client/features",
88
- "client/entities",
89
- "client/shared",
90
- "shared/contracts",
91
- "shared/types",
92
- "shared/utils/client",
93
- ],
94
- description: "클라이언트 위젯",
95
- },
96
- {
97
- name: "client/features",
98
- pattern: "src/client/features/**",
99
- canImport: [
100
- "client/entities",
101
- "client/shared",
102
- "shared/contracts",
103
- "shared/types",
104
- "shared/utils/client",
105
- ],
106
- description: "클라이언트 기능",
107
- },
108
- {
109
- name: "client/entities",
110
- pattern: "src/client/entities/**",
111
- canImport: [
112
- "client/shared",
113
- "shared/contracts",
114
- "shared/types",
115
- "shared/utils/client",
116
- ],
117
- description: "클라이언트 엔티티",
118
- },
119
- {
120
- name: "client/shared",
121
- pattern: "src/client/shared/**",
122
- canImport: [
123
- "shared/contracts",
124
- "shared/types",
125
- "shared/utils/client",
126
- ],
127
- description: "클라이언트 전용 공유",
128
- },
129
- // Shared layers
130
- {
131
- name: "shared/contracts",
132
- pattern: "src/shared/contracts/**",
133
- canImport: ["shared/types", "shared/utils/client"],
134
- description: "공용 계약 (클라이언트 safe)",
135
- },
136
- {
137
- name: "shared/schema",
138
- pattern: "src/shared/schema/**",
139
- canImport: ["shared/types", "shared/utils/server"],
140
- description: "서버 전용 스키마 (JSON/OpenAPI)",
141
- },
142
- {
143
- name: "shared/types",
144
- pattern: "src/shared/types/**",
145
- canImport: [],
146
- description: "공용 타입",
147
- },
148
- {
149
- name: "shared/utils/client",
150
- pattern: "src/shared/utils/client/**",
151
- canImport: ["shared/types"],
152
- description: "클라이언트 safe 유틸",
153
- },
154
- {
155
- name: "shared/utils/server",
156
- pattern: "src/shared/utils/server/**",
157
- canImport: ["shared/types", "shared/utils/client"],
158
- description: "서버 전용 유틸",
159
- },
160
- {
161
- name: "shared/env",
162
- pattern: "src/shared/env/**",
163
- canImport: ["shared/types", "shared/utils/client", "shared/utils/server"],
164
- description: "서버 전용 환경/설정",
165
- },
166
- {
167
- name: "shared/unsafe",
168
- pattern: "src/shared/**",
169
- canImport: [],
170
- description: "금지된 shared 경로",
171
- },
172
- // Server layers
173
- {
174
- name: "server/api",
175
- pattern: "src/server/api/**",
176
- canImport: [
177
- "server/application",
178
- "server/domain",
179
- "server/infra",
180
- "server/core",
181
- "shared/contracts",
182
- "shared/schema",
183
- "shared/types",
184
- "shared/utils/client",
185
- "shared/utils/server",
186
- "shared/env",
187
- ],
188
- description: "서버 API 라우트, 컨트롤러",
189
- },
190
- {
191
- name: "server/application",
192
- pattern: "src/server/application/**",
193
- canImport: [
194
- "server/domain",
195
- "server/core",
196
- "shared/contracts",
197
- "shared/schema",
198
- "shared/types",
199
- "shared/utils/client",
200
- "shared/utils/server",
201
- "shared/env",
202
- ],
203
- description: "서버 유스케이스, 서비스",
204
- },
205
- {
206
- name: "server/domain",
207
- pattern: "src/server/domain/**",
208
- canImport: [
209
- "shared/contracts",
210
- "shared/schema",
211
- "shared/types",
212
- "shared/utils/client",
213
- "shared/utils/server",
214
- "shared/env",
215
- ],
216
- description: "서버 도메인 모델",
217
- },
218
- {
219
- name: "server/infra",
220
- pattern: "src/server/infra/**",
221
- canImport: [
222
- "server/application",
223
- "server/domain",
224
- "server/core",
225
- "shared/contracts",
226
- "shared/schema",
227
- "shared/types",
228
- "shared/utils/client",
229
- "shared/utils/server",
230
- "shared/env",
231
- ],
232
- description: "서버 인프라 구현",
233
- },
234
- {
235
- name: "server/core",
236
- pattern: "src/server/core/**",
237
- canImport: [
238
- "shared/contracts",
239
- "shared/schema",
240
- "shared/types",
241
- "shared/utils/client",
242
- "shared/utils/server",
243
- "shared/env",
244
- ],
245
- description: "서버 핵심 공통",
246
- },
247
- ],
248
-
249
- defaultSeverity: {
250
- layerViolation: "error",
251
- circularDependency: "warn",
252
- crossSliceDependency: "warn",
253
- deepNesting: "info",
254
- fileType: "error",
255
- },
256
- };
257
-
258
- /**
259
- * 모든 프리셋 맵
260
- */
261
- export const presets: Record<GuardPreset, PresetDefinition> = {
262
- fsd: fsdPreset,
263
- clean: cleanPreset,
264
- hexagonal: hexagonalPreset,
265
- atomic: atomicPreset,
266
- mandu: manduPreset,
267
- };
268
-
269
- /**
270
- * 프리셋 가져오기
271
- */
272
- export function getPreset(name: GuardPreset): PresetDefinition {
273
- const preset = presets[name];
274
- if (!preset) {
275
- throw new Error(`Unknown guard preset: ${name}`);
276
- }
277
- return preset;
278
- }
279
-
280
- /**
281
- * 프리셋 목록 가져오기
282
- */
283
- export function listPresets(): Array<{ name: GuardPreset; description: string }> {
284
- return Object.values(presets).map((p) => ({
285
- name: p.name,
286
- description: p.description,
287
- }));
288
- }
1
+ /**
2
+ * Guard Presets
3
+ *
4
+ * 아키텍처 프리셋 모음
5
+ */
6
+
7
+ import type { GuardPreset, PresetDefinition } from "../types";
8
+ import { fsdPreset, FSD_HIERARCHY } from "./fsd";
9
+ import { cleanPreset, CLEAN_HIERARCHY } from "./clean";
10
+ import { hexagonalPreset, HEXAGONAL_HIERARCHY } from "./hexagonal";
11
+ import { atomicPreset, ATOMIC_HIERARCHY } from "./atomic";
12
+ import { cqrsPreset, CQRS_HIERARCHY } from "./cqrs";
13
+
14
+ // Re-export
15
+ export { fsdPreset, FSD_HIERARCHY } from "./fsd";
16
+ export { cleanPreset, CLEAN_HIERARCHY } from "./clean";
17
+ export { hexagonalPreset, HEXAGONAL_HIERARCHY } from "./hexagonal";
18
+ export { atomicPreset, ATOMIC_HIERARCHY } from "./atomic";
19
+ export { cqrsPreset, CQRS_HIERARCHY } from "./cqrs";
20
+
21
+ /**
22
+ * Mandu 권장 프리셋 (FSD + Clean 조합)
23
+ *
24
+ * 풀스택 프로젝트에 최적화
25
+ */
26
+ export const manduPreset: PresetDefinition = {
27
+ name: "mandu",
28
+ description: "Mandu 권장 아키텍처 - client/server 분리 + strict shared",
29
+
30
+ hierarchy: [
31
+ // Client (FSD)
32
+ "client/app",
33
+ "client/pages",
34
+ "client/widgets",
35
+ "client/features",
36
+ "client/entities",
37
+ "client/shared",
38
+ // Shared (strict)
39
+ "shared/contracts",
40
+ "shared/types",
41
+ "shared/utils/client",
42
+ "shared/utils/server",
43
+ "shared/schema",
44
+ "shared/env",
45
+ "shared/unsafe",
46
+ // Server (Clean)
47
+ "server/api",
48
+ "server/application",
49
+ "server/domain",
50
+ "server/infra",
51
+ "server/core",
52
+ ],
53
+
54
+ layers: [
55
+ // Client layers
56
+ {
57
+ name: "client/app",
58
+ pattern: "src/client/app/**",
59
+ canImport: [
60
+ "client/pages",
61
+ "client/widgets",
62
+ "client/features",
63
+ "client/entities",
64
+ "client/shared",
65
+ "shared/contracts",
66
+ "shared/types",
67
+ "shared/utils/client",
68
+ ],
69
+ description: "클라이언트 앱 진입점",
70
+ },
71
+ {
72
+ name: "client/pages",
73
+ pattern: "src/client/pages/**",
74
+ canImport: [
75
+ "client/widgets",
76
+ "client/features",
77
+ "client/entities",
78
+ "client/shared",
79
+ "shared/contracts",
80
+ "shared/types",
81
+ "shared/utils/client",
82
+ ],
83
+ description: "클라이언트 페이지",
84
+ },
85
+ {
86
+ name: "client/widgets",
87
+ pattern: "src/client/widgets/**",
88
+ canImport: [
89
+ "client/features",
90
+ "client/entities",
91
+ "client/shared",
92
+ "shared/contracts",
93
+ "shared/types",
94
+ "shared/utils/client",
95
+ ],
96
+ description: "클라이언트 위젯",
97
+ },
98
+ {
99
+ name: "client/features",
100
+ pattern: "src/client/features/**",
101
+ canImport: [
102
+ "client/entities",
103
+ "client/shared",
104
+ "shared/contracts",
105
+ "shared/types",
106
+ "shared/utils/client",
107
+ ],
108
+ description: "클라이언트 기능",
109
+ },
110
+ {
111
+ name: "client/entities",
112
+ pattern: "src/client/entities/**",
113
+ canImport: [
114
+ "client/shared",
115
+ "shared/contracts",
116
+ "shared/types",
117
+ "shared/utils/client",
118
+ ],
119
+ description: "클라이언트 엔티티",
120
+ },
121
+ {
122
+ name: "client/shared",
123
+ pattern: "src/client/shared/**",
124
+ canImport: [
125
+ "shared/contracts",
126
+ "shared/types",
127
+ "shared/utils/client",
128
+ ],
129
+ description: "클라이언트 전용 공유",
130
+ },
131
+ // Shared layers
132
+ {
133
+ name: "shared/contracts",
134
+ pattern: "src/shared/contracts/**",
135
+ canImport: ["shared/types", "shared/utils/client"],
136
+ description: "공용 계약 (클라이언트 safe)",
137
+ },
138
+ {
139
+ name: "shared/schema",
140
+ pattern: "src/shared/schema/**",
141
+ canImport: ["shared/types", "shared/utils/server"],
142
+ description: "서버 전용 스키마 (JSON/OpenAPI)",
143
+ },
144
+ {
145
+ name: "shared/types",
146
+ pattern: "src/shared/types/**",
147
+ canImport: [],
148
+ description: "공용 타입",
149
+ },
150
+ {
151
+ name: "shared/utils/client",
152
+ pattern: "src/shared/utils/client/**",
153
+ canImport: ["shared/types"],
154
+ description: "클라이언트 safe 유틸",
155
+ },
156
+ {
157
+ name: "shared/utils/server",
158
+ pattern: "src/shared/utils/server/**",
159
+ canImport: ["shared/types", "shared/utils/client"],
160
+ description: "서버 전용 유틸",
161
+ },
162
+ {
163
+ name: "shared/env",
164
+ pattern: "src/shared/env/**",
165
+ canImport: ["shared/types", "shared/utils/client", "shared/utils/server"],
166
+ description: "서버 전용 환경/설정",
167
+ },
168
+ {
169
+ name: "shared/unsafe",
170
+ pattern: "src/shared/**",
171
+ canImport: [],
172
+ description: "금지된 shared 경로",
173
+ },
174
+ // Server layers
175
+ {
176
+ name: "server/api",
177
+ pattern: "src/server/api/**",
178
+ canImport: [
179
+ "server/application",
180
+ "server/domain",
181
+ "server/infra",
182
+ "server/core",
183
+ "shared/contracts",
184
+ "shared/schema",
185
+ "shared/types",
186
+ "shared/utils/client",
187
+ "shared/utils/server",
188
+ "shared/env",
189
+ ],
190
+ description: "서버 API 라우트, 컨트롤러",
191
+ },
192
+ {
193
+ name: "server/application",
194
+ pattern: "src/server/application/**",
195
+ canImport: [
196
+ "server/domain",
197
+ "server/core",
198
+ "shared/contracts",
199
+ "shared/schema",
200
+ "shared/types",
201
+ "shared/utils/client",
202
+ "shared/utils/server",
203
+ "shared/env",
204
+ ],
205
+ description: "서버 유스케이스, 서비스",
206
+ },
207
+ {
208
+ name: "server/domain",
209
+ pattern: "src/server/domain/**",
210
+ canImport: [
211
+ "shared/contracts",
212
+ "shared/schema",
213
+ "shared/types",
214
+ "shared/utils/client",
215
+ "shared/utils/server",
216
+ "shared/env",
217
+ ],
218
+ description: "서버 도메인 모델",
219
+ },
220
+ {
221
+ name: "server/infra",
222
+ pattern: "src/server/infra/**",
223
+ canImport: [
224
+ "server/application",
225
+ "server/domain",
226
+ "server/core",
227
+ "shared/contracts",
228
+ "shared/schema",
229
+ "shared/types",
230
+ "shared/utils/client",
231
+ "shared/utils/server",
232
+ "shared/env",
233
+ ],
234
+ description: "서버 인프라 구현",
235
+ },
236
+ {
237
+ name: "server/core",
238
+ pattern: "src/server/core/**",
239
+ canImport: [
240
+ "shared/contracts",
241
+ "shared/schema",
242
+ "shared/types",
243
+ "shared/utils/client",
244
+ "shared/utils/server",
245
+ "shared/env",
246
+ ],
247
+ description: "서버 핵심 공통",
248
+ },
249
+ ],
250
+
251
+ defaultSeverity: {
252
+ layerViolation: "error",
253
+ circularDependency: "warn",
254
+ crossSliceDependency: "warn",
255
+ deepNesting: "info",
256
+ fileType: "error",
257
+ },
258
+ };
259
+
260
+ /**
261
+ * 모든 프리셋
262
+ */
263
+ export const presets: Record<GuardPreset, PresetDefinition> = {
264
+ fsd: fsdPreset,
265
+ clean: cleanPreset,
266
+ hexagonal: hexagonalPreset,
267
+ atomic: atomicPreset,
268
+ cqrs: cqrsPreset,
269
+ mandu: manduPreset,
270
+ };
271
+
272
+ /**
273
+ * 프리셋 가져오기
274
+ */
275
+ export function getPreset(name: GuardPreset): PresetDefinition {
276
+ const preset = presets[name];
277
+ if (!preset) {
278
+ throw new Error(`Unknown guard preset: ${name}`);
279
+ }
280
+ return preset;
281
+ }
282
+
283
+ /**
284
+ * 프리셋 목록 가져오기
285
+ */
286
+ export function listPresets(): Array<{ name: GuardPreset; description: string }> {
287
+ return Object.values(presets).map((p) => ({
288
+ name: p.name,
289
+ description: p.description,
290
+ }));
291
+ }