sonamu 0.8.21 → 0.8.22

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.
@@ -111,7 +111,7 @@ pnpm sonamu cone gen Post --locale en
111
111
  #### LLM이 참조하는 정보
112
112
 
113
113
  1. Entity JSON 구조 (props, subsets, enums, relations)
114
- 2. 프로젝트 스킬 파일 (`.claude/skills/project/requirements.md`, `business-logic.md`)
114
+ 2. 도메인 규칙 파일 (`contract/**/*.contract.md`)
115
115
  3. 기존 cone 메타데이터 (보존 모드 시)
116
116
 
117
117
  ### 2. stub entity — Entity 생성 시 자동 cone 생성
@@ -302,9 +302,8 @@ relation prop에서 참조 데이터 조회 방식을 지정합니다.
302
302
 
303
303
  ### LLM cone 생성 품질 높이기
304
304
 
305
- 1. `.claude/skills/project/requirements.md`에 프로젝트 요구사항을 상세히 기록
306
- 2. `business-logic.md`에 비즈니스 로직을 기록
307
- 3. `cone gen` 실행 — LLM이 이 파일들을 컨텍스트로 사용
305
+ 1. `contract/{domain}/{domain}.contract.md`에 도메인 규칙과 결정 근거를 상세히 기록
306
+ 2. `cone gen` 실행 — LLM이 `contract/**/*.contract.md`를 컨텍스트로 사용
308
307
 
309
308
  ### cone 재생성이 필요한 시점
310
309
 
@@ -49,7 +49,7 @@ production/development master (실제 DB)
49
49
 
50
50
  faker 기반으로 새로운 테스트 데이터를 생성합니다.
51
51
 
52
- **CRITICAL: `--use-llm` 옵션은 실제 프로젝트에서 항상 사용해야 한다.** `--use-llm` 없이 생성하면 cone.note 기반 도메인 맥락이 반영되지 않아 faker 기본값만 사용되므로, 의미 없는 데이터가 생성될 수 있다. LLM이 `requirements.md`, `business-logic.md`를 참조해 맥락에 맞는 데이터를 생성하려면 이 옵션이 필수이다.
52
+ **CRITICAL: `--use-llm` 옵션은 실제 프로젝트에서 항상 사용해야 한다.** `--use-llm` 없이 생성하면 cone.note 기반 도메인 맥락이 반영되지 않아 faker 기본값만 사용되므로, 의미 없는 데이터가 생성될 수 있다. LLM이 `contract/**/*.contract.md`를 참조해 맥락에 맞는 데이터를 생성하려면 이 옵션이 필수이다.
53
53
 
54
54
  **CRITICAL: fixture gen을 실행하기 전에 `cone.note`가 주요 prop에 존재하는지 확인한다.** cone.note가 없으면 LLM이 맥락을 파악할 수 없어 의미 있는 데이터 생성이 불가능하다. cone.note가 부족하면 `pnpm sonamu cone generate --use-llm`으로 cone을 재생성한다.
55
55
 
@@ -30,15 +30,14 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
30
30
  2. Sonamu skills를 읽고 `pnpm create sonamu [프로젝트명] --yes`로 프로젝트 생성
31
31
  3. `pnpm install` 실행
32
32
 
33
- ### 2. 요구사항 기록비즈니스 로직 파악
33
+ ### 2. 요구사항 파악도메인 식별
34
34
 
35
- **CRITICAL: 이 단계(Step 4~6)를 완료하기 전에 auth generate나 인프라 기동으로 넘어가지 않는다.**
35
+ **CRITICAL: 이 단계(Step 4~5)를 완료하기 전에 auth generate나 인프라 기동으로 넘어가지 않는다.**
36
36
 
37
- 4. 사용자가 입력한 prompt를 프로젝트 루트의 `.claude/skills/project/requirements.md`에 기록
38
- 5. 비즈니스 로직 파악 후 **작은 단위로** 사용자에게 확인받기
37
+ 4. 요구사항을 파악하고 도메인을 식별. 도메인별로 작은 단위로 사용자에게 확인받기
39
38
  - 한 번에 전체를 확인하지 말고 도메인별로 나누어 확인
40
39
  - "이 부분이 맞나요?" 식으로 구체적으로 질문
41
- 6. 비즈니스 로직 최종 승인 완료 `.claude/skills/project/business-logic.md`에 기록
40
+ 5. 식별된 도메인 목록을 사용자에게 확인받기. PHASE 1에서 도메인별 `*.contract.md`를 작성함
42
41
 
