sonamu 0.8.24 → 0.8.26

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 (88) hide show
  1. package/dist/api/__tests__/config.test.js +189 -0
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +7 -2
  4. package/dist/api/sonamu.d.ts.map +1 -1
  5. package/dist/api/sonamu.js +14 -10
  6. package/dist/auth/index.d.ts +1 -0
  7. package/dist/auth/index.d.ts.map +1 -1
  8. package/dist/auth/index.js +2 -1
  9. package/dist/auth/knex-adapter.d.ts +23 -0
  10. package/dist/auth/knex-adapter.d.ts.map +1 -0
  11. package/dist/auth/knex-adapter.js +163 -0
  12. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  13. package/dist/bin/__tests__/ts-loader-register.test.js +45 -0
  14. package/dist/bin/cli.js +47 -9
  15. package/dist/bin/ts-loader-register.js +3 -29
  16. package/dist/bin/ts-loader-registration.d.ts +2 -0
  17. package/dist/bin/ts-loader-registration.d.ts.map +1 -0
  18. package/dist/bin/ts-loader-registration.js +42 -0
  19. package/dist/cone/cone-generator.js +3 -3
  20. package/dist/database/puri-subset.test-d.js +9 -1
  21. package/dist/database/puri-subset.types.d.ts +1 -1
  22. package/dist/database/puri-subset.types.d.ts.map +1 -1
  23. package/dist/database/puri-subset.types.js +1 -1
  24. package/dist/testing/fixture-generator.js +5 -5
  25. package/dist/ui/ai-client.js +2 -2
  26. package/dist/ui/api.d.ts.map +1 -1
  27. package/dist/ui/api.js +14 -14
  28. package/dist/ui/cdd-service.d.ts +15 -18
  29. package/dist/ui/cdd-service.d.ts.map +1 -1
  30. package/dist/ui/cdd-service.js +246 -222
  31. package/dist/ui/cdd-types.d.ts +41 -68
  32. package/dist/ui/cdd-types.d.ts.map +1 -1
  33. package/dist/ui/cdd-types.js +2 -2
  34. package/dist/ui-web/assets/index-CKo0Z2Iu.css +1 -0
  35. package/dist/ui-web/assets/{index-CxiydzeC.js → index-DK-2aacv.js} +83 -83
  36. package/dist/ui-web/index.html +2 -2
  37. package/package.json +6 -2
  38. package/src/api/__tests__/config.test.ts +225 -0
  39. package/src/api/config.ts +10 -4
  40. package/src/api/sonamu.ts +16 -13
  41. package/src/auth/index.ts +1 -0
  42. package/src/auth/knex-adapter.ts +208 -0
  43. package/src/bin/__tests__/ts-loader-register.test.ts +62 -0
  44. package/src/bin/cli.ts +52 -9
  45. package/src/bin/ts-loader-register.ts +2 -32
  46. package/src/bin/ts-loader-registration.ts +55 -0
  47. package/src/cone/cone-generator.ts +2 -2
  48. package/src/database/puri-subset.test-d.ts +102 -0
  49. package/src/database/puri-subset.types.ts +1 -1
  50. package/src/skills/commands/sonamu-skills.md +20 -0
  51. package/src/skills/sonamu/SKILL.md +179 -137
  52. package/src/skills/sonamu/ai-agents.md +69 -69
  53. package/src/skills/sonamu/api.md +147 -147
  54. package/src/skills/sonamu/auth-migration.md +220 -220
  55. package/src/skills/sonamu/auth-plugins.md +83 -83
  56. package/src/skills/sonamu/auth.md +106 -106
  57. package/src/skills/sonamu/cdd.md +65 -200
  58. package/src/skills/sonamu/cone.md +138 -138
  59. package/src/skills/sonamu/config.md +191 -191
  60. package/src/skills/sonamu/create-sonamu.md +66 -66
  61. package/src/skills/sonamu/database.md +158 -158
  62. package/src/skills/sonamu/entity-basic.md +292 -293
  63. package/src/skills/sonamu/entity-relations.md +246 -246
  64. package/src/skills/sonamu/entity-validation-checklist.md +124 -124
  65. package/src/skills/sonamu/fixture-cli.md +231 -231
  66. package/src/skills/sonamu/framework-change.md +37 -37
  67. package/src/skills/sonamu/frontend.md +223 -223
  68. package/src/skills/sonamu/i18n.md +82 -82
  69. package/src/skills/sonamu/migration.md +77 -77
  70. package/src/skills/sonamu/model.md +222 -222
  71. package/src/skills/sonamu/naite.md +86 -86
  72. package/src/skills/sonamu/project-init.md +228 -228
  73. package/src/skills/sonamu/puri.md +122 -122
  74. package/src/skills/sonamu/scaffolding.md +154 -154
  75. package/src/skills/sonamu/skill-contribution.md +124 -124
  76. package/src/skills/sonamu/subset.md +46 -46
  77. package/src/skills/sonamu/tasks.md +82 -82
  78. package/src/skills/sonamu/testing-devrunner.md +147 -147
  79. package/src/skills/sonamu/testing.md +673 -673
  80. package/src/skills/sonamu/upsert.md +79 -79
  81. package/src/skills/sonamu/vector.md +67 -67
  82. package/src/testing/fixture-generator.ts +4 -4
  83. package/src/ui/ai-client.ts +1 -1
  84. package/src/ui/api.ts +18 -17
  85. package/src/ui/cdd-service.ts +264 -254
  86. package/src/ui/cdd-types.ts +40 -75
  87. package/dist/ui-web/assets/index-BrQKU3j9.css +0 -1
  88. package/src/skills/sonamu/workflow.md +0 -317
