create-sonamu 0.1.17 → 0.2.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.
- package/README.md +69 -65
- package/catalog.json +14 -12
- package/index.js +444 -506
- package/package.json +24 -25
- package/template/src/.oxfmtrc.json +23 -0
- package/template/src/.oxlintrc.json +24 -0
- package/template/src/.zed/settings.json +14 -14
- package/template/src/gitignore +2 -1
- package/template/src/package.json +5 -4
- package/template/src/packages/api/custom-sequencer.ts +1 -1
- package/template/src/packages/api/package.json +10 -8
- package/template/src/packages/api/package.json.bak +5 -3
- package/template/src/packages/api/src/index.ts +1 -1
- package/template/src/packages/api/src/typings/fastify.d.ts +1 -1
- package/template/src/packages/api/src/typings/sonamu.d.ts +2 -3
- package/template/src/packages/api/tsconfig.json +3 -1
- package/template/src/packages/web/package.json +4 -4
- package/template/src/packages/web/package.json.bak +1 -1
- package/template/src/packages/web/src/admin-common/ApiLogViewer.tsx +4 -4
- package/template/src/packages/web/src/entry-client.tsx +2 -2
- package/template/src/packages/web/src/services/sonamu.shared.ts +2 -2
- package/template/src/packages/web/tsconfig.app.json +25 -0
- package/template/src/packages/web/tsconfig.json +5 -22
- package/template/src/packages/web/tsconfig.node.json +2 -1
- package/template/src/packages/web/vite.config.ts +6 -5
- package/template/src/biome.json +0 -84
- package/template/src/packages/api/.swcrc +0 -18
package/README.md
CHANGED
|
@@ -42,6 +42,7 @@ pnpm create sonamu
|
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
> **프로젝트명 규칙**
|
|
45
|
+
>
|
|
45
46
|
> - 공백(space) 사용 불가
|
|
46
47
|
> - 하이픈(`-`) 사용 불가 (PostgreSQL DB 이름, 환경변수 호환성)
|
|
47
48
|
> - 언더스코어(`_`) 권장 (예: `my_project`, `test_app`)
|
|
@@ -92,18 +93,18 @@ pnpm create sonamu my_app \
|
|
|
92
93
|
|
|
93
94
|
#### 사용 가능한 옵션
|
|
94
95
|
|
|
95
|
-
| 옵션
|
|
96
|
-
|
|
|
97
|
-
| `--yes`, `-y`
|
|
98
|
-
| `--pnpm`
|
|
99
|
-
| `--docker`
|
|
100
|
-
| `--skip-pnpm`
|
|
101
|
-
| `--skip-docker`
|
|
102
|
-
| `--db-user`
|
|
103
|
-
| `--db-password`
|
|
104
|
-
| `--db-name`
|
|
105
|
-
| `--container-name`
|
|
106
|
-
| `--docker-project`, `--docker-pj-name` | Docker Compose 프로젝트명
|
|
96
|
+
| 옵션 | 설명 | 기본값 |
|
|
97
|
+
| -------------------------------------- | --------------------------------------------- | ---------------------- |
|
|
98
|
+
| `--yes`, `-y` | 모든 질문에 기본값으로 자동 응답 | - |
|
|
99
|
+
| `--pnpm` | pnpm 설치 여부 (`y`/`n`) | (프롬프트로 질문) |
|
|
100
|
+
| `--docker` | Docker DB 설정 여부 (`y`/`n`) | (프롬프트로 질문) |
|
|
101
|
+
| `--skip-pnpm` | pnpm 설치 건너뛰기 (`--pnpm n`과 동일) | false |
|
|
102
|
+
| `--skip-docker` | Docker DB 설정 건너뛰기 (`--docker n`과 동일) | false |
|
|
103
|
+
| `--db-user` | 데이터베이스 사용자 | postgres |
|
|
104
|
+
| `--db-password` | 데이터베이스 비밀번호 | 1234 |
|
|
105
|
+
| `--db-name` | 데이터베이스 이름 | {프로젝트명} |
|
|
106
|
+
| `--container-name` | Docker 컨테이너 이름 | {프로젝트명}-container |
|
|
107
|
+
| `--docker-project`, `--docker-pj-name` | Docker Compose 프로젝트명 | {프로젝트명}-docker |
|
|
107
108
|
|
|
108
109
|
> **참고**: `--pnpm y`, `--docker y`에서 `y`는 `yes`, `true`, `1`로도 지정할 수 있습니다. 마찬가지로 `n`은 `no`, `false`, `0`으로도 지정할 수 있습니다.
|
|
109
110
|
|
|
@@ -163,13 +164,14 @@ pnpm dev
|
|
|
163
164
|
|
|
164
165
|
> 여러 프로젝트를 동시에 실행할 수 있습니다.
|
|
165
166
|
|
|
166
|
-
| 서비스
|
|
167
|
-
|
|
|
168
|
-
| **API + Web (통합)** | `BASE_PORT` (34900) | http://localhost:34900
|
|
169
|
-
| **Sonamu UI**
|
|
170
|
-
| **PostgreSQL**
|
|
167
|
+
| 서비스 | 포트 | URL |
|
|
168
|
+
| -------------------- | ------------------- | -------------------------------- |
|
|
169
|
+
| **API + Web (통합)** | `BASE_PORT` (34900) | http://localhost:34900 |
|
|
170
|
+
| **Sonamu UI** | - | http://localhost:34900/sonamu-ui |
|
|
171
|
+
| **PostgreSQL** | 5432 | - |
|
|
171
172
|
|
|
172
173
|
**참고**:
|
|
174
|
+
|
|
173
175
|
- `sonamu dev` (= `sonamu dev all`)은 API와 Web을 하나의 포트(one-port)로 통합 서빙합니다
|
|
174
176
|
- Sonamu UI는 API 서버에 통합되어 있어 별도 실행이 필요 없습니다
|
|
175
177
|
- Web만 별도로 실행하려면 `sonamu dev web`을 사용하세요
|
|
@@ -180,40 +182,40 @@ pnpm dev
|
|
|
180
182
|
|
|
181
183
|
### API (`api/`)
|
|
182
184
|
|
|
183
|
-
| 명령어
|
|
184
|
-
|
|
|
185
|
-
| `pnpm dev`
|
|
186
|
-
| `pnpm build`
|
|
187
|
-
| `pnpm build api`
|
|
188
|
-
| `pnpm build web`
|
|
189
|
-
| `pnpm start`
|
|
190
|
-
| `pnpm test`
|
|
191
|
-
| `pnpm docker:up`
|
|
192
|
-
| `pnpm docker:down`
|
|
193
|
-
| `pnpm docker:reset`
|
|
194
|
-
| `pnpm dump`
|
|
195
|
-
| `pnpm seed`
|
|
196
|
-
| `pnpm sonamu skills sync`
|
|
197
|
-
| `pnpm sonamu skills create <name>` | 커스텀 Skill 생성
|
|
185
|
+
| 명령어 | 설명 |
|
|
186
|
+
| ---------------------------------- | ----------------------------------------- |
|
|
187
|
+
| `pnpm dev` | 통합 개발 서버 시작 (= `sonamu dev all`) |
|
|
188
|
+
| `pnpm build` | 전체 프로덕션 빌드 (= `sonamu build all`) |
|
|
189
|
+
| `pnpm build api` | API만 빌드 (= `sonamu build api`) |
|
|
190
|
+
| `pnpm build web` | Web만 빌드 (= `sonamu build web`) |
|
|
191
|
+
| `pnpm start` | 프로덕션 서버 실행 |
|
|
192
|
+
| `pnpm test` | 테스트 실행 |
|
|
193
|
+
| `pnpm docker:up` | Docker 데이터베이스 시작 |
|
|
194
|
+
| `pnpm docker:down` | Docker 데이터베이스 중지 |
|
|
195
|
+
| `pnpm docker:reset` | 데이터베이스 초기화 (볼륨 삭제 후 재시작) |
|
|
196
|
+
| `pnpm dump` | 테스트 DB → 덤프 파일 생성 |
|
|
197
|
+
| `pnpm seed` | 덤프 파일 → fixture DB 적용 |
|
|
198
|
+
| `pnpm sonamu skills sync` | 공식 Skills 동기화 |
|
|
199
|
+
| `pnpm sonamu skills create <name>` | 커스텀 Skill 생성 |
|
|
198
200
|
|
|
199
201
|
### 개발 서버 모드
|
|
200
202
|
|
|
201
|
-
| 명령어 | 설명
|
|
202
|
-
| ------------------------------- |
|
|
203
|
-
| `sonamu dev` | 통합 모드 (= `sonamu dev all`)
|
|
204
|
-
| `sonamu dev all` | 통합 모드 (one-port: API + Web)
|
|
205
|
-
| `sonamu dev api` | API-only 모드 (Vite 통합 비활성)
|
|
206
|
-
| `sonamu dev web` | Vite 단독 실행
|
|
207
|
-
| `sonamu dev web -- --port 3028` | Vite 옵션 전달
|
|
203
|
+
| 명령어 | 설명 |
|
|
204
|
+
| ------------------------------- | -------------------------------- |
|
|
205
|
+
| `sonamu dev` | 통합 모드 (= `sonamu dev all`) |
|
|
206
|
+
| `sonamu dev all` | 통합 모드 (one-port: API + Web) |
|
|
207
|
+
| `sonamu dev api` | API-only 모드 (Vite 통합 비활성) |
|
|
208
|
+
| `sonamu dev web` | Vite 단독 실행 |
|
|
209
|
+
| `sonamu dev web -- --port 3028` | Vite 옵션 전달 |
|
|
208
210
|
|
|
209
211
|
### 빌드
|
|
210
212
|
|
|
211
|
-
| 명령어 | 설명
|
|
212
|
-
| ------------------ |
|
|
213
|
-
| `sonamu build` | 전체 빌드 (= `sonamu build all`)
|
|
214
|
-
| `sonamu build all` | 전체 빌드 (API + Web)
|
|
215
|
-
| `sonamu build api` | API만 빌드
|
|
216
|
-
| `sonamu build web` | Web만 빌드
|
|
213
|
+
| 명령어 | 설명 |
|
|
214
|
+
| ------------------ | -------------------------------- |
|
|
215
|
+
| `sonamu build` | 전체 빌드 (= `sonamu build all`) |
|
|
216
|
+
| `sonamu build all` | 전체 빌드 (API + Web) |
|
|
217
|
+
| `sonamu build api` | API만 빌드 |
|
|
218
|
+
| `sonamu build web` | Web만 빌드 |
|
|
217
219
|
|
|
218
220
|
**참고**: `sonamu build web`은 클라이언트와 SSR 서버를 모두 빌드합니다. 빌드 결과는 `web/dist/`에 생성되고, `api/web-dist/`로 복사됩니다.
|
|
219
221
|
|
|
@@ -336,6 +338,7 @@ pnpm sonamu skills sync
|
|
|
336
338
|
```
|
|
337
339
|
|
|
338
340
|
이 명령은:
|
|
341
|
+
|
|
339
342
|
- 최신 공식 Skills를 `.claude/skills/sonamu`로 동기화 (symlink 또는 복사)
|
|
340
343
|
- `CLAUDE.md`의 Sonamu 관련 섹션을 업데이트 (마커 영역만)
|
|
341
344
|
|
|
@@ -375,12 +378,13 @@ await knex.schema.createTable('users', ...)
|
|
|
375
378
|
|
|
376
379
|
// 2. posts 테이블 나중에 생성 (users 참조)
|
|
377
380
|
await knex.schema.createTable('posts', (table) => {
|
|
378
|
-
|
|
381
|
+
table.integer('user_id').references('users.id')
|
|
379
382
|
})
|
|
380
383
|
\`\`\`
|
|
381
384
|
```
|
|
382
385
|
|
|
383
386
|
**파일명 규칙**:
|
|
387
|
+
|
|
384
388
|
- 자동으로 안전한 이름으로 변환됩니다
|
|
385
389
|
- 예: `"bug fix"` → `bug-fix.md`
|
|
386
390
|
- 예: `"마이그레이션/헬퍼"` → `마이그레이션-헬퍼.md`
|
|
@@ -389,21 +393,21 @@ await knex.schema.createTable('posts', (table) => {
|
|
|
389
393
|
|
|
390
394
|
생성된 프로젝트에 포함된 주요 Skills:
|
|
391
395
|
|
|
392
|
-
| Skill
|
|
393
|
-
|
|
394
|
-
| **project-init**
|
|
395
|
-
| **entity-basic**
|
|
396
|
+
| Skill | 설명 |
|
|
397
|
+
| -------------------- | ------------------------------------------- |
|
|
398
|
+
| **project-init** | 프로젝트 생성 및 초기화 |
|
|
399
|
+
| **entity-basic** | Entity 생성/수정 기본 |
|
|
396
400
|
| **entity-relations** | Entity 관계 정의 (BelongsToOne, HasMany 등) |
|
|
397
|
-
| **model**
|
|
398
|
-
| **api**
|
|
399
|
-
| **puri**
|
|
400
|
-
| **subset**
|
|
401
|
-
| **upsert**
|
|
402
|
-
| **testing**
|
|
403
|
-
| **migration**
|
|
404
|
-
| **frontend**
|
|
405
|
-
| **i18n**
|
|
406
|
-
| **workflow**
|
|
401
|
+
| **model** | Model 클래스 작성 패턴 |
|
|
402
|
+
| **api** | @api 데코레이터로 API 노출 |
|
|
403
|
+
| **puri** | 타입 안전 쿼리 빌더 사용법 |
|
|
404
|
+
| **subset** | API 응답 필드 범위 정의 |
|
|
405
|
+
| **upsert** | 관계 데이터 저장 (UpsertBuilder) |
|
|
406
|
+
| **testing** | 테스트 작성 (bootstrap, test, testAs) |
|
|
407
|
+
| **migration** | 데이터베이스 마이그레이션 |
|
|
408
|
+
| **frontend** | 프론트엔드에서 API 호출 |
|
|
409
|
+
| **i18n** | 다국어 지원 |
|
|
410
|
+
| **workflow** | 전체 개발 워크플로우 |
|
|
407
411
|
|
|
408
412
|
### Claude Code 사용 팁
|
|
409
413
|
|
|
@@ -435,11 +439,11 @@ Claude는 `.claude/skills/sonamu`의 지식을 활용하여 Sonamu 방식에 맞
|
|
|
435
439
|
|
|
436
440
|
### 데이터베이스 구성
|
|
437
441
|
|
|
438
|
-
| DB 이름
|
|
439
|
-
|
|
|
440
|
-
| `{name}`
|
|
441
|
-
| `{name}_fixture`
|
|
442
|
-
| `{name}_test`
|
|
442
|
+
| DB 이름 | 용도 |
|
|
443
|
+
| ---------------- | ------------- |
|
|
444
|
+
| `{name}` | 메인 개발 DB |
|
|
445
|
+
| `{name}_fixture` | fixture DB |
|
|
446
|
+
| `{name}_test` | 테스트 실행용 |
|
|
443
447
|
|
|
444
448
|
### Fixture 워크플로우
|
|
445
449
|
|
package/catalog.json
CHANGED
|
@@ -14,9 +14,6 @@
|
|
|
14
14
|
"@aws-sdk/s3-request-presigner": "^3.958.0",
|
|
15
15
|
"@better-auth/passkey": "~1.4.18",
|
|
16
16
|
"@better-auth/sso": "~1.4.18",
|
|
17
|
-
"@biomejs/biome": "^2.3.13",
|
|
18
|
-
"@biomejs/js-api": "^4.0.0",
|
|
19
|
-
"@biomejs/wasm-nodejs": "^2.3.7",
|
|
20
17
|
"@changesets/cli": "^2.29.4",
|
|
21
18
|
"@dagrejs/dagre": "^1.1.8",
|
|
22
19
|
"@dnd-kit/core": "^4.0.3",
|
|
@@ -45,6 +42,11 @@
|
|
|
45
42
|
"@logtape/logtape": "2.0.0",
|
|
46
43
|
"@logtape/pretty": "2.0.0",
|
|
47
44
|
"@logtape/redaction": "2.0.0",
|
|
45
|
+
"@storybook/addon-a11y": "^10.2.19",
|
|
46
|
+
"@storybook/addon-docs": "^10.2.19",
|
|
47
|
+
"@storybook/react-vite": "^10.2.19",
|
|
48
|
+
"agentation": "^2.3.0",
|
|
49
|
+
"storybook": "^10.2.19",
|
|
48
50
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
49
51
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
50
52
|
"@radix-ui/react-aspect-ratio": "^1.1.8",
|
|
@@ -76,8 +78,6 @@
|
|
|
76
78
|
"@svgr/core": "^8.1.0",
|
|
77
79
|
"@svgr/plugin-jsx": "^8.1.0",
|
|
78
80
|
"@svgr/plugin-svgo": "^8.1.0",
|
|
79
|
-
"@swc/cli": "^0.7.8",
|
|
80
|
-
"@swc/core": "^1.13.5",
|
|
81
81
|
"@tailwindcss/postcss": "^4.0.0",
|
|
82
82
|
"@tailwindcss/typography": "^0.5.19",
|
|
83
83
|
"@tailwindcss/vite": "^4.1.17",
|
|
@@ -104,9 +104,9 @@
|
|
|
104
104
|
"@types/react-syntax-highlighter": "^15.5.13",
|
|
105
105
|
"@types/supertest": "^6.0.3",
|
|
106
106
|
"@typescript/native-preview": "^7.0.0-dev.20251225.1",
|
|
107
|
-
"@
|
|
108
|
-
"@vitejs/plugin-react
|
|
109
|
-
"@vitest/coverage-v8": "^4.
|
|
107
|
+
"@oxc-project/runtime": "^0.79.0",
|
|
108
|
+
"@vitejs/plugin-react": "6.0.1",
|
|
109
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
110
110
|
"@xyflow/react": "^12.9.3",
|
|
111
111
|
"ai": "^6.0.1",
|
|
112
112
|
"autoprefixer": "^10.4.20",
|
|
@@ -158,6 +158,9 @@
|
|
|
158
158
|
"node-sql-parser": "^5.2.0",
|
|
159
159
|
"nodemon": "^3.1.10",
|
|
160
160
|
"npm-run-all": "^4.1.5",
|
|
161
|
+
"oxfmt": "^0.43.0",
|
|
162
|
+
"oxlint": "^1.58.0",
|
|
163
|
+
"oxc-transform": "^0.123.0",
|
|
161
164
|
"p-event": "^6.0.1",
|
|
162
165
|
"p-timeout": "^6.1.4",
|
|
163
166
|
"parse-imports": "^2.2.1",
|
|
@@ -196,16 +199,15 @@
|
|
|
196
199
|
"ts-node": "^10.9.2",
|
|
197
200
|
"tsdown": "^0.12.5",
|
|
198
201
|
"tsicli": "^1.0.5",
|
|
199
|
-
"tsup": "^8.1.0",
|
|
200
202
|
"tsx": "^4.20.6",
|
|
201
|
-
"typescript": "^
|
|
203
|
+
"typescript": "^6.0.0",
|
|
202
204
|
"unplugin-icons": "0.20.2",
|
|
203
205
|
"uuid": "^13.0.0",
|
|
204
206
|
"vaul": "^1.1.2",
|
|
205
|
-
"vite": "
|
|
207
|
+
"vite": "8.0.3",
|
|
206
208
|
"vite-plugin-dts": "4.5.4",
|
|
207
209
|
"vite-tsconfig-paths": "^5.1.4",
|
|
208
|
-
"vitest": "^4.
|
|
210
|
+
"vitest": "^4.1.2",
|
|
209
211
|
"voyageai": "^0.0.8",
|
|
210
212
|
"xlsx": "^0.18.5",
|
|
211
213
|
"zod": "^4.3.6",
|