43
42
  ### 3. 설정 확인
44
43
 
@@ -77,7 +76,7 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
77
76
  **완료 기준:**
78
77
 
79
78
  - [ ] 프로젝트 생성 완료
80
- - [ ] requirements.md, business-logic.md 기록 완료
79
+ - [ ] 도메인 목록 식별 및 사용자 승인 완료
81
80
  - [ ] sonamu.config.ts, .env 설정 확인 및 사용자 승인 완료
82
81
  - [ ] Docker, dev 서버 실행 중
83
82
  - [ ] Auth 엔티티 생성 및 migration 완료
@@ -85,58 +84,46 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
85
84
 
86
85
  ---
87
86
 
88
- ## PHASE 0.5: Contract Spec 작성
87
+ ## PHASE 1: 도메인 Logic 문서화
89
88
 
90
89
  **참조 스킬:** cdd.md
91
90
 
92
- **CRITICAL: 이 PHASE가 완료되기 전에 엔티티 설계(PHASE 1)를 시작하지 않는다.**
91
+ **CRITICAL: 이 PHASE가 완료되기 전에 엔티티 설계(PHASE 2)를 시작하지 않는다.**
93
92
 
94
- ### 7. main.contract.json 작성
93
+ ### 7. 도메인별 `*.contract.md` 작성
95
94
 
96
- 20. `packages/api/contract/main.contract.json` 생성
97
- - `requirements.md`, `business-logic.md` 기반으로 작성
98
- - 전체 프로젝트 Overview, 하위 도메인 목록, Domain Glossary, User Roles, Business Rules, Edge Cases 포함
99
- - `content`는 Markdown 한 줄씩 `string[]`로 작성
100
- 21. 사용자에게 보고 후 승인 대기
101
-
102
- ### 8. 도메인별 contract 작성
103
-
104
- 22. `business-logic.md`에서 도메인을 식별하고 도메인 목록을 사용자에게 확인받기
105
- 23. 도메인별로 `packages/api/contract/{domain}/main.contract.json` 작성
95
+ 20. PHASE 0에서 확인된 도메인별로 `contract/{domain}/{domain}.contract.md` 작성
106
96
  - 도메인 폴더명은 영문 소문자 (예: `auth`, `organization`, `research`)
107
- - 도메인 contract 작성 사용자 확인받기 (도메인별로 하나씩)
108
- - Features/Capabilities 섹션을 상세하게 작성한다 (이후 spec의 1:1 기반이 됨)
97
+ - 도메인 규칙, 상태 전이, 권한, Edge Cases 등 코드만으로 파악하기 어려운 결정 근거 포함
98
+ - 처음부터 완벽할 필요 없음 사용자와 대화하면서 점진적으로 정리
99
+ 21. 도메인별로 작성 후 사용자에게 확인받기 (도메인별로 하나씩)
109
100
 
110
- ### 9. Spec 작성
101
+ **`*.contract.md` 형식:**
111
102
 
112
- **CRITICAL: 1 Feature = 1 Spec 파일. 도메인 contract의 Features/Capabilities에 정의된 기능 하나당 spec 파일 하나.**
103
+ ```markdown
104
+ # {도메인} 비즈니스 로직
113
105
 
114
- 24. 각 도메인의 Features/Capabilities를 기반으로 spec 파일 목록 작성 후 사용자 확인
115
- 25. 도메인별로 spec 파일 작성
116
- - spec 파일은 해당 도메인 폴더에 위치
117
- - 파일명은 feature key (예: `signin.spec.json`)
118
- - `status: "draft"`로 시작
119
- 26. 전체 spec 작성 완료 후 사용자에게 검토 요청
120
- - 사용자 검토 및 수정 반영
121
- - 모든 spec 검토 완료 후에만 다음 PHASE로 진행
106
+ ## 규칙
107
+ - 규칙과 결정 근거
108
+
109
+ ## 워크플로우
110
+ 1. ...
111
+ ```
122
112
 
123
113
  **완료 기준:**
124
114
 
125
- - [ ] `packages/api/contract/main.contract.json` 작성 및 사용자 승인
126
- - [ ] 모든 도메인 contract 작성 및 사용자 승인
127
- - [ ] 모든 domain spec 파일 작성 완료
128
- - [ ] 사용자 spec 검토 완료
129
- - [ ] `pnpm cdd test` 실행 시 MISSING 0, NO_MATCH 0 확인
115
+ - [ ] 모든 도메인의 `contract/{domain}/{domain}.contract.md` 작성 완료
116
+ - [ ] 사용자 도메인별 확인 완료
130
117
 