@@ -1,96 +1,96 @@
1
1
  ---
2
2
  name: sonamu-testing-devrunner
3
- description: DevRunner (sonamu test) 실행 테스트 환경 설정. sonamu test 실행 오류, HMR 연동, Naite trace CLI, 병렬 테스트, vitest.config.ts/sonamu.config.ts 구성. Use when 'sonamu test' fails, configuring DevRunner, or setting up parallel testing.
3
+ description: DevRunner (sonamu test) execution and test environment configuration. sonamu test execution errors, HMR integration, Naite trace CLI, parallel testing, vitest.config.ts/sonamu.config.ts setup. Use when 'sonamu test' fails, configuring DevRunner, or setting up parallel testing.
4
4
  ---
5
5
 
6
- # DevRunner 테스트 설정
6
+ # DevRunner and Test Configuration
7
7
 
8
- ## 테스트 실행
8
+ ## Running Tests
9
9
 
10
- **원칙: 개발 중에는 `pnpm sonamu test`를 사용한다.** dev 서버는 항상 실행 중이라고 가정한다. 만약 dev 서버가 내려가 있다면 `pnpm sonamu dev`로 먼저 띄운 테스트한다. `pnpm test`는 CI 환경에서만 사용한다.
10
+ **Principle: Use `pnpm sonamu test` during development.** Assume the dev server is always running. If the dev server is down, start it first with `pnpm sonamu dev`, then run tests. Use `pnpm test` only in CI environments.
11
11
 
12
12
  ```bash
13
- # dev 서버 확인 (내려가 있으면 먼저 실행)
13
+ # Check dev server (start if it's down)
14
14
  pnpm sonamu dev
15
15
 
16
- # 개발 테스트 (기본)
16
+ # Tests during development (default)
17
17
  pnpm sonamu test
18
18
  pnpm sonamu test user.model
19
19
  pnpm sonamu test user.model -p "findMany"
20
20
 
21
- # CI 환경에서만
21
+ # CI environments only
22
22
  pnpm test
23
23
  ```
24
24
 
25
25
  ---
26
26
 
27
- ## DevRunner — `sonamu test` (기본 테스트 실행 방식)
27
+ ## DevRunner — `sonamu test` (Default Test Execution Method)
28
28
 
29
- `sonamu test`는 `sonamu dev` 프로세스 내부에 상주하는 Vitest Node API 인스턴스를 통해 테스트를 실행한다. 매번 Vitest 새로 기동하는 대신 이미 초기화된 인스턴스를 재사용하므로 실행 속도가 3.2x 빠르고, HMR 연동되어 소스 변경 즉시 최신 코드로 테스트된다.
29
+ `sonamu test` runs tests through a Vitest Node API instance that resides inside the `sonamu dev` process. Instead of starting Vitest fresh each time, it reuses an already-initialized instance, making execution 3.2x faster, and it integrates with HMR so tests always run against the latest code immediately after source changes.
30
30
 
31
- ### 사전 준비
31
+ ### Prerequisites
32
32
 
33
- **1. sonamu.config.ts에서 devRunner 활성화:**
33
+ **1. Enable devRunner in sonamu.config.ts:**
34
34
 
35
35
  ```typescript
36
36
  export default defineConfig({
37
37
  test: {
38
38
  devRunner: {
39
39
  enabled: true,
40
- // routePrefix: "/__test__", // optional, 기본값
41
- // vitestConfigPath: undefined, // optional, 기본값: vitest.config.ts (api-root 상대경로)
40
+ // routePrefix: "/__test__", // optional, default value
41
+ // vitestConfigPath: undefined, // optional, default: vitest.config.ts (relative to api-root)
42
42
  },
43
43
  },
44
44
  });
45
45
  ```
46
46
 
