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.
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +1 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +14 -19
- package/dist/cone/cone-generator.js +29 -16
- package/dist/database/base-model.js +2 -2
- package/dist/database/db.d.ts +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +1 -1
- package/dist/syncer/syncer.js +2 -2
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +1 -4
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -11
- package/package.json +4 -4
- package/src/api/config.ts +1 -1
- package/src/api/sonamu.ts +15 -20
- package/src/cone/cone-generator.ts +39 -19
- package/src/database/base-model.ts +1 -1
- package/src/database/db.ts +1 -1
- package/src/skills/AGENTS.md +11 -1
- package/src/skills/sonamu/SKILL.md +42 -149
- package/src/skills/sonamu/cdd.md +172 -517
- package/src/skills/sonamu/cone.md +3 -4
- package/src/skills/sonamu/fixture-cli.md +1 -1
- package/src/skills/sonamu/workflow.md +72 -80
- package/src/syncer/syncer.ts +1 -1
- package/src/testing/global-setup.ts +0 -4
- package/src/ui/api.ts +6 -15
- package/src/skills/project/business-logic.md +0 -270
- package/src/skills/project/requirements.md +0 -160
|
@@ -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.
|
|
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.
|
|
306
|
-
2. `
|
|
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이 `
|
|
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~
|
|
35
|
+
**CRITICAL: 이 단계(Step 4~5)를 완료하기 전에 auth generate나 인프라 기동으로 넘어가지 않는다.**
|
|
36
36
|
|
|
37
|
-
4.
|
|
38
|
-
5. 비즈니스 로직 파악 후 **작은 단위로** 사용자에게 확인받기
|
|
37
|
+
4. 요구사항을 파악하고 도메인을 식별. 도메인별로 작은 단위로 사용자에게 확인받기
|
|
39
38
|
- 한 번에 전체를 확인하지 말고 도메인별로 나누어 확인
|
|
40
39
|
- "이 부분이 맞나요?" 식으로 구체적으로 질문
|
|
41
|
-
|
|
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
|
-
- [ ]
|
|
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
|
|
87
|
+
## PHASE 1: 도메인 Logic 문서화
|
|
89
88
|
|
|
90
89
|
**참조 스킬:** cdd.md
|
|
91
90
|
|
|
92
|
-
**CRITICAL: 이 PHASE가 완료되기 전에 엔티티 설계(PHASE
|
|
91
|
+
**CRITICAL: 이 PHASE가 완료되기 전에 엔티티 설계(PHASE 2)를 시작하지 않는다.**
|
|
93
92
|
|
|
94
|
-
### 7.
|
|
93
|
+
### 7. 도메인별 `*.contract.md` 작성
|
|
95
94
|
|
|
96
|
-
20. `
|
|
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
|
-
-
|
|
108
|
-
-
|
|
97
|
+
- 도메인 규칙, 상태 전이, 권한, Edge Cases 등 코드만으로 파악하기 어려운 결정 근거 포함
|
|
98
|
+
- 처음부터 완벽할 필요 없음 — 사용자와 대화하면서 점진적으로 정리
|
|
99
|
+
21. 도메인별로 작성 후 사용자에게 확인받기 (도메인별로 하나씩)
|
|
109
100
|
|
|
110
|
-
|
|
101
|
+
**`*.contract.md` 형식:**
|
|
111
102
|
|
|
112
|
-
|
|
103
|
+
```markdown
|
|
104
|
+
# {도메인} 비즈니스 로직
|
|
113
105
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
- 사용자 검토 및 수정 반영
|
|
121
|
-
- 모든 spec 검토 완료 후에만 다음 PHASE로 진행
|
|
106
|
+
## 규칙
|
|
107
|
+
- 규칙과 결정 근거
|
|
108
|
+
|
|
109
|
+
## 워크플로우
|
|
110
|
+
1. ...
|
|
111
|
+
```
|
|
122
112
|
|
|
123
113
|
**완료 기준:**
|
|
124
114
|
|
|
125
|
-
- [ ] `
|
|
126
|
-
- [ ]
|
|
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
|
|
120
|
+
## PHASE 2: 엔티티 설계
|
|
134
121
|
|
|
135
122
|
**참조 스킬:** entity-basic.md, entity-relations.md
|
|
136
123
|
|
|
137
|
-
**전제 조건:** PHASE
|
|
124
|
+
**전제 조건:** PHASE 1 완료 (모든 도메인 `*.contract.md` 사용자 확인 완료)
|
|
138
125
|
|
|
139
|
-
###
|
|
126
|
+
### 8. 엔티티 설계
|
|
140
127
|
|
|
141
128
|
20. 사용자 요구사항에 맞는 엔티티 설계
|
|
142
129
|
- 설계하면서 사용자에게 비즈니스 로직에 맞는지 **지속적으로 디테일하게** 확인받을 것
|
|
@@ -156,22 +143,22 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
|
|
|
156
143
|
|
|
157
144
|
---
|
|
158
145
|
|
|
159
|
-
## PHASE
|
|
146
|
+
## PHASE 3: 엔티티 생성 및 마이그레이션
|
|
160
147
|
|
|
161
148
|
**참조 스킬:** entity-basic.md, entity-validation-checklist.md, migration.md
|
|
162
149
|
|
|
163
|
-
###
|
|
150
|
+
### 9. 엔티티 생성
|
|
164
151
|
|
|
165
152
|
22. 설계에 따라 **batch로** entity.json 생성
|
|
166
153
|
23. biome check, type check
|
|
167
154
|
24. 문제 없이 빌드되는지 확인
|
|
168
155
|
|
|
169
|
-
###
|
|
156
|
+
### 10. 마이그레이션
|
|
170
157
|
|
|
171
158
|
25. 사용자에게 Sonamu UI와 CLI 중 어떤 방식으로 migration을 진행할지 확인 후 실행
|
|
172
159
|
26. 실제 테이블이 생성되었는지 확인
|
|
173
160
|
|
|
174
|
-
###
|
|
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
|
|
195
|
+
## PHASE 4: 테스트 및 API 구현
|
|
196
|
+
|
|
197
|
+
**참조 스킬:** testing.md, testing-devrunner.md, naite.md, cdd.md
|
|
209
198
|
|
|
210
|
-
|
|
199
|
+
### 12. AC 구체화 및 Claim 구성
|
|
211
200
|
|
|
212
|
-
|
|
201
|
+
**AC(수락 기준)는 테스트 파일의 describe/test 이름이다.** 별도 문서로 관리하지 않는다.
|
|
213
202
|
|
|
214
|
-
33.
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
###
|
|
210
|
+
### 13. Claim 실행 (반복)
|
|
219
211
|
|
|
220
|
-
각
|
|
212
|
+
각 Claim마다:
|
|
221
213
|
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
###
|
|
219
|
+
### 14. 전체 검증
|
|
229
220
|
|
|
230
|
-
40. 모든
|
|
221
|
+
40. 모든 Claim 완료 후 전체 biome check, type check 및 빌드 확인
|
|
231
222
|
41. **`pnpm sonamu test`로 전체 테스트 실행**
|
|
232
223
|
|
|
233
224
|
**완료 기준:**
|
|
234
225
|
|
|
235
|
-
- [ ]
|
|
236
|
-
- [ ] 모든
|
|
237
|
-
- [ ] 모든
|
|
226
|
+
- [ ] 모든 도메인 AC 정의 완료 (테스트 파일에 스켈레톤으로 존재)
|
|
227
|
+
- [ ] 모든 Claim 실행 완료
|
|
228
|
+
- [ ] 모든 테스트 통과
|
|
238
229
|
- [ ] 전체 biome check, type check, build 통과
|
|
239
|
-
- [ ] 전체 테스트 통과
|
|
240
230
|
|
|
241
231
|
---
|
|
242
232
|
|
|
243
|
-
## PHASE
|
|
233
|
+
## PHASE 5: Fixture 생성
|
|
244
234
|
|
|
245
|
-
###
|
|
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. 승인하면
|
|
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
|
|
264
|
+
## PHASE 6: Frontend 개발
|
|
275
265
|
|
|
276
266
|
**참조 스킬:** frontend.md
|
|
277
267
|
|
|
278
|
-
###
|
|
268
|
+
### 16. Frontend 계획
|
|
279
269
|
|
|
280
270
|
49. Frontend 개발 진행할지 사용자에게 확인
|
|
281
|
-
50. 승인 후
|
|
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
|
-
###
|
|
273
|
+
### 17. Batch별 Frontend 개발 (반복)
|
|
286
274
|
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
워크플로우 진행 중 다음 문서들이
|
|
291
|
+
워크플로우 진행 중 다음 문서들이 생성된다:
|
|
305
292
|
|
|
306
293
|
```
|
|
294
|
+
contract/
|
|
295
|
+
└── {domain}/
|
|
296
|
+
└── {domain}.contract.md # PHASE 1: 도메인 규칙 + 결정 근거 (영구 문서)
|
|
297
|
+
|
|
307
298
|
.claude/skills/project/
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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. **
|
|
314
|
+
5. **Claim 단위로 작업** — 한 번에 모든 것을 하지 않음
|
|
324
315
|
6. **User 관련이 항상 우선** — 테스트, API, Frontend 모두
|
|
325
|
-
7.
|
|
316
|
+
7. **Ground truth는 코드** — `*.contract.md`는 근거 기록, 코드와 충돌 시 코드 우선
|
|
317
|
+
8. **신규는 contract→Claim→AC→implement, 변경은 code→Claim→contract 갱신**
|
package/src/syncer/syncer.ts
CHANGED
|
@@ -283,7 +283,7 @@ export class Syncer {
|
|
|
283
283
|
|
|
284
284
|
async autoloadWorkflows() {
|
|
285
285
|
this.workflows = await loadWorkflows();
|
|
286
|
-
await Sonamu.workflows
|
|
286
|
+
await Sonamu.workflows.synchronize(this.workflows);
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
async autoloadSSRRoutes(): Promise<void> {
|
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
|
-
|
|
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
|
-
-->
|