131
118
  ---
132
119
 
133
- ## PHASE 1: 엔티티 설계
120
+ ## PHASE 2: 엔티티 설계
134
121
 
135
122
  **참조 스킬:** entity-basic.md, entity-relations.md
136
123
 
137
- **전제 조건:** PHASE 0.5 완료 (모든 spec 사용자 검토 완료)
124
+ **전제 조건:** PHASE 1 완료 (모든 도메인 `*.contract.md` 사용자 확인 완료)
138
125
 
139
- ### 10. 엔티티 설계
126
+ ### 8. 엔티티 설계
140
127
 
141
128
  20. 사용자 요구사항에 맞는 엔티티 설계
142
129
  - 설계하면서 사용자에게 비즈니스 로직에 맞는지 **지속적으로 디테일하게** 확인받을 것
@@ -156,22 +143,22 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
156
143
 
157
144
  ---
158
145
 
159
- ## PHASE 2: 엔티티 생성 및 마이그레이션
146
+ ## PHASE 3: 엔티티 생성 및 마이그레이션
160
147
 
161
148
  **참조 스킬:** entity-basic.md, entity-validation-checklist.md, migration.md
162
149
 
163
- ### 8. 엔티티 생성
150
+ ### 9. 엔티티 생성
164
151
 
165
152
  22. 설계에 따라 **batch로** entity.json 생성
166
153
  23. biome check, type check
167
154
  24. 문제 없이 빌드되는지 확인
168
155
 
169
- ### 9. 마이그레이션
156
+ ### 10. 마이그레이션
170
157
 
171
158
  25. 사용자에게 Sonamu UI와 CLI 중 어떤 방식으로 migration을 진행할지 확인 후 실행
172
159
  26. 실제 테이블이 생성되었는지 확인
173
160
 
174
- ### 10. Cone 및 Scaffolding
161
+ ### 11. Cone 및 Scaffolding
175
162
 
176
163
  **참조 스킬:** cone.md
177
164
 
@@ -205,44 +192,47 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
205
192
 
206
193
  ---
207
194
 
208
- ## PHASE 3: 테스트 및 API 구현
195
+ ## PHASE 4: 테스트 및 API 구현
196
+
197
+ **참조 스킬:** testing.md, testing-devrunner.md, naite.md, cdd.md
209
198
 
210
- **참조 스킬:** testing.md, testing-devrunner.md, naite.md
199
+ ### 12. AC 구체화 및 Claim 구성
211
200
 
212
- ### 11. 테스트 계획
201
+ **AC(수락 기준)는 테스트 파일의 describe/test 이름이다.** 별도 문서로 관리하지 않는다.
213
202
 
214
- 33. 테스트 계획을 batch로 세우기 **항상 User 관련 테스트가 우선**
215
- 34. `.claude/skills/project/test-plan.md`에 기록
216
- 35. `architecture.md`에 test-plan.md 링크 추가
203
+ 33. `contract/**/*.contract.md`와 실제 코드를 참고하여 도메인별 AC 목록 초안 작성
204
+ - **항상 User 관련 테스트가 우선**
205
+ 34. 사용자와 논의하며 `pnpm cdd ac add`로 테스트 스켈레톤 생성
206
+ 35. `pnpm cdd ac list`로 확정된 AC 목록 확인
207
+ 36. Claim을 `tmp/claims/`에 YAML로 작성 (`surface` → `implement` 순)
208
+ - 상세 Claim 형식은 cdd.md 참조
217
209
 
218
- ### 12. Batch별 테스트 및 API 구현 (반복)
210
+ ### 13. Claim 실행 (반복)
219
211
 
220
- batch마다 다음을 반복:
212
+ Claim마다:
221
213
 
222
- 36. **하나의 batch 비즈니스 로직에 맞는 테스트 코드 작성**
223
- 37. biome check, type check
224
- 38. **model의 API 구현**
214
+ 37. **AC 작성 + 구현 교차 반복** (AC 하나 → 구현 → 다음 AC → 구현)
215
+ 38. biome check, type check
225
216
  39. **`pnpm sonamu test`로 테스트 돌려보기**
226
217
  - dev 서버가 올라가있지 않으면 올린 뒤 실행
227
218
 
228
- ### 13. 전체 검증
219
+ ### 14. 전체 검증
229
220
 