47
- 설정 타입 (`SonamuDevRunnerConfig`):
48
- - `enabled: boolean` — DevRunner 활성화 여부 (기본: false)
49
- - `routePrefix?: string` — 테스트 엔드포인트 경로 접두사 (기본: `/__test__`)
50
- - `vitestConfigPath?: string` — vitest.config.ts 경로 (api-root 상대경로)
47
+ Configuration type (`SonamuDevRunnerConfig`):
48
+ - `enabled: boolean` — Whether to enable DevRunner (default: false)
49
+ - `routePrefix?: string` — Test endpoint path prefix (default: `/__test__`)
50
+ - `vitestConfigPath?: string` — vitest.config.ts path (relative to api-root)
51
51
 
52
- **2. dev 서버 실행:**
52
+ **2. Start the dev server:**
53
53
 
54
54
  ```bash
55
- sonamu dev # 또는 pnpm dev
55
+ sonamu dev # or pnpm dev
56
56
  ```
57
57
 
58
- dev 서버 기동 `isLocal() && devRunner.enabled` 조건에서 `DevVitestManager`가 자동 초기화되고, Fastify에 테스트 엔드포인트가 등록된다.
58
+ When the dev server starts, `DevVitestManager` is automatically initialized under the `isLocal() && devRunner.enabled` condition, and test endpoints are registered with Fastify.
59
59
 
60
- ### CLI 사용법
60
+ ### CLI Usage
61
61
 
62
62
  ```bash
63
- # 전체 테스트
63
+ # Run all tests
64
64
  sonamu test
65
65
 
66
- # 파일 지정 (파일명 일부로 매칭 — globTestSpecifications 사용)
66
+ # Specify file (matched by partial filename uses globTestSpecifications)
67
67
  sonamu test user.model
68
68
 
69
- # 여러 파일
69
+ # Multiple files
70
70
  sonamu test user.model order.model
71
71
 
72
- # 특정 테스트 케이스만 (테스트명 패턴)
72
+ # Run specific test cases only (test name pattern)
73
73
  sonamu test user.model --pattern "findMany"
74
74
  sonamu test user.model -p "findMany"
75
75
 
76
- # Naite trace 출력
76
+ # Print Naite traces
77
77
  sonamu test user.model --traces
78
78
  sonamu test user.model -t
79
79
 
80
- # 파일 + 패턴 + trace 조합
80
+ # Combine file + pattern + trace
81
81
  sonamu test user.model -p "findMany" -t
82
82
  ```
83
83
 
84
- 인자 처리 규칙:
85
- - `--pattern` / `-p`: 테스트명 문자열 필터 (`setGlobalTestNamePattern` → 실행 후 `resetGlobalTestNamePattern`)
86
- - `--traces` / `-t`: boolean 플래그, Naite trace 출력 활성화
87
- - `-`로 시작하지 않는 인자: 파일 목록으로 처리
88
- - 다중 파일 전달 허용
89
- - 서버 응답의 `ok: false`는 exit code 1로 반영
84
+ Argument processing rules:
85
+ - `--pattern` / `-p`: test name string filter (`setGlobalTestNamePattern` → `resetGlobalTestNamePattern` after execution)
86
+ - `--traces` / `-t`: boolean flag, enables Naite trace output
87
+ - Arguments not starting with `-`: treated as file list
88
+ - Multiple files allowed
89
+ - `ok: false` in server response is reflected as exit code 1
90
90
 
91
- ### Naite trace 출력
91
+ ### Naite Trace Output
92
92
 
93
- `--traces` / `-t` 플래그로 테스트 코드의 `Naite.t(key, data)` 기록을 CLI에서 확인할 있다:
93
+ The `--traces` / `-t` flag lets you view `Naite.t(key, data)` records from test code in the CLI:
94
94
 
95
95
  ```
96
96
  Tests: 5 passed, 0 failed, 5 total
@@ -98,7 +98,7 @@ Duration: 791ms
98
98
 
99
99
  Traces:
100
100
 
101
- UserModel > BaseModel 기본 기능 확인 > Model.findMany() with num = 0
101
+ UserModel > BaseModel basic functionality check > Model.findMany() with num = 0
102
102
  user.model.test.ts
103
103
 
104
104
  [esq-query] user.model.ts:113
@@ -108,47 +108,47 @@ Traces:
108
108
  select COUNT(*)::integer as "total" from "users" limit 1
109
109
  ```
110
110
 
111
- `--traces` 플래그 없이 실행하면 trace는 출력되지 않는다. API 응답(`POST /__test__/run`)에는 항상 `traces` 필드가 포함되므로 외부 도구에서 활용할 있다.
111
+ Without the `--traces` flag, traces are not printed. The API response (`POST /__test__/run`) always includes a `traces` field, so external tools can make use of it.
112
112
 
113
- trace 데이터 상세: `naite.md` 참고
113
+ For trace data details: see `naite.md`
114
114
 
115
- ### HMR 연동소스 변경 Vitest 모듈 그래프 자동 무효화
115
+ ### HMR IntegrationAutomatic Vitest Module Graph Invalidation on Source Changes
116
116
 
