create-sonamu 0.1.3 β†’ 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -124,8 +124,8 @@ pnpm dev
124
124
 
125
125
  πŸŽ‰ **μ™„λ£Œ!**
126
126
 
127
- - API: http://localhost:1028
128
- - Sonamu UI: http://localhost:1028/sonamu-ui (μ—”ν‹°ν‹° 관리)
127
+ - API: http://localhost:34900
128
+ - Sonamu UI: http://localhost:34900/sonamu-ui (μ—”ν‹°ν‹° 관리)
129
129
  - Web: http://localhost:3028
130
130
 
131
131
  ---
@@ -167,8 +167,8 @@ pnpm dev
167
167
 
168
168
  | μ„œλΉ„μŠ€ | 포트 | URL |
169
169
  | -------------- | ------------------ | -------------------------------- |
170
- | **API μ„œλ²„** | `BASE_PORT` (1028) | http://localhost:1028 |
171
- | **Sonamu UI** | - | http://localhost:1028/sonamu-ui |
170
+ | **API μ„œλ²„** | `BASE_PORT` (34900) | http://localhost:34900 |
171
+ | **Sonamu UI** | - | http://localhost:34900/sonamu-ui |
172
172
  | **Web 개발** | `BASE_PORT + 2000` (3028) | http://localhost:3028 |
173
173
  | **PostgreSQL** | 5432 | - |
174
174
 
@@ -188,11 +188,13 @@ pnpm dev
188
188
  | `pnpm build` | ν”„λ‘œλ•μ…˜ λΉŒλ“œ |
189
189
  | `pnpm start` | ν”„λ‘œλ•μ…˜ μ„œλ²„ μ‹€ν–‰ |
190
190
  | `pnpm test` | ν…ŒμŠ€νŠΈ μ‹€ν–‰ |
191
- | `pnpm db:up` | Docker λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμž‘ |
192
- | `pnpm db:down` | Docker λ°μ΄ν„°λ² μ΄μŠ€ 쀑지 |
193
- | `pnpm db:reset` | λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™” (λ³Όλ₯¨ μ‚­μ œ ν›„ μž¬μ‹œμž‘) |
191
+ | `pnpm docker:up` | Docker λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμž‘ |
192
+ | `pnpm docker:down` | Docker λ°μ΄ν„°λ² μ΄μŠ€ 쀑지 |
193
+ | `pnpm docker:reset` | λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™” (λ³Όλ₯¨ μ‚­μ œ ν›„ μž¬μ‹œμž‘) |
194
194
  | `pnpm dump` | ν…ŒμŠ€νŠΈ DB β†’ 덀프 파일 생성 |
195
195
  | `pnpm seed` | 덀프 파일 β†’ fixture DB 적용 |
196
+ | `pnpm sonamu skills sync` | 곡식 Skills 동기화 |
197
+ | `pnpm sonamu skills create <name>` | μ»€μŠ€ν…€ Skill 생성 |
196
198
 
197
199
  ### Web (`web/`)
198
200
 
@@ -210,7 +212,7 @@ pnpm dev
210
212
 
211
213
  ### 1. μ—”ν‹°ν‹° 생성
212
214
 
213
- API μ„œλ²„λ₯Ό μ‹€ν–‰ν•œ μƒνƒœμ—μ„œ http://localhost:1028/sonamu-ui 접속 β†’ **Entities** νƒ­ β†’ **+ Entity** 클릭
215
+ API μ„œλ²„λ₯Ό μ‹€ν–‰ν•œ μƒνƒœμ—μ„œ http://localhost:34900/sonamu-ui 접속 β†’ **Entities** νƒ­ β†’ **+ Entity** 클릭
214
216
 
215
217
  ### 2. μžλ™ μƒμ„±λ˜λŠ” νŒŒμΌλ“€
216
218
 
