@litmers/cursorflow-orchestrator 0.1.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/CHANGELOG.md +78 -0
- package/LICENSE +21 -0
- package/README.md +310 -0
- package/commands/cursorflow-clean.md +162 -0
- package/commands/cursorflow-init.md +67 -0
- package/commands/cursorflow-monitor.md +131 -0
- package/commands/cursorflow-prepare.md +134 -0
- package/commands/cursorflow-resume.md +181 -0
- package/commands/cursorflow-review.md +220 -0
- package/commands/cursorflow-run.md +129 -0
- package/package.json +52 -0
- package/scripts/postinstall.js +27 -0
- package/src/cli/clean.js +30 -0
- package/src/cli/index.js +93 -0
- package/src/cli/init.js +235 -0
- package/src/cli/monitor.js +29 -0
- package/src/cli/resume.js +31 -0
- package/src/cli/run.js +51 -0
- package/src/cli/setup-commands.js +210 -0
- package/src/core/orchestrator.js +185 -0
- package/src/core/reviewer.js +233 -0
- package/src/core/runner.js +343 -0
- package/src/utils/config.js +195 -0
- package/src/utils/cursor-agent.js +190 -0
- package/src/utils/git.js +311 -0
- package/src/utils/logger.js +178 -0
- package/src/utils/state.js +207 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# CursorFlow Monitor
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
레인 실행 상태를 모니터링합니다. 실시간으로 진행 상황을 확인하고 로그를 조회할 수 있습니다.
|
|
5
|
+
|
|
6
|
+
## Steps
|
|
7
|
+
|
|
8
|
+
1. **실시간 모니터링**
|
|
9
|
+
```bash
|
|
10
|
+
cursorflow monitor --watch
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. **특정 run 모니터링**
|
|
14
|
+
```bash
|
|
15
|
+
cursorflow monitor _cursorflow/logs/runs/my-run/
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
3. **상태 확인**
|
|
19
|
+
|
|
20
|
+
레인별 상태 정보:
|
|
21
|
+
- pending: 대기 중
|
|
22
|
+
- running: 실행 중
|
|
23
|
+
- completed: 완료
|
|
24
|
+
- failed: 실패
|
|
25
|
+
- blocked_dependency: 의존성 대기
|
|
26
|
+
|
|
27
|
+
4. **로그 확인**
|
|
28
|
+
|
|
29
|
+
각 레인의 로그 파일:
|
|
30
|
+
- `state.json`: 현재 상태
|
|
31
|
+
- `conversation.jsonl`: 에이전트 대화
|
|
32
|
+
- `git-operations.jsonl`: Git 작업
|
|
33
|
+
- `events.jsonl`: 이벤트 로그
|
|
34
|
+
|
|
35
|
+
## 옵션
|
|
36
|
+
|
|
37
|
+
| 옵션 | 설명 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| `--watch` | 실시간 갱신 (2초 간격) |
|
|
40
|
+
| `--interval <sec>` | 갱신 간격 (초) |
|
|
41
|
+
| `--json` | JSON 형식으로 출력 |
|
|
42
|
+
|
|
43
|
+
## 예제
|
|
44
|
+
|
|
45
|
+
### 최신 run 모니터링
|
|
46
|
+
```bash
|
|
47
|
+
cursorflow monitor
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 실시간 모니터링 (5초 간격)
|
|
51
|
+
```bash
|
|
52
|
+
cursorflow monitor --watch --interval 5
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### JSON 출력
|
|
56
|
+
```bash
|
|
57
|
+
cursorflow monitor --json | jq
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 출력 예시
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
64
|
+
📡 Lane 상태 모니터링
|
|
65
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
66
|
+
|
|
67
|
+
Run: 01-dashboard-2025-12-19T18-30-00
|
|
68
|
+
|
|
69
|
+
- 01-dashboard: running (2/3)
|
|
70
|
+
- 02-client: completed (3/3)
|
|
71
|
+
- 03-projects: blocked_dependency (1/2)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 로그 조회
|
|
75
|
+
|
|
76
|
+
### 대화 기록
|
|
77
|
+
```bash
|
|
78
|
+
cat _cursorflow/logs/runs/01-dashboard-xxx/conversation.jsonl | jq
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Git 작업 로그
|
|
82
|
+
```bash
|
|
83
|
+
cat _cursorflow/logs/runs/01-dashboard-xxx/git-operations.jsonl | jq
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 이벤트 로그
|
|
87
|
+
```bash
|
|
88
|
+
cat _cursorflow/logs/runs/01-dashboard-xxx/events.jsonl | jq
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 상태 분석
|
|
92
|
+
|
|
93
|
+
### 레인별 진행률
|
|
94
|
+
```bash
|
|
95
|
+
# 모든 레인의 state.json 확인
|
|
96
|
+
for state in _cursorflow/logs/runs/*/lanes/*/state.json; do
|
|
97
|
+
echo "$(dirname $state):"
|
|
98
|
+
jq '.status, .currentTaskIndex, .totalTasks' $state
|
|
99
|
+
done
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 실패한 레인 찾기
|
|
103
|
+
```bash
|
|
104
|
+
# status가 failed인 레인
|
|
105
|
+
find _cursorflow/logs/runs -name "state.json" -exec sh -c \
|
|
106
|
+
'jq -r "select(.status==\"failed\") | .label" {}' \;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Checklist
|
|
110
|
+
- [ ] 레인 상태가 정상인가?
|
|
111
|
+
- [ ] 에러가 발생했는가?
|
|
112
|
+
- [ ] 로그를 확인했는가?
|
|
113
|
+
- [ ] Blocked lane이 있는가?
|
|
114
|
+
- [ ] 의존성 문제는 없는가?
|
|
115
|
+
|
|
116
|
+
## 트러블슈팅
|
|
117
|
+
|
|
118
|
+
### 레인이 멈춘 경우
|
|
119
|
+
1. `state.json`에서 상태 확인
|
|
120
|
+
2. `conversation.jsonl`에서 마지막 대화 확인
|
|
121
|
+
3. 필요시 `cursorflow resume <lane>`로 재개
|
|
122
|
+
|
|
123
|
+
### 로그가 없는 경우
|
|
124
|
+
1. 실행이 시작되었는지 확인
|
|
125
|
+
2. 로그 디렉토리 권한 확인
|
|
126
|
+
3. 설정 파일의 logsDir 경로 확인
|
|
127
|
+
|
|
128
|
+
## Next Steps
|
|
129
|
+
1. 문제 발견 시 `cursorflow resume`로 재개
|
|
130
|
+
2. 완료된 레인의 PR 확인
|
|
131
|
+
3. 로그 분석으로 개선점 파악
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# CursorFlow Prepare
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
새 Feature에 대한 태스크 파일을 준비합니다. Feature 정보를 수집하고 레인별 JSON 파일을 생성합니다.
|
|
5
|
+
|
|
6
|
+
## 필수 참조
|
|
7
|
+
- 패키지 문서: `node_modules/@cursorflow/orchestrator/docs/GUIDE.md`
|
|
8
|
+
- 모델 목록: 터미널에서 `cursorflow models --list` 실행
|
|
9
|
+
|
|
10
|
+
## Steps
|
|
11
|
+
|
|
12
|
+
1. **Feature 정보 수집**
|
|
13
|
+
|
|
14
|
+
사용자에게 다음 정보를 확인합니다:
|
|
15
|
+
```
|
|
16
|
+
📋 태스크 준비 정보
|
|
17
|
+
================
|
|
18
|
+
|
|
19
|
+
1. Feature 이름: [예: SchemaUpdate, AdminDashboard]
|
|
20
|
+
2. 레인 개수: [예: 3]
|
|
21
|
+
3. 레인별 작업 내용:
|
|
22
|
+
- Lane 1: [작업 설명]
|
|
23
|
+
- Lane 2: [작업 설명]
|
|
24
|
+
- ...
|
|
25
|
+
4. 의존성 변경 필요 여부: [Y/N]
|
|
26
|
+
5. 참조할 기존 태스크 (선택): [경로 또는 N]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. **태스크 폴더 생성**
|
|
30
|
+
```bash
|
|
31
|
+
# 타임스탬프 기반 폴더명 생성 (YYMMDDHHMM - 10자리)
|
|
32
|
+
TIMESTAMP=$(date +%y%m%d%H%M)
|
|
33
|
+
FEATURE_NAME="<사용자 입력>"
|
|
34
|
+
TASK_DIR="_cursorflow/tasks/${TIMESTAMP}_${FEATURE_NAME}"
|
|
35
|
+
|
|
36
|
+
mkdir -p "$TASK_DIR"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
3. **태스크 JSON 템플릿**
|
|
40
|
+
|
|
41
|
+
각 레인마다 다음 구조의 JSON 파일을 생성합니다:
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"repository": "https://github.com/org/repo",
|
|
45
|
+
"baseBranch": "main",
|
|
46
|
+
"branchPrefix": "<feature>/<lane>-",
|
|
47
|
+
"executor": "cursor-agent",
|
|
48
|
+
"autoCreatePr": false,
|
|
49
|
+
"allowDependencyChange": false,
|
|
50
|
+
"lockfileReadOnly": true,
|
|
51
|
+
"pollInterval": 60,
|
|
52
|
+
|
|
53
|
+
"laneNumber": 1,
|
|
54
|
+
"devPort": 3001,
|
|
55
|
+
|
|
56
|
+
"enableReview": true,
|
|
57
|
+
"reviewModel": "sonnet-4.5-thinking",
|
|
58
|
+
"maxReviewIterations": 3,
|
|
59
|
+
|
|
60
|
+
"tasks": [
|
|
61
|
+
{
|
|
62
|
+
"name": "plan",
|
|
63
|
+
"model": "opus-4.5-thinking",
|
|
64
|
+
"acceptanceCriteria": [
|
|
65
|
+
"계획서 파일 생성됨"
|
|
66
|
+
],
|
|
67
|
+
"prompt": "..."
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
4. **모델 선택 가이드**
|
|
74
|
+
|
|
75
|
+
| 모델 | 용도 | 비고 |
|
|
76
|
+
|------|------|------|
|
|
77
|
+
| `sonnet-4.5` | 일반 구현, 빠른 작업 | 가장 범용적 |
|
|
78
|
+
| `sonnet-4.5-thinking` | 코드 리뷰, 추론 강화 | Thinking 모델 |
|
|
79
|
+
| `opus-4.5` | 복잡한 작업, 고품질 | 고급 모델 |
|
|
80
|
+
| `opus-4.5-thinking` | 아키텍처 설계 | 최고급 |
|
|
81
|
+
| `gpt-5.2` | 일반 작업용 | OpenAI |
|
|
82
|
+
| `gpt-5.2-high` | 고급 추론 | 고성능 |
|
|
83
|
+
|
|
84
|
+
5. **생성 결과 확인**
|
|
85
|
+
```
|
|
86
|
+
✅ 태스크 준비 완료
|
|
87
|
+
=================
|
|
88
|
+
|
|
89
|
+
폴더: _cursorflow/tasks/<timestamp>_<feature>/
|
|
90
|
+
생성된 파일:
|
|
91
|
+
- 01-<lane1>.json
|
|
92
|
+
- 02-<lane2>.json
|
|
93
|
+
- ...
|
|
94
|
+
- README.md
|
|
95
|
+
|
|
96
|
+
다음 명령어로 실행:
|
|
97
|
+
cursorflow run _cursorflow/tasks/<timestamp>_<feature>/
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 예제
|
|
101
|
+
|
|
102
|
+
### 단일 레인 태스크
|
|
103
|
+
```bash
|
|
104
|
+
cursorflow prepare MyFeature --lanes 1
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 멀티 레인 태스크
|
|
108
|
+
```bash
|
|
109
|
+
cursorflow prepare AdminDashboard --lanes 5
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 커스텀 템플릿 사용
|
|
113
|
+
```bash
|
|
114
|
+
cursorflow prepare MyFeature --template ./my-template.json
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Checklist
|
|
118
|
+
- [ ] Feature 이름이 명확한가?
|
|
119
|
+
- [ ] 레인별 작업이 정의되었는가?
|
|
120
|
+
- [ ] 모델 선택이 적절한가?
|
|
121
|
+
- [ ] 의존성 변경 필요 여부를 확인했는가?
|
|
122
|
+
- [ ] Acceptance Criteria가 명확한가?
|
|
123
|
+
- [ ] 생성된 파일들을 검토했는가?
|
|
124
|
+
|
|
125
|
+
## 주의사항
|
|
126
|
+
1. **모델명**: 유효한 모델만 사용 (models 명령으로 확인)
|
|
127
|
+
2. **경로**: 태스크는 항상 `_cursorflow/tasks/`에 생성
|
|
128
|
+
3. **브랜치 프리픽스**: 충돌하지 않도록 고유하게 설정
|
|
129
|
+
4. **devPort**: 레인마다 고유한 포트 (3001, 3002, ...)
|
|
130
|
+
|
|
131
|
+
## Next Steps
|
|
132
|
+
1. 생성된 JSON 파일들을 프로젝트에 맞게 수정
|
|
133
|
+
2. 프롬프트 내용을 상세하게 작성
|
|
134
|
+
3. `cursorflow run`으로 태스크 실행
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# CursorFlow Resume
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
중단되거나 실패한 레인을 재개합니다. 상태를 복구하거나 처음부터 다시 시작할 수 있습니다.
|
|
5
|
+
|
|
6
|
+
## Steps
|
|
7
|
+
|
|
8
|
+
1. **레인 상태 확인**
|
|
9
|
+
```bash
|
|
10
|
+
cursorflow monitor
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. **레인 재개**
|
|
14
|
+
```bash
|
|
15
|
+
cursorflow resume <lane-name>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
3. **브랜치 정리 후 재시작**
|
|
19
|
+
```bash
|
|
20
|
+
cursorflow resume <lane-name> --clean
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
4. **처음부터 다시 시작**
|
|
24
|
+
```bash
|
|
25
|
+
cursorflow resume <lane-name> --restart
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 옵션
|
|
29
|
+
|
|
30
|
+
| 옵션 | 설명 |
|
|
31
|
+
|------|------|
|
|
32
|
+
| `--run-dir <path>` | 특정 run 디렉토리 지정 |
|
|
33
|
+
| `--clean` | 브랜치 정리 후 재시작 |
|
|
34
|
+
| `--restart` | 처음부터 다시 시작 |
|
|
35
|
+
| `--force` | 확인 없이 진행 |
|
|
36
|
+
|
|
37
|
+
## 예제
|
|
38
|
+
|
|
39
|
+
### 기본 재개
|
|
40
|
+
```bash
|
|
41
|
+
# 최신 run에서 해당 레인 재개
|
|
42
|
+
cursorflow resume 01-dashboard
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 특정 run에서 재개
|
|
46
|
+
```bash
|
|
47
|
+
cursorflow resume --run-dir _cursorflow/logs/runs/my-run/ 01-dashboard
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 브랜치 충돌 해결 후 재개
|
|
51
|
+
```bash
|
|
52
|
+
# 기존 브랜치 정리 후 재시작
|
|
53
|
+
cursorflow resume 01-dashboard --clean
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 완전히 새로 시작
|
|
57
|
+
```bash
|
|
58
|
+
# 모든 상태 초기화 후 재시작
|
|
59
|
+
cursorflow resume 01-dashboard --restart
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 재개 프로세스
|
|
63
|
+
|
|
64
|
+
1. **상태 확인**
|
|
65
|
+
- `state.json` 파일 로드
|
|
66
|
+
- 마지막 태스크 위치 확인
|
|
67
|
+
- Worktree 상태 확인
|
|
68
|
+
|
|
69
|
+
2. **환경 복구**
|
|
70
|
+
- Worktree 접근 가능 여부 확인
|
|
71
|
+
- 브랜치 체크아웃
|
|
72
|
+
- 미커밋 변경사항 확인
|
|
73
|
+
|
|
74
|
+
3. **실행 재개**
|
|
75
|
+
- 중단된 태스크부터 계속
|
|
76
|
+
- 또는 새로 시작 (--restart)
|
|
77
|
+
|
|
78
|
+
4. **완료**
|
|
79
|
+
- 남은 태스크 모두 수행
|
|
80
|
+
- 변경사항 커밋 및 푸시
|
|
81
|
+
|
|
82
|
+
## 상태 파일 예시
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"label": "01-dashboard",
|
|
87
|
+
"status": "failed",
|
|
88
|
+
"currentTaskIndex": 1,
|
|
89
|
+
"totalTasks": 3,
|
|
90
|
+
"worktreeDir": ".cursorflow/logs/worktrees/01-dashboard-abc123",
|
|
91
|
+
"pipelineBranch": "feature/dashboard-abc123",
|
|
92
|
+
"error": "Build failed",
|
|
93
|
+
"startTime": 1734567890000,
|
|
94
|
+
"endTime": null
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Checklist
|
|
99
|
+
- [ ] 레인이 실제로 중단되었는가?
|
|
100
|
+
- [ ] 상태 파일이 존재하는가?
|
|
101
|
+
- [ ] 브랜치 충돌은 없는가?
|
|
102
|
+
- [ ] Worktree가 존재하는가?
|
|
103
|
+
- [ ] 미커밋 변경사항이 있는가?
|
|
104
|
+
|
|
105
|
+
## 트러블슈팅
|
|
106
|
+
|
|
107
|
+
### 상태 파일이 없는 경우
|
|
108
|
+
```bash
|
|
109
|
+
# 최신 run 디렉토리 확인
|
|
110
|
+
ls -lt _cursorflow/logs/runs/
|
|
111
|
+
|
|
112
|
+
# 특정 run 지정
|
|
113
|
+
cursorflow resume --run-dir _cursorflow/logs/runs/latest/ 01-dashboard
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 브랜치 충돌
|
|
117
|
+
```bash
|
|
118
|
+
# 기존 브랜치 확인
|
|
119
|
+
git branch | grep dashboard
|
|
120
|
+
|
|
121
|
+
# 정리 후 재개
|
|
122
|
+
cursorflow resume 01-dashboard --clean
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Worktree 문제
|
|
126
|
+
```bash
|
|
127
|
+
# Worktree 목록 확인
|
|
128
|
+
git worktree list
|
|
129
|
+
|
|
130
|
+
# 문제 있는 worktree 제거
|
|
131
|
+
git worktree remove <path> --force
|
|
132
|
+
|
|
133
|
+
# 재개
|
|
134
|
+
cursorflow resume 01-dashboard --restart
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 의존성 블록
|
|
138
|
+
```bash
|
|
139
|
+
# 의존성이 해결되었는지 확인
|
|
140
|
+
cursorflow monitor
|
|
141
|
+
|
|
142
|
+
# 의존성 해결 후 재개
|
|
143
|
+
cursorflow resume 01-dashboard
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 재개 시나리오
|
|
147
|
+
|
|
148
|
+
### 시나리오 1: 네트워크 오류로 중단
|
|
149
|
+
```bash
|
|
150
|
+
# 단순 재개 (같은 위치부터 계속)
|
|
151
|
+
cursorflow resume 01-dashboard
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 시나리오 2: 빌드 에러로 실패
|
|
155
|
+
```bash
|
|
156
|
+
# 코드 수정 후
|
|
157
|
+
cd .cursorflow/logs/worktrees/01-dashboard-xxx/
|
|
158
|
+
# ... 코드 수정 ...
|
|
159
|
+
git add -A
|
|
160
|
+
git commit -m "fix: build error"
|
|
161
|
+
|
|
162
|
+
# 다음 태스크부터 계속
|
|
163
|
+
cursorflow resume 01-dashboard
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 시나리오 3: 브랜치 충돌
|
|
167
|
+
```bash
|
|
168
|
+
# 브랜치 정리 후 새로 시작
|
|
169
|
+
cursorflow resume 01-dashboard --clean
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 시나리오 4: 처음부터 다시
|
|
173
|
+
```bash
|
|
174
|
+
# 모든 상태 초기화
|
|
175
|
+
cursorflow resume 01-dashboard --restart
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Next Steps
|
|
179
|
+
1. 재개 후 `cursorflow monitor --watch`로 모니터링
|
|
180
|
+
2. 완료 시 PR 확인
|
|
181
|
+
3. 반복 실패 시 태스크 설정 검토
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# CursorFlow Review
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
코드 리뷰 기능을 설정하고 리뷰 결과를 확인합니다. AI 기반 자동 리뷰로 코드 품질을 향상시킵니다.
|
|
5
|
+
|
|
6
|
+
## Steps
|
|
7
|
+
|
|
8
|
+
1. **리뷰 활성화**
|
|
9
|
+
|
|
10
|
+
`cursorflow.config.js` 파일에서 설정:
|
|
11
|
+
```javascript
|
|
12
|
+
module.exports = {
|
|
13
|
+
enableReview: true,
|
|
14
|
+
reviewModel: 'sonnet-4.5-thinking',
|
|
15
|
+
maxReviewIterations: 3,
|
|
16
|
+
// ...
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
2. **Acceptance Criteria 정의**
|
|
21
|
+
|
|
22
|
+
태스크 JSON 파일에 검증 기준 추가:
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"tasks": [
|
|
26
|
+
{
|
|
27
|
+
"name": "implement",
|
|
28
|
+
"model": "sonnet-4.5",
|
|
29
|
+
"acceptanceCriteria": [
|
|
30
|
+
"빌드 에러 없음",
|
|
31
|
+
"TypeScript 타입 에러 없음",
|
|
32
|
+
"주요 기능 구현됨",
|
|
33
|
+
"테스트 통과"
|
|
34
|
+
],
|
|
35
|
+
"prompt": "..."
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
3. **리뷰 실행**
|
|
42
|
+
|
|
43
|
+
리뷰는 태스크 완료 후 자동으로 실행됩니다.
|
|
44
|
+
|
|
45
|
+
4. **리뷰 결과 확인**
|
|
46
|
+
```bash
|
|
47
|
+
# 리뷰 결과 파일 확인
|
|
48
|
+
cat _cursorflow/logs/runs/<lane>/review-results.json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 리뷰 모델
|
|
52
|
+
|
|
53
|
+
| 모델 | 특징 | 권장 용도 |
|
|
54
|
+
|------|------|-----------|
|
|
55
|
+
| `sonnet-4.5-thinking` | 추론 강화, 정확한 분석 | 일반 코드 리뷰 (권장) |
|
|
56
|
+
| `opus-4.5-thinking` | 최고 품질, 상세 리뷰 | 중요한 코드, 아키텍처 리뷰 |
|
|
57
|
+
| `sonnet-4.5` | 빠른 리뷰 | 간단한 변경사항 |
|
|
58
|
+
|
|
59
|
+
## 리뷰 프로세스
|
|
60
|
+
|
|
61
|
+
1. **태스크 완료**
|
|
62
|
+
- 코드 구현 완료
|
|
63
|
+
- 커밋 생성
|
|
64
|
+
|
|
65
|
+
2. **자동 리뷰 시작**
|
|
66
|
+
- 리뷰 모델로 에이전트 실행
|
|
67
|
+
- Acceptance Criteria 확인
|
|
68
|
+
- 빌드 및 타입 검증
|
|
69
|
+
|
|
70
|
+
3. **리뷰 결과**
|
|
71
|
+
- `approved`: 다음 태스크로 진행
|
|
72
|
+
- `needs_changes`: 피드백 전달 → 재작업
|
|
73
|
+
|
|
74
|
+
4. **피드백 루프**
|
|
75
|
+
- 수정 사항 구현
|
|
76
|
+
- 재리뷰
|
|
77
|
+
- 최대 반복 횟수까지 반복
|
|
78
|
+
|
|
79
|
+
## 리뷰 결과 형식
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"status": "approved",
|
|
84
|
+
"buildSuccess": true,
|
|
85
|
+
"typeCheckSuccess": true,
|
|
86
|
+
"issues": [
|
|
87
|
+
{
|
|
88
|
+
"severity": "warning",
|
|
89
|
+
"description": "Consider adding error handling",
|
|
90
|
+
"file": "src/utils/api.js",
|
|
91
|
+
"line": 42,
|
|
92
|
+
"suggestion": "Add try-catch block"
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"suggestions": [
|
|
96
|
+
"Add unit tests for edge cases",
|
|
97
|
+
"Improve error messages"
|
|
98
|
+
],
|
|
99
|
+
"summary": "Code quality is good, minor improvements suggested",
|
|
100
|
+
"reviewedBy": "sonnet-4.5-thinking",
|
|
101
|
+
"reviewedAt": "2025-12-19T18:30:00Z"
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 예제
|
|
106
|
+
|
|
107
|
+
### 기본 리뷰 설정
|
|
108
|
+
```javascript
|
|
109
|
+
// cursorflow.config.js
|
|
110
|
+
{
|
|
111
|
+
enableReview: true,
|
|
112
|
+
reviewModel: 'sonnet-4.5-thinking',
|
|
113
|
+
maxReviewIterations: 3
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 엄격한 리뷰
|
|
118
|
+
```javascript
|
|
119
|
+
{
|
|
120
|
+
enableReview: true,
|
|
121
|
+
reviewModel: 'opus-4.5-thinking',
|
|
122
|
+
maxReviewIterations: 5
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 빠른 리뷰
|
|
127
|
+
```javascript
|
|
128
|
+
{
|
|
129
|
+
enableReview: true,
|
|
130
|
+
reviewModel: 'sonnet-4.5',
|
|
131
|
+
maxReviewIterations: 1
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Acceptance Criteria 작성 가이드
|
|
136
|
+
|
|
137
|
+
### 좋은 예시
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"acceptanceCriteria": [
|
|
141
|
+
"빌드 에러 없음 (pnpm build 성공)",
|
|
142
|
+
"TypeScript 타입 에러 없음 (pnpm type-check)",
|
|
143
|
+
"모든 기존 테스트 통과",
|
|
144
|
+
"새 API 엔드포인트 3개 구현됨",
|
|
145
|
+
"에러 처리 로직 포함됨",
|
|
146
|
+
"로그 추가됨"
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 나쁜 예시
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"acceptanceCriteria": [
|
|
155
|
+
"잘 작동함",
|
|
156
|
+
"코드가 좋음"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## 리뷰 결과 분석
|
|
162
|
+
|
|
163
|
+
### 승인된 경우
|
|
164
|
+
```bash
|
|
165
|
+
# 다음 태스크 자동 진행
|
|
166
|
+
# 로그에서 확인
|
|
167
|
+
cursorflow monitor
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 수정 필요 시
|
|
171
|
+
```bash
|
|
172
|
+
# 피드백이 자동으로 에이전트에 전달됨
|
|
173
|
+
# 재작업 후 자동 재리뷰
|
|
174
|
+
# 로그에서 피드백 확인
|
|
175
|
+
cat _cursorflow/logs/runs/<lane>/conversation.jsonl | \
|
|
176
|
+
jq 'select(.role=="reviewer")'
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 최대 반복 도달 시
|
|
180
|
+
```bash
|
|
181
|
+
# 경고 메시지와 함께 진행
|
|
182
|
+
# 수동 리뷰 필요
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Checklist
|
|
186
|
+
- [ ] 리뷰가 활성화되었는가?
|
|
187
|
+
- [ ] 리뷰 모델이 적절한가?
|
|
188
|
+
- [ ] Acceptance Criteria가 명확한가?
|
|
189
|
+
- [ ] 최대 반복 횟수가 적절한가?
|
|
190
|
+
- [ ] 리뷰 결과를 확인했는가?
|
|
191
|
+
|
|
192
|
+
## 트러블슈팅
|
|
193
|
+
|
|
194
|
+
### 리뷰가 실행되지 않음
|
|
195
|
+
1. `enableReview: true` 확인
|
|
196
|
+
2. 리뷰 모델이 유효한지 확인
|
|
197
|
+
3. 로그에서 에러 확인
|
|
198
|
+
|
|
199
|
+
### 무한 리뷰 루프
|
|
200
|
+
1. `maxReviewIterations` 설정 확인
|
|
201
|
+
2. Acceptance Criteria가 달성 가능한지 검토
|
|
202
|
+
3. 태스크 프롬프트 개선
|
|
203
|
+
|
|
204
|
+
### 리뷰가 너무 엄격함
|
|
205
|
+
1. 리뷰 모델을 더 관대한 것으로 변경
|
|
206
|
+
2. Acceptance Criteria 조정
|
|
207
|
+
3. `maxReviewIterations` 증가
|
|
208
|
+
|
|
209
|
+
## 모범 사례
|
|
210
|
+
|
|
211
|
+
1. **명확한 기준**: Acceptance Criteria를 구체적으로 작성
|
|
212
|
+
2. **적절한 모델**: 작업 복잡도에 맞는 리뷰 모델 선택
|
|
213
|
+
3. **점진적 개선**: 첫 반복에서 모든 것을 완벽하게 하려 하지 말기
|
|
214
|
+
4. **피드백 활용**: 리뷰 피드백을 다음 태스크 개선에 활용
|
|
215
|
+
|
|
216
|
+
## Next Steps
|
|
217
|
+
1. 리뷰 결과 분석
|
|
218
|
+
2. 반복되는 이슈 패턴 파악
|
|
219
|
+
3. 태스크 프롬프트 및 Criteria 개선
|
|
220
|
+
4. 리뷰 모델 조정
|