117
- 소스 파일을 수정하면 syncer의 `syncFromWatcher`에서 다음이 동시에 일어난다:
118
- 1. 서버 HMR 캐시 무효화 (`hot.invalidateFile`)
119
- 2. Vitest 모듈 그래프 무효화 (`Sonamu.devVitestManager.invalidateFiles([filePath])`)
117
+ When a source file is modified, `syncFromWatcher` in the syncer triggers both of the following simultaneously:
118
+ 1. Server HMR cache invalidation (`hot.invalidateFile`)
119
+ 2. Vitest module graph invalidation (`Sonamu.devVitestManager.invalidateFiles([filePath])`)
120
120
 
121
121
  ```
122
- user.model.ts 수정 저장
123
- 서버 로그: "Test invalidated: src/application/user/user.model.ts"
124
- sonamu test user.model ← 최신 코드로 실행됨
122
+ Modify user.model.ts → save
123
+ Server log: "Test invalidated: src/application/user/user.model.ts"
124
+ sonamu test user.model ← runs with latest code
125
125
  ```
126
126
 
127
- Vite `moduleGraph.invalidateModule()`이 importer 방향으로 재귀적 cascade하므로, 소스 파일 하나만 무효화하면 이를 import하는 테스트 파일도 자동으로 무효화된다. 별도의 재시작이 필요 없다.
127
+ Because Vite's `moduleGraph.invalidateModule()` recursively cascades in the importer direction, invalidating a single source file automatically invalidates any test files that import it. No restart is needed.
128
128
 
129
- **전이적 의존 관계 예시:**
130
- - `utils.ts` 변경 → `user.model.ts` (utils import) → `user.model.test.ts` 모두 자동 무효화
129
+ **Transitive dependency example:**
130
+ - Change `utils.ts` → `user.model.ts` (imports utils) → `user.model.test.ts` all automatically invalidated
131
131
 
132
- ### HTTP API 직접 호출
132
+ ### Direct HTTP API Calls
133
133
 
134
- CLI 대신 HTTP API 직접 호출할 있다:
134
+ You can call the HTTP API directly instead of using the CLI:
135
135
 
136
136
  ```bash
137
- # 테스트 실행
137
+ # Run tests
138
138
  curl -X POST http://localhost:3000/__test__/run \
139
139
  -H "Content-Type: application/json" \
140
140
  -d '{"files": ["user.model"], "pattern": "findMany"}'
141
141
 
142
- # 상태 확인
142
+ # Check status
143
143
  curl http://localhost:3000/__test__/status
144
144
  ```
145
145
 
146
- **POST `/__test__/run`** 요청:
146
+ **POST `/__test__/run`** request:
147
147
  ```json
148
148
  { "files": ["src/user/user.model.test.ts"], "pattern": "should create user" }
149
149
  ```
150
150
 
151
- 응답 (성공):
151
+ Response (success):
152
152
  ```json
153
153
  {
154
154
  "ok": true,
@@ -168,177 +168,177 @@ curl http://localhost:3000/__test__/status
168
168
  }
169
169
  ```
170
170
 
171
- **GET `/__test__/status`** 응답:
171
+ **GET `/__test__/status`** response:
172
172
  ```json
173
173
  { "ready": true, "running": false, "lastRunAt": "2026-02-13T12:34:56.000Z" }
174
174
  ```
175
175
 
176
- ### 내부 아키텍처
176
+ ### Internal Architecture
177
177
 
178
178
  **DevVitestManager** (`testing/dev-vitest-manager.ts`):
179
- - `createVitest('test', cliOptions, viteOverrides)`로 상주 인스턴스 생성
180
- - `watch: true, standalone: true`로 설정하되, 자동 재실행은 차단:
179
+ - Creates a resident instance with `createVitest('test', cliOptions, viteOverrides)`
180
+ - Configured with `watch: true, standalone: true`, but blocks automatic re-runs:
181
181
  - `forceRerunTriggers: []`
182
- - `server.watch: null` (chokidar 미생성)
182
+ - `server.watch: null` (chokidar not created)
183
183
  - `onFilterWatchedSpecification(() => false)`
184
- - 워커 프로세스가 테스트 DB를 사용하도록 `env: { NODE_ENV: "test" }` 명시
185
- - **queue 기반 순차 실행**: 동시 요청 결과 꼬임 방지, 요청 순서대로 처리 각각 응답
186
- - **결과 집계**: `specModuleIds`로 실행 요청된 모듈만 필터링 (standalone 모드에서 `testModules`가 전체 모듈을 포함하는 문제 대응)
187
- - 프로젝트의 `vitest.config.ts` 로딩 유지 (기존 sequencer/reporter/globalSetup 재사용)
184
+ - Explicitly sets `env: { NODE_ENV: "test" }` so worker processes use the test DB
185
+ - **Queue-based sequential execution**: prevents result mixing on concurrent requests, processes in order and responds to each
186
+ - **Result aggregation**: filters only the modules requested for execution using `specModuleIds` (works around the issue where `testModules` includes all modules in standalone mode)
187
+ - Keeps loading the project's `vitest.config.ts` (reuses existing sequencer/reporter/globalSetup)
188
188
 