230
- 40. 모든 batch 완료 후 전체 biome check, type check 및 빌드 확인
221
+ 40. 모든 Claim 완료 후 전체 biome check, type check 및 빌드 확인
231
222
  41. **`pnpm sonamu test`로 전체 테스트 실행**
232
223
 
233
224
  **완료 기준:**
234
225
 
235
- - [ ] test-plan.md 기록 완료
236
- - [ ] 모든 batch의 테스트 통과
237
- - [ ] 모든 batch의 API 구현 완료
226
+ - [ ] 모든 도메인 AC 정의 완료 (테스트 파일에 스켈레톤으로 존재)
227
+ - [ ] 모든 Claim 실행 완료
228
+ - [ ] 모든 테스트 통과
238
229
  - [ ] 전체 biome check, type check, build 통과
239
- - [ ] 전체 테스트 통과
240
230
 
241
231
  ---
242
232
 
243
- ## PHASE 4: Fixture 생성
233
+ ## PHASE 5: Fixture 생성
244
234
 
245
- ### 14. Fixture 생성
235
+ ### 15. Fixture 생성
246
236
 
247
237
  42. 사용자에게 fixture 생성할지 확인
248
238
  43. 모든 엔티티의 prop에 `cone.note`가 존재하는지 체크
@@ -254,7 +244,7 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
254
244
  - `pnpm sonamu fixture gen --include User,Account,Session --count 10 --use-llm`
255
245
  - **CRITICAL**: User.id string PK를 위한 `users_id_seq`가 생성되어 있어야 함 (PHASE 0 Step 18-19에서 설정)
256
246
  - 상세 내용은 `auth-migration.md` "Better-auth 엔티티 Fixture 생성" 섹션 참조
257
- 46. 승인하면 테스트에서 batch로 나눈 대로 fixture 생성 (LLM 사용 필수)
247
+ 46. 승인하면 Claim 단위로 fixture 생성 (LLM 사용 필수)
258
248
  - `--use-llm` 옵션은 반드시 사용 (cone.note 기반 도메인 맥락 반영 필수)
259
249
  47. 실제 DB에 생성되었는지 사용자에게 확인 요청
260
250
  48. **`pnpm sonamu test`로 전체 테스트 재실행**
@@ -271,21 +261,19 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
271
261
 
272
262
  ---
273
263
 
274
- ## PHASE 5: Frontend 개발
264
+ ## PHASE 6: Frontend 개발
275
265
 
276
266
  **참조 스킬:** frontend.md
277
267
 
278
- ### 15. Frontend 계획
268
+ ### 16. Frontend 계획
279
269
 
280
270
  49. Frontend 개발 진행할지 사용자에게 확인
281
- 50. 승인 후 테스트에서 나눈 batch로 Frontend 개발 계획 세우기
282
- 51. `.claude/skills/project/frontend-plan.md`에 기록
283
- 52. `architecture.md`에 frontend-plan.md 링크 추가
271
+ 50. 승인 후 도메인별 Frontend 개발 계획을 `contract/{domain}/{domain}.contract.md`에 추가하거나 사용자와 구두로 확인
284
272
 
285
- ### 16. Batch별 Frontend 개발 (반복)
273
+ ### 17. Batch별 Frontend 개발 (반복)
286
274
 
287
- 53. batch 대로 조금씩 진행하며 **사용자에게 확인 요청**
288
- 54. 사용자가 브라우저에서 확인 후 Claude Code에게 피드백
275
+ 51. batch 대로 조금씩 진행하며 **사용자에게 확인 요청**
276
+ 52. 사용자가 브라우저에서 확인 후 Claude Code에게 피드백
289
277
  - "확인했다"
290
278
  - "로직대로 된다"
291
279
  - "이 부분이 잘 안 된다"
@@ -293,7 +281,6 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
293
281
 
294
282
  **완료 기준:**
295
283
 
296
- - [ ] frontend-plan.md 기록 완료
297
284
  - [ ] 모든 batch의 Frontend 구현 완료
298
285
  - [ ] 사용자 확인 및 피드백 반영 완료
299
286
 
@@ -301,17 +288,21 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
301
288
 
302
289
  ## 프로젝트 문서 구조
303
290
 
304
- 워크플로우 진행 중 다음 문서들이 프로젝트 루트의 `.claude/skills/project/`에 생성된다:
291
+ 워크플로우 진행 중 다음 문서들이 생성된다:
305
292
 