@@ -292,6 +294,120 @@ function UserListPage() {
292
294
 
293
295
  ---
294
296
 
297
+ ## πŸ€– AI 개발 λ„μš°λ―Έ (Skills)
298
+
299
+ Sonamu ν”„λ‘œμ νŠΈλŠ” **Claude Code**와 ν•¨κ»˜ μ‚¬μš©ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. SkillsλŠ” AIκ°€ Sonamu ν”„λ ˆμž„μ›Œν¬λ₯Ό 더 잘 μ΄ν•΄ν•˜κ³  ν™œμš©ν•  수 μžˆλ„λ‘ λ•λŠ” 지식 λ² μ΄μŠ€μž…λ‹ˆλ‹€.
300
+
301
+ ### μžλ™ μ„€μΉ˜
302
+
303
+ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜λ©΄ `.claude/skills/sonamu` 디렉토리가 μžλ™μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€ (postinstall 슀크립트 μ‹€ν–‰).
304
+
305
+ ```
306
+ .claude/
307
+ β”œβ”€β”€ skills/
308
+ β”‚ β”œβ”€β”€ sonamu/ # 곡식 Sonamu Skills (μžλ™ 동기화)
309
+ β”‚ β”‚ β”œβ”€β”€ api.md
310
+ β”‚ β”‚ β”œβ”€β”€ entity-basic.md
311
+ β”‚ β”‚ β”œβ”€β”€ model.md
312
+ β”‚ β”‚ β”œβ”€β”€ puri.md
313
+ β”‚ β”‚ └── ...
314
+ β”‚ └── local/ # ν”„λ‘œμ νŠΈλ³„ μ»€μŠ€ν…€ Skills
315
+ β”‚ └── my-skill.md
316
+ └── CLAUDE.md # ν”„λ‘œμ νŠΈ AI κ°€μ΄λ“œ (Sonamu μ„Ήμ…˜ 포함)
317
+ ```
318
+
319
+ ### Skills 동기화
320
+
321
+ Sonamu μ—…λ°μ΄νŠΈ ν›„ μ΅œμ‹  Skillsλ₯Ό λ°˜μ˜ν•˜λ €λ©΄:
322
+
323
+ ```bash
324
+ pnpm sonamu skills sync
325
+ ```
326
+
327
+ 이 λͺ…령은:
328
+ - μ΅œμ‹  곡식 Skillsλ₯Ό `.claude/skills/sonamu`둜 동기화 (symlink λ˜λŠ” 볡사)
329
+ - `CLAUDE.md`의 Sonamu κ΄€λ ¨ μ„Ήμ…˜μ„ μ—…λ°μ΄νŠΈ (마컀 μ˜μ—­λ§Œ)
330
+
331
+ ### μ»€μŠ€ν…€ Skill 생성
332
+
333
+ ν”„λ‘œμ νŠΈμ—μ„œ λ°œκ²¬ν•œ ν•΄κ²° λ°©λ²•μ΄λ‚˜ νŒμ„ Skill둜 μ €μž₯:
334
+
335
+ ```bash
336
+ pnpm sonamu skills create migration-helper
337
+ ```
338
+
339
+ μƒμ„±λœ νŒŒμΌμ„ νŽΈμ§‘:
340
+
341
+ ```markdown
342
+ ---
343
+ name: migration-helper
344
+ category: other
345
+ created_at: 2026-02-03
346
+ status: draft
347
+ ---
348
+
349
+ # λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ FK μˆœμ„œ 문제 ν•΄κ²°
350
+
351
+ ## 상황
352
+
353
+ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ—μ„œ μ™Έλž˜ν‚€λ₯Ό μΆ”κ°€ν•  λ•Œ ν…Œμ΄λΈ” 생성 μˆœμ„œκ°€ λ§žμ§€ μ•Šμ•„ μ—λŸ¬ λ°œμƒ
354
+
355
+ ## ν•΄κ²° 방법
356
+
357
+ μ°Έμ‘°λ˜λŠ” ν…Œμ΄λΈ”μ„ λ¨Όμ € μƒμ„±ν•˜κ³ , μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ„ λ‚˜μ€‘μ— 생성
358
+
359
+ ## μ½”λ“œ μ˜ˆμ‹œ
360
+
361
+ \`\`\`typescript
362
+ // 1. users ν…Œμ΄λΈ” λ¨Όμ € 생성
363
+ await knex.schema.createTable('users', ...)
364
+
365
+ // 2. posts ν…Œμ΄λΈ” λ‚˜μ€‘μ— 생성 (users μ°Έμ‘°)
366
+ await knex.schema.createTable('posts', (table) => {
367
+ table.integer('user_id').references('users.id')
368
+ })
369
+ \`\`\`
370
+ ```
371
+
372
+ **파일λͺ… κ·œμΉ™**:
373
+ - μžλ™μœΌλ‘œ μ•ˆμ „ν•œ μ΄λ¦„μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€
374
+ - 예: `"bug fix"` β†’ `bug-fix.md`
375
+ - 예: `"λ§ˆμ΄κ·Έλ ˆμ΄μ…˜/헬퍼"` β†’ `λ§ˆμ΄κ·Έλ ˆμ΄μ…˜-헬퍼.md`
376
+
377
+ ### μ‚¬μš© κ°€λŠ₯ν•œ Skills
378
+
379
+ μƒμ„±λœ ν”„λ‘œμ νŠΈμ— ν¬ν•¨λœ μ£Όμš” Skills:
380
+
381
+ | Skill | μ„€λͺ… |
382
+ |-------|------|
383
+ | **project-init** | ν”„λ‘œμ νŠΈ 생성 및 μ΄ˆκΈ°ν™” |
384
+ | **entity-basic** | Entity 생성/μˆ˜μ • κΈ°λ³Έ |
385
+ | **entity-relations** | Entity 관계 μ •μ˜ (BelongsToOne, HasMany λ“±) |
386
+ | **model** | Model 클래슀 μž‘μ„± νŒ¨ν„΄ |
387
+ | **api** | @api λ°μ½”λ ˆμ΄ν„°λ‘œ API λ…ΈμΆœ |
388
+ | **puri** | νƒ€μž… μ•ˆμ „ 쿼리 λΉŒλ” μ‚¬μš©λ²• |
389
+ | **subset** | API 응닡 ν•„λ“œ λ²”μœ„ μ •μ˜ |
390
+ | **upsert** | 관계 데이터 μ €μž₯ (UpsertBuilder) |
391
+ | **testing** | ν…ŒμŠ€νŠΈ μž‘μ„± (bootstrap, test, testAs) |
392
+ | **migration** | λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ |
393
+ | **frontend** | ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ API 호좜 |
394
+ | **i18n** | λ‹€κ΅­μ–΄ 지원 |
395
+ | **workflow** | 전체 개발 μ›Œν¬ν”Œλ‘œμš° |
396
+
397
+ ### Claude Code μ‚¬μš© 팁
398
+
399
+ Skillsκ°€ μ„€μ •λ˜λ©΄ Claudeμ—κ²Œ λ‹€μŒκ³Ό 같이 μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
400
+
401
+ ```
402
+ "User μ—”ν‹°ν‹°λ₯Ό μƒμ„±ν•˜κ³  CRUD APIλ₯Ό λ§Œλ“€μ–΄μ€˜"
403
+ "Post와 Comment의 관계λ₯Ό μ„€μ •ν•΄μ€˜"
404
+ "API ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ€˜"
405
+ ```
406
+
407
+ ClaudeλŠ” `.claude/skills/sonamu`의 지식을 ν™œμš©ν•˜μ—¬ Sonamu 방식에 λ§žλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
408
+
409
+ ---
410
+
295
411
  ## πŸ—„οΈ λ°μ΄ν„°λ² μ΄μŠ€
296
412
 
297
413
  ### Docker 이미지
@@ -356,7 +472,7 @@ pnpm sonamu fixture sync # ν…ŒμŠ€νŠΈ DB둜 동기화
356
472
 
357
473
  ## πŸ“š 더 μ•Œμ•„λ³΄κΈ°
358
474
 
359
- - πŸ“– [Sonamu 곡식 λ¬Έμ„œ](https://rurruur.github.io/test-docs)
475
+ - πŸ“– [Sonamu 곡식 λ¬Έμ„œ](https://sonamu.cartanova.ai/)
360
476
  - πŸ’¬ [이슈 & ν”Όλ“œλ°±](https://github.com/cartanova-ai/sonamu/issues)
361
477
 
362
478
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-sonamu",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Create a new Sonamu project",
5
5
  "keywords": [
6
6
  "sonamu",
@@ -56,12 +56,12 @@ pnpm dev
56
56
  ```
57
57
 
58
58
  API μ„œλ²„κ°€ μ‹œμž‘λ˜λ©΄ λ‹€μŒ μ£Όμ†Œλ‘œ 접속할 수 μžˆμŠ΅λ‹ˆλ‹€:
59
- - **API μ„œλ²„**: http://localhost:1028
60
- - **Sonamu UI**: http://localhost:1028/sonamu-ui (μ—”ν‹°ν‹° 관리)
59
+ - **API μ„œλ²„**: http://localhost:34900
60
+ - **Sonamu UI**: http://localhost:34900/sonamu-ui (μ—”ν‹°ν‹° 관리)
61
61
 
62
62
  ### 4. 첫 번째 μ—”ν‹°ν‹° 생성
63
63
 
64
- 1. Sonamu UI μ—΄κΈ°: http://localhost:1028/sonamu-ui
64
+ 1. Sonamu UI μ—΄κΈ°: http://localhost:34900/sonamu-ui
65
65
  2. **Entities** νƒ­ β†’ **"+ Entity"** 클릭
66
66
  3. μ—”ν‹°ν‹° μ •μ˜ (예: `User`, `Post`)
67
67
  4. `api/src/application/`κ³Ό `web/src/services/`에 파일이 μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€
@@ -107,8 +107,8 @@ web/src/services/
107
107
 
108
108
  | μ„œλΉ„μŠ€ | 포트 | URL |
109
109
  | ----------- | ----------------------- | ------------------------------- |
110
- | API μ„œλ²„ | `BASE_PORT` (κΈ°λ³Έ 1028) | http://localhost:1028 |
111
- | Sonamu UI | - | http://localhost:1028/sonamu-ui |
110
+ | API μ„œλ²„ | `BASE_PORT` (κΈ°λ³Έ 34900) | http://localhost:34900 |
111
+ | Sonamu UI | - | http://localhost:34900/sonamu-ui |
112
112
  | Web ν΄λΌμ΄μ–ΈνŠΈ | `BASE_PORT + 2000` | http://localhost:3028 |
113
113
  | PostgreSQL | 5432 | - |
114
114
 
@@ -135,6 +135,8 @@ web/src/services/
135
135
  | `pnpm docker:reset` | Docker DB μ΄ˆκΈ°ν™” (λ³Όλ₯¨ μ‚­μ œ ν›„ μž¬μ‹œμž‘) |
136
136
  | `pnpm dump` | ν…ŒμŠ€νŠΈ DB 덀프 생성 |
137
137
  | `pnpm seed` | 덀프λ₯Ό fixture DB에 적용 |
138
+ | `pnpm sonamu skills sync` | 곡식 Skills 동기화 |
139
+ | `pnpm sonamu skills create <name>` | μ»€μŠ€ν…€ Skill 생성 |
138
140
 
139
141
  ### Web (`packages/web/`)
140
142
 
@@ -148,7 +150,7 @@ web/src/services/
148
150
 
149
151
  ### 1. μ—”ν‹°ν‹° 생성
150
152
 
151
- 1. API μ„œλ²„ μ‹œμž‘ ν›„ Sonamu UI μ—΄κΈ° (http://localhost:1028/sonamu-ui)
153
+ 1. API μ„œλ²„ μ‹œμž‘ ν›„ Sonamu UI μ—΄κΈ° (http://localhost:34900/sonamu-ui)
152
154
  2. **Entities** νƒ­ β†’ **"+ Entity"** 클릭
153
155
  3. μ—”ν‹°ν‹° 정보 μž…λ ₯ (이름, ν•„λ“œ λ“±)
154
156
  4. **Create** 클릭 - 파일이 μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€!
@@ -224,6 +226,118 @@ pnpm seed
224
226
  pnpm sonamu fixture sync
225
227
  ```
226
228
 
229
+ ---
230
+
231
+ ## πŸ€– AI 개발 λ„μš°λ―Έ (Skills)
232
+
233
+ 이 ν”„λ‘œμ νŠΈλŠ” **Claude Code**와 ν•¨κ»˜ μ‚¬μš©ν•˜λ„λ‘ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. `.claude/skills/sonamu` λ””λ ‰ν† λ¦¬μ—λŠ” Sonamu ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©λ²•μ„ Claudeκ°€ 이해할 수 μžˆλ„λ‘ λ•λŠ” 지식 λ² μ΄μŠ€κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
234
+
235
+ ### Skills 디렉토리 ꡬ쑰
236
+
237
+ ```
238
+ .claude/
239
+ β”œβ”€β”€ skills/
240
+ β”‚ β”œβ”€β”€ sonamu/ # 곡식 Sonamu Skills (μžλ™ 동기화)
241
+ β”‚ β”‚ β”œβ”€β”€ api.md
242
+ β”‚ β”‚ β”œβ”€β”€ entity-basic.md
243
+ β”‚ β”‚ β”œβ”€β”€ model.md
244
+ β”‚ β”‚ β”œβ”€β”€ puri.md
245
+ β”‚ β”‚ └── ...
246
+ β”‚ └── local/ # ν”„λ‘œμ νŠΈλ³„ μ»€μŠ€ν…€ Skills
247
+ β”‚ └── my-skill.md
248
+ └── CLAUDE.md # ν”„λ‘œμ νŠΈ AI κ°€μ΄λ“œ (Sonamu μ„Ήμ…˜ 포함)
249
+ ```
250
+
251
+ ### Skills μ΅œμ‹ ν™”
252
+
253
+ Sonamu μ—…λ°μ΄νŠΈ ν›„ μ΅œμ‹  Skillsλ₯Ό λ°˜μ˜ν•˜λ €λ©΄:
254
+
255
+ ```bash
256
+ pnpm sonamu skills sync
257
+ ```
258
+
259
+ 이 λͺ…령은:
260
+ - μ΅œμ‹  곡식 Skillsλ₯Ό `.claude/skills/sonamu`둜 동기화
261
+ - `CLAUDE.md`의 Sonamu κ΄€λ ¨ μ„Ήμ…˜μ„ μ—…λ°μ΄νŠΈ
262
+
263
+ ### μ»€μŠ€ν…€ Skill 생성
264
+
265
+ ν”„λ‘œμ νŠΈ 개발 쀑 λ°œκ²¬ν•œ ν•΄κ²° λ°©λ²•μ΄λ‚˜ νŒμ„ Skill둜 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
266
+
267
+ ```bash
268
+ pnpm sonamu skills create migration-helper
269
+ ```
270
+
271
+ μƒμ„±λœ `.claude/skills/local/migration-helper.md` νŒŒμΌμ„ νŽΈμ§‘:
272
+
273
+ ```markdown
274
+ ---
275
+ name: migration-helper
276
+ category: other
277
+ created_at: 2026-02-03
278
+ status: draft
279
+ ---
280
+
281
+ # λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ FK μˆœμ„œ 문제 ν•΄κ²°
282
+
283
+ ## 상황
284
+
285
+ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ—μ„œ μ™Έλž˜ν‚€λ₯Ό μΆ”κ°€ν•  λ•Œ ν…Œμ΄λΈ” 생성 μˆœμ„œκ°€ λ§žμ§€ μ•Šμ•„ μ—λŸ¬ λ°œμƒ
286
+
287
+ ## ν•΄κ²° 방법
288
+
289
+ μ°Έμ‘°λ˜λŠ” ν…Œμ΄λΈ”μ„ λ¨Όμ € μƒμ„±ν•˜κ³ , μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ„ λ‚˜μ€‘μ— 생성
290
+
291
+ ## μ½”λ“œ μ˜ˆμ‹œ
292
+
293
+ \`\`\`typescript
294
+ // 1. users ν…Œμ΄λΈ” λ¨Όμ € 생성
295
+ await knex.schema.createTable('users', ...)
296
+
297
+ // 2. posts ν…Œμ΄λΈ” λ‚˜μ€‘μ— 생성 (users μ°Έμ‘°)
298
+ await knex.schema.createTable('posts', (table) => {
299
+ table.integer('user_id').references('users.id')
300
+ })
301
+ \`\`\`
302
+ ```
303
+
304
+ **파일λͺ… κ·œμΉ™**:
305
+ - μžλ™μœΌλ‘œ μ•ˆμ „ν•œ μ΄λ¦„μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€
306
+ - 예: `"bug fix"` β†’ `bug-fix.md`
307
+ - 예: `"λ§ˆμ΄κ·Έλ ˆμ΄μ…˜/헬퍼"` β†’ `λ§ˆμ΄κ·Έλ ˆμ΄μ…˜-헬퍼.md`
308
+
309
+ ### μ£Όμš” Skills
310
+
311
+ | Skill | μ„€λͺ… |
312
+ |-------|------|
313
+ | **project-init** | ν”„λ‘œμ νŠΈ 생성 및 μ΄ˆκΈ°ν™” |
314
+ | **entity-basic** | Entity 생성/μˆ˜μ • κΈ°λ³Έ |
315
+ | **entity-relations** | Entity 관계 μ •μ˜ (BelongsToOne, HasMany λ“±) |
316
+ | **model** | Model 클래슀 μž‘μ„± νŒ¨ν„΄ |
317
+ | **api** | @api λ°μ½”λ ˆμ΄ν„°λ‘œ API λ…ΈμΆœ |
318
+ | **puri** | νƒ€μž… μ•ˆμ „ 쿼리 λΉŒλ” μ‚¬μš©λ²• |
319
+ | **subset** | API 응닡 ν•„λ“œ λ²”μœ„ μ •μ˜ |
320
+ | **upsert** | 관계 데이터 μ €μž₯ (UpsertBuilder) |
321
+ | **testing** | ν…ŒμŠ€νŠΈ μž‘μ„± (bootstrap, test, testAs) |
322
+ | **migration** | λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ |
323
+ | **frontend** | ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ API 호좜 |
324
+ | **i18n** | λ‹€κ΅­μ–΄ 지원 |
325
+ | **workflow** | 전체 개발 μ›Œν¬ν”Œλ‘œμš° |
326
+
327
+ ### Claude Code μ‚¬μš© μ˜ˆμ‹œ
328
+
329
+ Skillsκ°€ μ„€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ Claudeμ—κ²Œ λ‹€μŒκ³Ό 같이 μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
330
+
331
+ ```
332
+ "User μ—”ν‹°ν‹°λ₯Ό μƒμ„±ν•˜κ³  CRUD APIλ₯Ό λ§Œλ“€μ–΄μ€˜"
333
+ "Post와 Comment의 관계λ₯Ό μ„€μ •ν•΄μ€˜"
334
+ "API ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ€˜"
335
+ ```
336
+
337
+ ClaudeλŠ” `.claude/skills/sonamu`의 지식을 ν™œμš©ν•˜μ—¬ Sonamu 방식에 λ§žλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
338
+
339
+ ---
340
+
227
341
  ## λ°μ΄ν„°λ² μ΄μŠ€
228
342
 
229
343
  ### Docker 이미지
@@ -267,8 +381,8 @@ pnpm sonamu fixture sync
267
381
 
268
382
  ## πŸ“š 더 μ•Œμ•„λ³΄κΈ°
269
383
 
270
- - [Sonamu λ¬Έμ„œ](https://rurruur.github.io/test-docs)
271
- - [Sonamu GitHub](https://github.com/ping-alive/sonamu)
384
+ - [Sonamu λ¬Έμ„œ](https://sonamu.cartanova.ai)
385
+ - [Sonamu GitHub](https://github.com/cartanova-ai/sonamu)
272
386
  - [Fastify λ¬Έμ„œ](https://www.fastify.io/)
273
387
  - [TanStack Router](https://tanstack.com/router)
274
388
  - [TanStack Query](https://tanstack.com/query)
@@ -32,13 +32,14 @@
32
32
  "@swc/core": "^1.13.5",
33
33
  "ai": "^6.0.1",
34
34
  "bcrypt": "^6.0.0",
35
+ "better-auth": "^1.4.18",
35
36
  "chalk": "^4.1.2",
36
37
  "date-fns": "^4.1.0",
37
38
  "dotenv": "^16",
38
39
  "knex": "^3.1.0",
39
40
  "pg": "^8.16.3",
40
41
  "radashi": "^12.2.0",
41
- "sonamu": "^0.7.50",
42
+ "sonamu": "^0.7.51",
42
43
  "zod": "^4.3.6"
43
44
  },
44
45
  "devDependencies": {
@@ -32,6 +32,7 @@
32
32
  "@swc/core": "catalog:",
33
33
  "ai": "catalog:",
34
34
  "bcrypt": "catalog:",
35
+ "better-auth": "catalog:",
35
36
  "chalk": "catalog:",
36
37
  "date-fns": "catalog:",
37
38
  "dotenv": "catalog:",
@@ -45,32 +45,26 @@ export default defineConfig({
45
45
  root: path.join(import.meta.dirname, "/../", "public"),
46
46
  prefix: "/api/public",
47
47
  },
48
- session: {
49
- secret: process.env.SESSION_SECRET || "sonamu-secret-key-change-this-in-production",
50
- salt: process.env.SESSION_SALT || "mq9hDxBCDbsQDR6N",
51
- cookie: {
52
- domain: "localhost",
53
- path: "/",
54
- maxAge: 60 * 60 * 24 * 365 * 10,
55
- },
56
- },
57
48
  custom: (_server) => {
58
49
  // nothing yet
59
50
  },
60
51
  },
61
-
62
- auth: true,
63
- // auth: {
64
- // userSerializer: async (user, _request) => user,
65
- // userDeserializer: async (serialized, _request) => serialized,
66
- // },
52
+
53
+ auth:{
54
+ emailAndPassword: { enabled: true },
55
+ baseURL: process.env.BETTER_AUTH_URL ?? `http://${host}:${port}`,
56
+ secret: process.env.BETTER_AUTH_SECRET ?? "miomock-secret-key-change-this-in-production",
57
+ trustedOrigins: ["http://localhost:5173"],
58
+ session: {
59
+ expiresIn: 60 * 60 * 24 * 365,
60
+ },
61
+ },
67
62
 
68
63
  apiConfig: {
69
64
  contextProvider: (defaultContext, request) => {
70
65
  return {
71
66
  ...defaultContext,
72
67
  ip: request.ip,
73
- session: request.session,
74
68
  body: request.body,
75
69
  };
76
70
  },
@@ -1,12 +1,10 @@
1
1
  /** biome-ignore-all lint/correctness/noUnusedImports: d.ts */
2
2
 
3
- import type { Session } from "@fastify/secure-session";
4
3
  import {} from "sonamu";
5
4
 
6
5
  declare module "sonamu" {
7
6
  export interface ContextExtend {
8
7
  ip: string;
9
- session: Session;
10
8
  }
11
9
 
12
10
  export interface GuardKeys {
@@ -14,6 +14,7 @@
14
14
  "@tanstack/react-query": "^5.90.12",
15
15
  "@tanstack/react-router": "1.143.11",
16
16
  "axios": "^1.13.2",
17
+ "better-auth": "^1.4.18",
17
18
  "clsx": "^2.1.1",
18
19
  "dotenv": "^16",
19
20
  "eventsource": "^4.1.0",
@@ -14,6 +14,7 @@
14
14
  "@tanstack/react-query": "catalog:",
15
15
  "@tanstack/react-router": "catalog:",
16
16
  "axios": "catalog:",
17
+ "better-auth": "catalog:",
17
18
  "clsx": "catalog:",
18
19
  "dotenv": "catalog:",
19
20
  "eventsource": "catalog:",