189
- **Fastify 통합** (`testing/dev-test-routes.ts`):
190
- - `registerDevTestRoutes(server, config)`로 라우트 등록
191
- - `Sonamu.devVitestManager`에 매니저 인스턴스 저장
192
- - `server.addHook('onClose')`에서 `shutdown()` 보장
189
+ **Fastify integration** (`testing/dev-test-routes.ts`):
190
+ - Registers routes with `registerDevTestRoutes(server, config)`
191
+ - Stores manager instance in `Sonamu.devVitestManager`
192
+ - Ensures `shutdown()` is called in `server.addHook('onClose')`
193
193
 
194
194
  **CLI** (`bin/test-command.ts`):
195
- - `tsicli` 매칭 전에 `testCommand()` 직접 호출 (가변 인자 처리)
196
- - `bootstrap()`의 `notToInit` 목록에 포함 (HTTP 호출만 하므로 `Sonamu.init` 불필요)
197
- - 서버 포트/호스트는 `sonamu.config.ts`의 `server.listen`에서 읽음
195
+ - Calls `testCommand()` directly before `tsicli` matching (to handle variadic arguments)
196
+ - Included in `bootstrap()`'s `notToInit` list (no need for `Sonamu.init` since it only makes HTTP calls)
197
+ - Server port/host read from `server.listen` in `sonamu.config.ts`
198
198
 
199
- ### 성능 비교 (miomock 기준)
199
+ ### Performance Comparison (miomock baseline)
200
200
 
201
- 단일 파일 (`user.model.test.ts`):
201
+ Single file (`user.model.test.ts`):
202
202
 
203
- | 항목 | `vitest run` | `sonamu test` | 차이 |
203
+ | Item | `vitest run` | `sonamu test` | Difference |
204
204
  |---|---|---|---|
205
- | 테스트 실행 시간 | 2,610ms | 823ms | 3.2x 빠름 |
206
- | 전체 소요 시간 (wall clock) | 4,118ms | 1,907ms | 2.2x 빠름 |
205
+ | Test execution time | 2,610ms | 823ms | 3.2x faster |
206
+ | Total elapsed time (wall clock) | 4,118ms | 1,907ms | 2.2x faster |
207
207
 
208
- 다중 파일 (puri 테스트, 4파일 147테스트):
208
+ Multiple files (puri tests, 4 files 147 tests):
209
209
 
210
- | 항목 | `vitest run` | `sonamu test` | 차이 |
210
+ | Item | `vitest run` | `sonamu test` | Difference |
211
211
  |---|---|---|---|
212
- | 테스트 실행 시간 | 5,740ms | 1,774ms | 3.2x 빠름 |
213
- | 전체 소요 시간 (wall clock) | 7,035ms | 2,673ms | 2.6x 빠름 |
212
+ | Test execution time | 5,740ms | 1,774ms | 3.2x faster |
213
+ | Total elapsed time (wall clock) | 7,035ms | 2,673ms | 2.6x faster |
214
214
 
215
- 속도 차이 원인: `vitest run`은 실행마다 프로세스 부팅(~1.5초) + 모듈 transform(~400ms) 필요하지만, `sonamu test`는 이미 초기화된 인스턴스를 재사용하므로 비용이 없다.
215
+ Speed difference reason: `vitest run` requires process boot (~1.5s) + module transform (~400ms) on every execution, whereas `sonamu test` reuses an already-initialized instance and avoids this overhead.
216
216
 
217
- ### `pnpm sonamu test` vs `pnpm test` 비교
217
+ ### `pnpm sonamu test` vs `pnpm test` Comparison
218
218
 
219
- | | `pnpm sonamu test` (기본) | `pnpm test` (CI/대체) |
219
+ | | `pnpm sonamu test` (default) | `pnpm test` (CI/fallback) |
220
220
  |---|---|---|
221
- | 실행 방식 | dev 서버 상주 인스턴스 | 독립 Vitest 프로세스 |
222
- | 초기화 비용 | 없음 (이미 초기화됨) | 실행마다 초기화 |
223
- | HMR 연동 | 소스 변경 즉시 반영 | 해당 없음 |
224
- | Naite trace | `--traces` 플래그로 CLI 출력 | reporter 통해 확인 |
225
- | 용도 | **개발 기본 테스트 실행** | CI 환경 |
226
- | 사전 조건 | `sonamu dev` 실행 (항상 실행 가정) | 없음 |
221
+ | Execution method | Resident instance inside dev server | Independent Vitest process |
222
+ | Initialization cost | None (already initialized) | Initialization on every run |
223
+ | HMR integration | Source changes reflected immediately | Not applicable |
224
+ | Naite trace | CLI output via `--traces` flag | Available through reporter |
225
+ | Use case | **Default test execution during development** | CI environments |
226
+ | Prerequisite | `sonamu dev` running (assumed always running) | None |
227
227
 