306
293
  ```
294
+ contract/
295
+ └── {domain}/
296
+ └── {domain}.contract.md # PHASE 1: 도메인 규칙 + 결정 근거 (영구 문서)
297
+
307
298
  .claude/skills/project/
308
- ├── requirements.md # PHASE 0: 사용자 요구사항 원문
309
- ├── business-logic.md # PHASE 0: 파악한 비즈니스 로직 (사용자 승인)
310
- ├── architecture.md # PHASE 1: 엔티티 설계안 + test-plan, frontend-plan 링크
311
- ├── test-plan.md # PHASE 3: batch별 테스트 계획
312
- └── frontend-plan.md # PHASE 5: batch별 Frontend 개발 계획
299
+ └── architecture.md # PHASE 2: 엔티티 설계안
300
+
301
+ tmp/claims/ # PHASE 4: 실행 Claim YAML (완료 후 폐기)
313
302
  ```
314
303
 
304
+ **Ground truth는 코드다.** `*.contract.md`는 코드 결정의 근거를 기록하는 문서이지 선행 정의서가 아니다. 코드와 `*.contract.md`가 충돌하면 코드를 우선한다.
305
+
315
306
  ---
316
307
 
317
308
  ## 핵심 원칙
@@ -320,6 +311,7 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
320
311
  2. **테스트는 `pnpm sonamu test`** — `pnpm test`는 CI용
321
312
  3. **순서를 지킬 것** — 단계를 건너뛰지 않음
322
313
  4. **사용자에게 자주 확인** — 추측하지 말고 질문
323
- 5. **batch 단위로 작업** — 한 번에 모든 것을 하지 않음
314
+ 5. **Claim 단위로 작업** — 한 번에 모든 것을 하지 않음
324
315
  6. **User 관련이 항상 우선** — 테스트, API, Frontend 모두
325
- 7. **문서를 기록**requirements, business-logic, architecture, test-plan, frontend-plan
316
+ 7. **Ground truth는 코드** `*.contract.md`는 근거 기록, 코드와 충돌 시 코드 우선
317
+ 8. **신규는 contract→Claim→AC→implement, 변경은 code→Claim→contract 갱신**
@@ -283,7 +283,7 @@ export class Syncer {
283
283
 
284
284
  async autoloadWorkflows() {
285
285
  this.workflows = await loadWorkflows();
286
- await Sonamu.workflows?.synchronize(this.workflows);
286
+ await Sonamu.workflows.synchronize(this.workflows);
287
287
  }
288
288
 
289
289
  async autoloadSSRRoutes(): Promise<void> {
@@ -31,10 +31,6 @@ export function createGlobalSetup() {
31
31
  };
32
32
  }
33
33
 
34
- if (!config.database) {
35
- throw new Error("database 설정이 필요합니다 (병렬 테스팅)");
36
- }
37
-
38
34
  const maxWorkers = config.test.maxWorkers ?? 4;
39
35
  const templateDb = `${config.database.name}_test`;
40
36
 
package/src/ui/api.ts CHANGED
@@ -1087,12 +1087,15 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1087
1087
 
1088
1088
  // Tasks API
1089
1089
  server.get("/api/tasks/status", async () => {
1090
- return { active: Sonamu.workflows !== null };
1090
+ try {
1091
+ Sonamu.workflows;
1092
+ return { active: true };
1093
+ } catch {
1094
+ return { active: false };
1095
+ }
1091
1096
  });
1092
1097
 
1093
1098
  server.get("/api/tasks/workflowDefinitions", async () => {
1094
- if (!Sonamu.workflows)
1095
- throw new Error("Workflows not initialized (database not configured)");
1096
1099
  const definitions = Sonamu.workflows.workflowDefinitions;
1097
1100
  return { definitions };
1098
1101
  });
@@ -1109,8 +1112,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1109
1112
  createdBefore?: string;
1110
1113
  };
