@mandujs/core 0.12.2 → 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 (173) hide show
  1. package/README.ko.md +304 -304
  2. package/README.md +653 -653
  3. package/package.json +1 -1
  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/presets/atomic.ts +70 -70
  106. package/src/guard/presets/clean.ts +77 -77
  107. package/src/guard/presets/cqrs.test.ts +35 -14
  108. package/src/guard/presets/fsd.ts +79 -79
  109. package/src/guard/presets/hexagonal.ts +68 -68
  110. package/src/guard/presets/index.ts +291 -291
  111. package/src/guard/reporter.ts +445 -445
  112. package/src/guard/rules.ts +12 -12
  113. package/src/guard/statistics.ts +578 -578
  114. package/src/guard/suggestions.ts +358 -358
  115. package/src/guard/types.ts +348 -348
  116. package/src/guard/validator.ts +834 -834
  117. package/src/guard/watcher.ts +404 -404
  118. package/src/index.ts +1 -0
  119. package/src/intent/index.ts +310 -310
  120. package/src/island/index.ts +304 -304
  121. package/src/logging/index.ts +22 -22
  122. package/src/logging/transports.ts +365 -365
  123. package/src/paths.test.ts +47 -0
  124. package/src/paths.ts +47 -0
  125. package/src/plugins/index.ts +38 -38
  126. package/src/plugins/registry.ts +377 -377
  127. package/src/plugins/types.ts +363 -363
  128. package/src/report/build.ts +1 -1
  129. package/src/report/index.ts +1 -1
  130. package/src/router/fs-patterns.ts +387 -387
  131. package/src/router/fs-routes.ts +344 -401
  132. package/src/router/fs-scanner.ts +497 -497
  133. package/src/router/fs-types.ts +270 -278
  134. package/src/router/index.ts +81 -81
  135. package/src/runtime/boundary.tsx +232 -232
  136. package/src/runtime/compose.ts +222 -222
  137. package/src/runtime/lifecycle.ts +381 -381
  138. package/src/runtime/logger.test.ts +345 -345
  139. package/src/runtime/logger.ts +677 -677
  140. package/src/runtime/router.test.ts +476 -476
  141. package/src/runtime/router.ts +105 -105
  142. package/src/runtime/security.ts +155 -155
  143. package/src/runtime/server.ts +24 -24
  144. package/src/runtime/session-key.ts +328 -328
  145. package/src/runtime/ssr.ts +367 -367
  146. package/src/runtime/streaming-ssr.ts +1245 -1245
  147. package/src/runtime/trace.ts +144 -144
  148. package/src/seo/index.ts +214 -214
  149. package/src/seo/integration/ssr.ts +307 -307
  150. package/src/seo/render/basic.ts +427 -427
  151. package/src/seo/render/index.ts +143 -143
  152. package/src/seo/render/jsonld.ts +539 -539
  153. package/src/seo/render/opengraph.ts +191 -191
  154. package/src/seo/render/robots.ts +116 -116
  155. package/src/seo/render/sitemap.ts +137 -137
  156. package/src/seo/render/twitter.ts +126 -126
  157. package/src/seo/resolve/index.ts +353 -353
  158. package/src/seo/resolve/opengraph.ts +143 -143
  159. package/src/seo/resolve/robots.ts +73 -73
  160. package/src/seo/resolve/title.ts +94 -94
  161. package/src/seo/resolve/twitter.ts +73 -73
  162. package/src/seo/resolve/url.ts +97 -97
  163. package/src/seo/routes/index.ts +290 -290
  164. package/src/seo/types.ts +575 -575
  165. package/src/slot/validator.ts +39 -39
  166. package/src/spec/index.ts +3 -3
  167. package/src/spec/load.ts +76 -76
  168. package/src/spec/lock.ts +56 -56
  169. package/src/utils/bun.ts +8 -8
  170. package/src/utils/lru-cache.ts +75 -75
  171. package/src/utils/safe-io.ts +188 -188
  172. package/src/utils/string-safe.ts +298 -298
  173. package/src/watcher/rules.ts +5 -5
@@ -1,291 +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
- 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
- }
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
+ }