228
- ### 트러블슈팅
228
+ ### Troubleshooting
229
229
 
230
- **"dev 서버에 연결할 없습니다"**
231
- → `sonamu dev`가 실행 중인지 확인. CLI `config.server.listen.port`로 HTTP 요청을 보낸다.
230
+ **"Cannot connect to dev server"**
231
+ Check that `sonamu dev` is running. The CLI sends HTTP requests to `config.server.listen.port`.
232
232
 
233
- **"devRunner 활성화되지 않았습니다" (또는 404 응답)**
234
- → `sonamu.config.ts`에 `test.devRunner.enabled: true` 설정이 필요. DevRunner `isLocal()` 환경에서만 활성화된다.
233
+ **"devRunner is not enabled" (or 404 response)**
234
+ → `test.devRunner.enabled: true` must be set in `sonamu.config.ts`. DevRunner is only activated in `isLocal()` environments.
235
235
 
236
- **"Vitest 인스턴스가 아직 준비되지 않았습니다" (500 응답)**
237
- dev 서버 기동 직후 Vitest 초기화가 완료되기 전에 요청한 경우. `GET /__test__/status`에서 `ready: true`를 확인 후 실행.
236
+ **"Vitest instance is not ready yet" (500 response)**
237
+ Request was made before Vitest initialization completed immediately after dev server startup. Check `GET /__test__/status` for `ready: true` before running.
238
238
 
239
- **테스트가 이전 코드로 실행됨**
240
- 소스 파일 저장 `"Test invalidated: ..."` 로그가 출력되는지 확인. 로그가 없다면 `devRunner.enabled`가 `true`인지, syncer 정상 동작 중인지 확인.
239
+ **Tests running against old code**
240
+ After saving a source file, check whether a `"Test invalidated: ..."` log appears. If not, verify that `devRunner.enabled` is `true` and that the syncer is working correctly.
241
241
 
242
242
  ---
243
243
 
244
- ## sonamu.config.ts 테스트 관련 설정 전체 맵
244
+ ## Complete Map of Test-Related Settings in sonamu.config.ts
245
245
 
246
- `pnpm sonamu test` (DevRunner, 기본) `pnpm test` (Vitest 직접 실행, CI) 모두 `sonamu.config.ts`의 설정을 참조한다.
246
+ Both `pnpm sonamu test` (DevRunner, default) and `pnpm test` (direct Vitest execution, CI) reference settings from `sonamu.config.ts`.
247
247
 
248
- ### 설정 타입 정의 (SonamuTestConfig)
248
+ ### Configuration Type Definition (SonamuTestConfig)
249
249
 
250
250
  ```typescript
251
251
  // config.ts
252
252
  export type SonamuTestConfig = {
253
- /** 병렬 테스팅 활성화 (기본: false) */
253
+ /** Enable parallel testing (default: false) */
254
254
  parallel?: boolean;
255
- /** 병렬 실행 워커 (기본: 4) */
255
+ /** Number of parallel execution workers (default: 4) */
256
256
  maxWorkers?: number;
257
- /** Dev 서버 Vitest 상주 인스턴스 설정 */
257
+ /** Resident Vitest instance settings inside dev server */
258
258
  devRunner?: SonamuDevRunnerConfig;
259
259
  };
260
260
 
261
261
  export type SonamuDevRunnerConfig = {
262
- /** DevRunner 활성화 여부 (기본: false) */
262
+ /** Whether to enable DevRunner (default: false) */
263
263
  enabled: boolean;
264
- /** 테스트 엔드포인트 경로 접두사 (기본: /__test__) */
264
+ /** Test endpoint path prefix (default: /__test__) */
265
265
  routePrefix?: string;
266
- /** vitest.config.ts 경로 (api-root 상대경로) */
266
+ /** vitest.config.ts path (relative to api-root) */
267
267
  vitestConfigPath?: string;
268
268
  };
269
269
  ```
270
270
 
271
- ### 병렬 테스트 설정 (선택)
271
+ ### Parallel Test Configuration (Optional)
272
272
 
273
- `pnpm sonamu test`와 `pnpm test` 모두 병렬 설정을 공유한다. 병렬 실행이 필요한 경우에만 설정한다:
273
+ Both `pnpm sonamu test` and `pnpm test` share the parallel configuration. Only configure this if parallel execution is needed:
274
274
 