1111
1114
  }>("/api/tasks/workflowRuns", async (request) => {
1112
- if (!Sonamu.workflows)
1113
- throw new Error("Workflows not initialized (database not configured)");
1114
1115
  const backend = Sonamu.workflows.backend;
1115
1116
  const { limit, after, before, order, status, workflowName, createdAfter, createdBefore } =
1116
1117
  request.query;
@@ -1129,8 +1130,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1129
1130
  server.get<{
1130
1131
  Params: { id: string };
1131
1132
  }>("/api/tasks/workflowRuns/:id", async (request) => {
1132
- if (!Sonamu.workflows)
1133
- throw new Error("Workflows not initialized (database not configured)");
1134
1133
  const backend = Sonamu.workflows.backend;
1135
1134
  const workflowRun = await backend.getWorkflowRun({
1136
1135
  workflowRunId: request.params.id,
@@ -1144,8 +1143,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1144
1143
  server.post<{
1145
1144
  Params: { id: string };
1146
1145
  }>("/api/tasks/workflowRuns/:id/cancel", async (request) => {
1147
- if (!Sonamu.workflows)
1148
- throw new Error("Workflows not initialized (database not configured)");
1149
1146
  const backend = Sonamu.workflows.backend;
1150
1147
  return backend.cancelWorkflowRun({
1151
1148
  workflowRunId: request.params.id,
@@ -1155,8 +1152,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1155
1152
  server.post<{
1156
1153
  Params: { id: string };
1157
1154
  }>("/api/tasks/workflowRuns/:id/pause", async (request) => {
1158
- if (!Sonamu.workflows)
1159
- throw new Error("Workflows not initialized (database not configured)");
1160
1155
  const backend = Sonamu.workflows.backend;
1161
1156
  return backend.pauseWorkflowRun({
1162
1157
  workflowRunId: request.params.id,
@@ -1166,8 +1161,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1166
1161
  server.post<{
1167
1162
  Params: { id: string };
1168
1163
  }>("/api/tasks/workflowRuns/:id/resume", async (request) => {
1169
- if (!Sonamu.workflows)
1170
- throw new Error("Workflows not initialized (database not configured)");
1171
1164
  const backend = Sonamu.workflows.backend;
1172
1165
  return backend.resumeWorkflowRun({
1173
1166
  workflowRunId: request.params.id,
@@ -1182,8 +1175,6 @@ export async function sonamuUIApiPlugin(fastify: FastifyInstance) {
1182
1175
  before?: string;
1183
1176
  };
1184
1177
  }>("/api/tasks/workflowRuns/:id/steps", async (request) => {
1185
- if (!Sonamu.workflows)
1186
- throw new Error("Workflows not initialized (database not configured)");
1187
1178
  const backend = Sonamu.workflows.backend;
1188
1179
  const { limit, after, before } = request.query;
1189
1180
  return backend.listStepAttempts({
@@ -1,270 +0,0 @@
1
- # 비즈니스 로직 상세
2
-
3
- > 이 문서는 개발 과정에서 정리되는 비즈니스 규칙과 로직을 기록합니다.
4
- > 대화를 통해 명확해진 내용들을 추가하여 일관된 구현을 유지합니다.
5
-
6
- ## 엔티티별 비즈니스 규칙
7
-
8
- ### [Entity명]
9
-
10
- #### 상태 전이
11
-
12
- <!--
13
- 예시:
14
- - draft → published: 관리자만 가능, 필수 필드 검증
15
- - published → closed: 마감일 이후 자동 전환
16
- - closed → archived: 90일 후 자동 전환
17
- -->
18
-
19
- #### 검증 규칙
20
-
21
- <!--
22
- 예시:
23
- - 제목: 3-100자, 필수
24
- - 시작일 < 종료일
25
- - 예산: 0 이상
26
- - 첨부파일: 최대 10MB, 5개까지
27
- -->
28
-
29
- #### 계산 로직
30
-
31
- <!--
32
- 예시:
33
- - 총점 = sum(평가항목별 점수 × 가중치)
34
- - 진행률 = (완료된 마일스톤 / 전체 마일스톤) × 100
35
- -->
36
-
37
- #### 권한 규칙
38
-
39
- <!--
40
- 예시:
41
- - 생성: 로그인한 모든 사용자
42
- - 수정: 작성자 본인 또는 관리자
43
- - 삭제: 관리자만
44
- - 조회: 공개 상태면 모두, 비공개면 작성자/관리자만
45
- -->
46
-
47
- ---
48
-
49
- ## 워크플로우
50
-
51
- ### [프로세스명]
52
-
53
- <!--
54
- 예시: 연구과제 평가 프로세스
55
-
56
- 1. 공고 발행 (관리자)
57
- 2. 과제 지원 (신청자)
58
- 3. 평가위원 배정 (관리자)
59
- 4. 평가표 작성 (평가위원)
60
- - 각 항목별 점수 입력
61
- - 총점 자동 계산
62
- - 의견 작성
63
- 5. 평가 완료 처리
64
- - 모든 평가위원 제출 완료 시
65
- - 평균 점수 계산
66
- 6. 선정 결과 발표 (관리자)
67
-
68
- 예시: 의료 실험 데이터 수집 프로세스
69
-
70
- 1. 프로토콜 승인 (IRB)
71
- 2. 피험자 모집 및 동의서 획득 (연구원)
72
- 3. 베이스라인 데이터 수집 (연구원)
73
- 4. 데이터 검증 (모니터)
74
- 5. 주기적 follow-up 데이터 수집
75
- - 스케줄 알림 자동 발송
76
- - 데이터 입력
77
- - 이상치 자동 플래그
78
- 6. 최종 분석 (연구책임자)
79
-
80
- 예시: 커머스 주문 처리 프로세스
81
-
82
- 1. 장바구니 담기 (고객)
83
- 2. 주문 생성 및 재고 예약 (시스템)
84
- 3. 결제 처리 (PG사 연동)
85
- 4. 결제 확인 및 주문 확정 (시스템)
86
- 5. 상품 준비 (판매자)
87
- 6. 배송 시작 (배송사 연동)
88
- 7. 배송 완료 (배송사 웹훅)
89
- 8. 구매 확정 (고객 또는 자동)
90
-
91
- 예시: AI Agent 대화 세션 프로세스
92
-
93
- 1. 세션 생성 (사용자)
94
- 2. 프롬프트 템플릿 선택 (사용자 또는 자동)
95
- 3. 사용자 메시지 입력
96
- 4. 모델 선택 및 파라미터 설정 (자동)
97
- 5. AI 응답 생성 (외부 API 호출)
98
- 6. 응답 저장 및 표시
99
- 7. 사용량 기록 (토큰 수 계산)
100
- 8. 세션 종료 또는 계속
101
-
102
- 예시: 의사 소통 도구 메시지 전달 프로세스
103
-
104
- 1. 메시지 작성 (의사)
105
- 2. 메시지 타입 감지 (텍스트/이미지/파일/음성)
106
- 3. 의료정보 포함 여부 자동 감지
107
- 4. 민감 정보 암호화 (필요시)
108
- 5. 채널 멤버에게 전송
109
- 6. 실시간 알림 발송 (푸시/이메일)
110
- 7. 읽음 상태 업데이트
111
- 8. 검색 인덱싱
112
- -->
113
-
114
- ---
115
-
116
- ## 상태 전이 다이어그램
117
-
118
- <!--
119
- Mermaid 다이어그램이나 텍스트로 표현
120
-
121
- 예시:
122
- ```
123
- [초안] --발행--> [발행됨] --마감--> [마감됨] --보관--> [보관됨]
124
- | |
125
- +----삭제--------+
126
- ```
127
- -->
128
-
129
- ---
130
-
131
- ## 비즈니스 제약사항
132
-
133
- <!--
134
- 예시 (연구과제):
135
- - 한 사용자는 동일 공고에 한 번만 지원 가능
136
- - 평가위원은 자신의 소속 기관 과제는 평가 불가
137
- - 평가 시작 후에는 평가 기준 변경 불가
138
- - 마감일 이후 지원서 수정 불가
139
-
140
- 예시 (의료 실험):
141
- - IRB 승인 없이는 데이터 수집 불가
142
- - 피험자는 언제든 참여 철회 가능
143
- - 프로토콜 일탈은 24시간 내 보고 필수
144
- - 데이터 삭제 요청시 익명화 처리 (완전 삭제 불가)
145
-
146
- 예시 (커머스):
147
- - 동일 상품 중복 재고 예약 방지
148
- - 결제 실패시 재고 예약 자동 해제
149
- - 판매자는 본인 상품만 수정 가능
150
- - 리뷰는 구매 확정 후에만 작성 가능
151
-
152
- 예시 (AI Agent):
153
- - 동시 세션 수 제한 (플랜별)
154
- - API 호출 실패시 3회 재시도 후 에러
155
- - 프롬프트 템플릿은 버전 관리 (삭제 불가)
156
- - 과거 대화는 수정 불가 (읽기 전용)
157
-
158
- 예시 (의사 소통 도구):
159
- - 채널 멤버만 메시지 접근 가능
160
- - 삭제된 메시지는 7일간 복구 가능
161
- - 민감 정보 포함 채널은 외부 초대 불가
162
- - 파일은 바이러스 검사 후 업로드
163
- -->
164
-
165
- ---
166
-
167
- ## 알림 규칙
168
-
169
- <!--
170
- 예시 (연구과제):
171
- - 공고 발행 시: 전체 사용자에게 이메일 발송
172
- - 평가 배정 시: 해당 평가위원에게 알림
173
- - 평가 마감 3일 전: 미제출 평가위원에게 알림
174
- - 선정 결과 발표 시: 지원자에게 개별 알림
175
-
176
- 예시 (의료 실험):
177
- - 방문 예정일 3일 전: 피험자에게 SMS 알림
178
- - 데이터 이상치 감지: 연구원에게 즉시 알림
179
- - 프로토콜 일탈 발생: 연구책임자에게 즉시 알림
180
- - 동의서 만료 30일 전: 연구원에게 갱신 알림
181
-
182
- 예시 (커머스):
183
- - 주문 확정: 판매자에게 즉시 알림
184
- - 배송 시작: 고객에게 추적번호 포함 알림
185
- - 재고 부족 (임계값 이하): 판매자에게 알림
186
- - 구매 확정: 판매자에게 정산 예정 알림
187
-
188
- 예시 (AI Agent):
189
- - 사용량 80% 도달: 사용자에게 경고
190
- - API 오류 발생: 관리자에게 즉시 알림
191
- - 세션 타임아웃 5분 전: 사용자에게 연장 여부 확인
192
- - 새 모델 추가: 전체 사용자에게 공지
193
-
194
- 예시 (의사 소통 도구):
195
- - 새 메시지: 채널 멤버에게 실시간 푸시
196
- - 멘션 시: 해당 사용자에게 강조 알림
197
- - 파일 업로드 완료: 업로더에게 알림
198
- - 읽지 않은 메시지 100개 이상: 일일 요약 이메일
199
- -->
200
-
201
- ---
202
-
203
- ## 예외 처리
204
-
205
- <!--
206
- 예시:
207
- - 중복 지원 시도: "이미 지원한 공고입니다" 에러
208
- - 권한 없는 수정: "권한이 없습니다" 에러
209
- - 마감 후 지원: "마감된 공고입니다" 에러
210
- - 필수 필드 누락: 구체적인 필드명 포함 에러
211
- -->
212
-
213
- ---
214
-
215
- ## 데이터 일관성
216
-
217
- <!--
218
- 예시 (연구과제):
219
- - 과제 삭제 시: 관련 평가 데이터도 함께 삭제 (CASCADE)
220
- - 사용자 삭제 시: 작성한 콘텐츠는 유지하되 "탈퇴한 사용자"로 표시
221
- - 평가표 제출 후: 평가 항목 변경 불가 (버전 관리)
222
-
223
- 예시 (의료 실험):
224
- - 피험자 탈퇴 시: 데이터는 익명화하여 보존
225
- - 프로토콜 변경 시: 기존 버전도 보관 (감사 추적)
226
- - 동의서 철회 시: 향후 데이터 수집 중단, 기존 데이터는 익명화
227
-
228
- 예시 (커머스):
229
- - 상품 삭제 시: 주문 히스토리는 유지 (스냅샷)
230
- - 주문 취소 시: 재고 복원, 결제 환불 처리
231
- - 판매자 탈퇴 시: 진행 중인 주문 완료 후 계정 비활성화
232
-
233
- 예시 (AI Agent):
234
- - 프롬프트 템플릿 삭제 시: 기존 세션은 유지 (soft delete)
235
- - 사용자 삭제 시: 대화 히스토리 익명화
236
- - 모델 변경 시: 기존 세션은 기존 모델 설정 유지
237
-
238
- 예시 (의사 소통 도구):
239
- - 채널 삭제 시: 메시지 30일간 보관 후 영구 삭제
240
- - 사용자 탈퇴 시: 메시지는 유지하되 "탈퇴한 사용자"로 표시
241
- - 파일 삭제 시: 참조하는 메시지가 있으면 soft delete
242
- -->
243
-
244
- ---
245
-
246
- ## 성능 고려사항
247
-
248
- <!--
249
- 예시:
250
- - 대시보드 통계: 캐시 적용 (5분 TTL)
251
- - 검색: 인덱스 적용 필요 필드 명시
252
- - 파일 업로드: 비동기 처리
253
- - 대량 데이터: 페이지네이션 필수
254
- -->
255
-
256
- ---
257
-
258
- ## 개발 중 논의 내역
259
-
260
- <!--
261
- 날짜별로 대화 중 정리된 내용 기록
262
-
263
- ### 2024-01-15
264
- - 평가 점수 계산 방식 확정: 가중치 평균 사용
265
- - 동점자 처리: 특정 항목 우선순위로 결정
266
-
267
- ### 2024-01-20
268
- - 첨부파일 저장 방식: S3 사용 결정
269
- - 파일명 중복 처리: UUID 접두사 추가
270
- -->