275
275
  ```typescript
276
276
  export default defineConfig({
277
277
  test: {
278
- parallel: true, // Worker별 DB 분리 실행
279
- maxWorkers: 4, // Worker (기본: 4)
278
+ parallel: true, // Separate DB execution per worker
279
+ maxWorkers: 4, // Number of workers (default: 4)
280
280
  },
281
281
  });
282
282
  ```
283
283
 
284
- `parallel: true`이면 `getSonamuTestConfig()`(vitest-helpers.ts) vitest에 `pool: "forks"`, `maxWorkers`, `env: { SONAMU_WORKER_DB: "true" }`를 주입하고, `globalSetup`(global-setup.ts)에서 `{database.name}_test_1` ~ `{database.name}_test_{maxWorkers}` DB를 템플릿(`{database.name}_test`)에서 복제 생성한다.
284
+ When `parallel: true`, `getSonamuTestConfig()` (vitest-helpers.ts) injects `pool: "forks"`, `maxWorkers`, and `env: { SONAMU_WORKER_DB: "true" }` into vitest, and `globalSetup` (global-setup.ts) creates DBs `{database.name}_test_1` through `{database.name}_test_{maxWorkers}` by cloning from the template (`{database.name}_test`).
285
285
 
286
- ### DevRunner 설정 (필수)
286
+ ### DevRunner Configuration (Required)
287
287
 
288
- `pnpm sonamu test`를 사용하려면 DevRunner 활성화해야 한다. `test.devRunner.enabled: true`만 추가하면 된다:
288
+ To use `pnpm sonamu test`, DevRunner must be enabled. Just add `test.devRunner.enabled: true`:
289
289
 
290
290
  ```typescript
291
291
  export default defineConfig({
292
292
  server: {
293
293
  listen: {
294
- port: 3000, // CLI 포트로 HTTP 요청을 보냄
295
- host: "localhost", // CLI 호스트로 연결 (기본: localhost)
294
+ port: 3000, // CLI sends HTTP requests to this port
295
+ host: "localhost", // CLI connects to this host (default: localhost)
296
296
  },
297
297
  },
298
298
 
299
299
  test: {
300
300
  devRunner: {
301
- enabled: true, // 필수: DevRunner 활성화
302
- // routePrefix: "/__test__", // 선택: 엔드포인트 경로 (기본값)
303
- // vitestConfigPath: undefined, // 선택: vitest.config.ts 경로 (기본: api-root의 vitest.config.ts)
301
+ enabled: true, // Required: enable DevRunner
302
+ // routePrefix: "/__test__", // Optional: endpoint path (default value)
303
+ // vitestConfigPath: undefined, // Optional: vitest.config.ts path (default: vitest.config.ts in api-root)
304
304
  },
305
- // parallel: true, // 선택: DevRunner와 독립적
306
- // maxWorkers: 4, // 선택: parallel 사용
305
+ // parallel: true, // Optional: independent of DevRunner
306
+ // maxWorkers: 4, // Optional: when using parallel
307
307
  },
308
308
  });
309
309
  ```
310
310
 
311
- ### 설정별 참조 위치 (소스코드 기준)
311
+ ### Source Code Reference Locations per Setting
312
312
 
313
- | 설정 경로 | 기본값 | 참조 위치 | 용도 |
313
+ | Setting path | Default | Reference location | Purpose |
314
314
  |---|---|---|---|
315
- | `test.devRunner.enabled` | `false` | `sonamu.ts` L394, `test-command.ts` | DevRunner 활성화 조건 |
316
- | `test.devRunner.routePrefix` | `"/__test__"` | `dev-test-routes.ts`, `test-command.ts` | HTTP 엔드포인트 경로 |
317
- | `test.devRunner.vitestConfigPath` | `undefined` | `dev-vitest-manager.ts` `start()` | Vitest 설정 파일 위치 |
318
- | `test.parallel` | `false` | `vitest-helpers.ts` `getSonamuTestConfig()` | `pool: "forks"` + `SONAMU_WORKER_DB` env 주입 |
319
- | `test.maxWorkers` | `4` | `vitest-helpers.ts`, `global-setup.ts` | Vitest maxWorkers + worker DB 개수 |
320
- | `server.listen.port` | `3000` | `test-command.ts` | CLI → dev 서버 HTTP 연결 포트 |
321
- | `server.listen.host` | `"localhost"` | `test-command.ts` | CLI → dev 서버 HTTP 연결 호스트 |
322
- | `database.name` | — | `db.ts` `generateDBConfig()`, `global-setup.ts` | 테스트 DB 이름 (`{name}_test`) |
315
+ | `test.devRunner.enabled` | `false` | `sonamu.ts` L394, `test-command.ts` | DevRunner activation condition |
316
+ | `test.devRunner.routePrefix` | `"/__test__"` | `dev-test-routes.ts`, `test-command.ts` | HTTP endpoint path |
317
+ | `test.devRunner.vitestConfigPath` | `undefined` | `dev-vitest-manager.ts` `start()` | Vitest config file location |
318
+ | `test.parallel` | `false` | `vitest-helpers.ts` `getSonamuTestConfig()` | `pool: "forks"` + `SONAMU_WORKER_DB` env injection |
319
+ | `test.maxWorkers` | `4` | `vitest-helpers.ts`, `global-setup.ts` | Vitest maxWorkers + number of worker DBs |
320
+ | `server.listen.port` | `3000` | `test-command.ts` | CLI → dev server HTTP connection port |
321
+ | `server.listen.host` | `"localhost"` | `test-command.ts` | CLI → dev server HTTP connection host |
322
+ | `database.name` | — | `db.ts` `generateDBConfig()`, `global-setup.ts` | Test DB name (`{name}_test`) |
323
323
 
324
- ### 활성화 조건
324
+ ### Activation Conditions
325
325
 
326
- DevRunner `sonamu.ts`에서 `isLocal() && config.test?.devRunner?.enabled` 조건으로 등록된다. `isLocal()`은 `LR` 환경변수가 undefined이거나 `"local"`인 경우 true를 반환한다 (`controller.ts`). 로컬 개발 환경에서만 동작하며 원격(production/staging) 환경에서는 비활성화된다.
326
+ DevRunner is registered in `sonamu.ts` under the condition `isLocal() && config.test?.devRunner?.enabled`. `isLocal()` returns true when the `LR` environment variable is undefined or `"local"` (`controller.ts`). It only works in local development environments and is disabled in remote (production/staging) environments.
327
327
 
328
- ### 병렬 테스트 DB 흐름
328
+ ### Parallel Test DB Flow
329
329
 
330
- `test.parallel: true` 설정 시 DB 흐름:
330
+ DB flow when `test.parallel: true` is set:
331
331
 
332
- 1. **globalSetup** (`global-setup.ts`): `{database.name}_test`를 템플릿으로 `{database.name}_test_1` ~ `_test_{maxWorkers}` DB 복제
333
- 2. **getSonamuTestConfig** (`vitest-helpers.ts`): vitest에 `env: { SONAMU_WORKER_DB: "true" }` 주입
334
- 3. **DB.getDB** (`db.ts`): `SONAMU_WORKER_DB=true`이면 `VITEST_POOL_ID` 환경변수로 worker별 DB 선택 (`{database.name}_test_{workerId}`)
335
- 4. **globalTeardown**: worker DB 전체 삭제
332
+ 1. **globalSetup** (`global-setup.ts`): Clones `{database.name}_test_1` through `_test_{maxWorkers}` from `{database.name}_test` as template
333
+ 2. **getSonamuTestConfig** (`vitest-helpers.ts`): Injects `env: { SONAMU_WORKER_DB: "true" }` into vitest
334
+ 3. **DB.getDB** (`db.ts`): When `SONAMU_WORKER_DB=true`, selects worker-specific DB using `VITEST_POOL_ID` environment variable (`{database.name}_test_{workerId}`)
335
+ 4. **globalTeardown**: Deletes all worker DBs
336
336
 
337
- `test.parallel: false`(기본)이면 모든 테스트가 `{database.name}_test` 단일 DB에서 순차 실행된다.
337
+ When `test.parallel: false` (default), all tests run sequentially on the single `{database.name}_test` DB.
338
338
 
339
339
  ---
340
340
 
341
- ## 설정 파일
341
+ ## Configuration Files
342
342
 
343
343
  ### vitest.config.ts
344
344
 
@@ -367,15 +367,15 @@ dotenv.config();
367
367
  export { setup } from "sonamu/test";
368
368
  ```
369
369
 
370
- ### sonamu.config.ts (test 설정)
370
+ ### sonamu.config.ts (test configuration)
371
371
 
372
372
  ```typescript
373
373
  export default defineConfig({
374
374
  test: {
375
- parallel: true, // 병렬 테스트 활성화
376
- maxWorkers: 4, // Worker (기본값: 4)
375
+ parallel: true, // Enable parallel testing
376
+ maxWorkers: 4, // Number of workers (default: 4)
377
377
  devRunner: {
378
- enabled: true, // DevRunner 활성화
378
+ enabled: true, // Enable DevRunner
379
379
  },
380
380
  },
381
381
  });
@@ -383,8 +383,8 @@ export default defineConfig({
383
383
 
384
384
  ---
385
385
 
386
- ## 참고
386
+ ## References
387
387
 
388
- - **테스트 작성 가이드**: `testing.md`
389
- - **Naite 추적 시스템**: `naite.md`
388
+ - **Test writing guide**: `testing.md`
389
+ - **Naite tracing system**: `naite.md`
390
390
  - **Fixture CLI**: `fixture-cli.md`