aiag-cli 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -37
- package/dist/cli.js +30 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto.js +45 -41
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/feature.d.ts +11 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +153 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -78
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prd.d.ts +12 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +179 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/prompts/coding.d.ts.map +1 -1
- package/dist/prompts/coding.js +12 -0
- package/dist/prompts/coding.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/initializer.d.ts.map +1 -1
- package/dist/prompts/initializer.js +6 -0
- package/dist/prompts/initializer.js.map +1 -1
- package/dist/prompts/prd.d.ts +28 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +105 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/skills/index.d.ts +12 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +12 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/installer.d.ts +38 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +153 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/loader.d.ts +34 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +134 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/runner.d.ts +14 -0
- package/dist/skills/runner.d.ts.map +1 -0
- package/dist/skills/runner.js +238 -0
- package/dist/skills/runner.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prd.d.ts +21 -0
- package/dist/utils/prd.d.ts.map +1 -1
- package/dist/utils/prd.js +69 -0
- package/dist/utils/prd.js.map +1 -1
- package/dist/utils/taskmasterConverter.d.ts +72 -0
- package/dist/utils/taskmasterConverter.d.ts.map +1 -0
- package/dist/utils/taskmasterConverter.js +401 -0
- package/dist/utils/taskmasterConverter.js.map +1 -0
- package/dist/utils/taskmasterParser.d.ts +35 -0
- package/dist/utils/taskmasterParser.d.ts.map +1 -0
- package/dist/utils/taskmasterParser.js +259 -0
- package/dist/utils/taskmasterParser.js.map +1 -0
- package/package.json +1 -1
- package/templates/skills/prd-taskmaster/.taskmaster/docs/prd.md +2571 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/execution-state.py +87 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/learn-accuracy.py +113 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/rollback.sh +71 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/security-audit.py +130 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/track-time.py +133 -0
- package/templates/skills/prd-taskmaster/LICENSE +21 -0
- package/templates/skills/prd-taskmaster/README.md +608 -0
- package/templates/skills/prd-taskmaster/SKILL.md +1258 -0
- package/templates/skills/prd-taskmaster/reference/taskmaster-integration-guide.md +645 -0
- package/templates/skills/prd-taskmaster/reference/validation-checklist.md +394 -0
- package/templates/skills/prd-taskmaster/scripts/setup-taskmaster.sh +112 -0
- package/templates/skills/prd-taskmaster/templates/CLAUDE.md.template +635 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-comprehensive.md +983 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-minimal.md +103 -0
package/README.md
CHANGED
|
@@ -11,12 +11,13 @@ AI 에이전트 하네스 CLI - Claude Agent SDK 기반 장기 실행 에이전
|
|
|
11
11
|
|
|
12
12
|
### 주요 기능
|
|
13
13
|
|
|
14
|
-
- **Claude Agent SDK 기반** (v2.0.0): 안정적인 SDK 직접 호출 방식
|
|
14
|
+
- **Claude Agent SDK 기반** (v2.0.0+): 안정적인 SDK 직접 호출 방식
|
|
15
|
+
- **prd-taskmaster 통합** (v2.3.0): PRD 생성 스킬 내장 및 자동 설치
|
|
15
16
|
- **상태 외부화**: AI 메모리가 아닌 파일에 진행 상황 추적
|
|
16
17
|
- **자동 구현 모드**: `aiag auto`로 다중 기능 자동 구현
|
|
17
18
|
- **점진적 진행**: 테스트와 함께 한 번에 하나의 기능
|
|
18
19
|
- **세션 관리**: 명확한 시작/종료 시퀀스
|
|
19
|
-
- **PRD
|
|
20
|
+
- **PRD → Feature 파이프라인**: `aiag prd` → `aiag feature` → `aiag auto`
|
|
20
21
|
- **aiag-adp 통합**: 웹 플랫폼과 양방향 동기화
|
|
21
22
|
|
|
22
23
|
## 설치
|
|
@@ -42,33 +43,34 @@ claude login
|
|
|
42
43
|
|
|
43
44
|
## 빠른 시작
|
|
44
45
|
|
|
45
|
-
### 1.
|
|
46
|
+
### 1. 프로젝트 초기화 및 PRD 생성
|
|
46
47
|
|
|
47
48
|
```bash
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
# 프로젝트 디렉토리 생성
|
|
50
|
+
mkdir my-project && cd my-project
|
|
51
|
+
git init
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
# AIAG 초기화 (prd-taskmaster 스킬 자동 설치)
|
|
54
|
+
aiag init
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- 기능 2
|
|
58
|
-
- 기능 3
|
|
56
|
+
# PRD 생성 (대화형 - 12+ 질문 답변)
|
|
57
|
+
aiag prd
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
# 또는 기존 요구사항 문서에서 PRD 변환
|
|
60
|
+
aiag prd --from requirements.md
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2. Feature 목록 생성
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
```bash
|
|
66
|
+
# PRD에서 feature_list.json 생성
|
|
67
|
+
aiag feature
|
|
66
68
|
|
|
67
69
|
# 상태 확인
|
|
68
70
|
aiag status
|
|
69
71
|
```
|
|
70
72
|
|
|
71
|
-
###
|
|
73
|
+
### 3. 자동 구현 모드 실행
|
|
72
74
|
|
|
73
75
|
```bash
|
|
74
76
|
# 기본 5개 기능 자동 구현
|
|
@@ -84,7 +86,7 @@ aiag auto --verbose
|
|
|
84
86
|
aiag auto --timeout 10
|
|
85
87
|
```
|
|
86
88
|
|
|
87
|
-
###
|
|
89
|
+
### 4. 결과 확인
|
|
88
90
|
|
|
89
91
|
```bash
|
|
90
92
|
# 진행 상황 확인
|
|
@@ -98,16 +100,19 @@ open index.html
|
|
|
98
100
|
|
|
99
101
|
### 핵심 명령어
|
|
100
102
|
|
|
101
|
-
| 명령어 | 설명
|
|
102
|
-
| -------------------- |
|
|
103
|
-
| `aiag init` | 현재 디렉토리에 AIAG 초기화
|
|
104
|
-
| `aiag
|
|
105
|
-
| `aiag
|
|
106
|
-
| `aiag
|
|
107
|
-
| `aiag
|
|
108
|
-
| `aiag
|
|
109
|
-
| `aiag
|
|
110
|
-
| `aiag
|
|
103
|
+
| 명령어 | 설명 |
|
|
104
|
+
| -------------------- | ------------------------------------- |
|
|
105
|
+
| `aiag init` | 현재 디렉토리에 AIAG 초기화 |
|
|
106
|
+
| `aiag prd` | PRD 생성 (prd-taskmaster 스킬 사용) |
|
|
107
|
+
| `aiag feature` | PRD에서 feature_list.json 생성 |
|
|
108
|
+
| `aiag status` | 프로젝트 진행 상황 표시 |
|
|
109
|
+
| `aiag next` | 다음 기능 추천 받기 |
|
|
110
|
+
| `aiag work [id]` | 단일 기능 작업 시작 |
|
|
111
|
+
| `aiag auto [count]` | 자동 연속 구현 모드 |
|
|
112
|
+
| `aiag test [id]` | 기능 테스트 실행 |
|
|
113
|
+
| `aiag complete <id>` | 기능을 완료로 표시 |
|
|
114
|
+
| `aiag commit` | 자동 메시지로 변경사항 커밋 |
|
|
115
|
+
| `aiag validate` | Feature 목록 구조 검증 |
|
|
111
116
|
|
|
112
117
|
### 세션 명령어
|
|
113
118
|
|
|
@@ -132,8 +137,36 @@ aiag init [options]
|
|
|
132
137
|
|
|
133
138
|
옵션:
|
|
134
139
|
-f, --force 기존 프로젝트 재초기화
|
|
135
|
-
--
|
|
136
|
-
--
|
|
140
|
+
--minimal 최소 구조만 생성
|
|
141
|
+
--skip-skills 스킬 설치 생략
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### prd 옵션
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
aiag prd [options]
|
|
148
|
+
|
|
149
|
+
옵션:
|
|
150
|
+
--from <path> 기존 요구사항 문서를 Taskmaster PRD로 변환
|
|
151
|
+
-o, --output <path> PRD 출력 경로 (기본: .taskmaster/docs/prd.md)
|
|
152
|
+
-t, --template 템플릿: minimal | comprehensive (기본: comprehensive)
|
|
153
|
+
--skip-validation 13개 품질 검증 생략
|
|
154
|
+
--dry-run 시뮬레이션 모드
|
|
155
|
+
-v, --verbose 상세 로그 출력
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### feature 옵션
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
aiag feature [options]
|
|
162
|
+
|
|
163
|
+
옵션:
|
|
164
|
+
--from <path> PRD 파일 경로 지정
|
|
165
|
+
--format <type> PRD 포맷 강제 지정: taskmaster | generic
|
|
166
|
+
-o, --output <path> 출력 경로
|
|
167
|
+
--validate 생성 후 검증 실행
|
|
168
|
+
--dry-run 시뮬레이션 모드
|
|
169
|
+
-v, --verbose 상세 로그 출력
|
|
137
170
|
```
|
|
138
171
|
|
|
139
172
|
### auto 옵션
|
|
@@ -220,6 +253,14 @@ Anthropic의 Long-Running Agent 아키텍처 기반:
|
|
|
220
253
|
|
|
221
254
|
## 변경 이력
|
|
222
255
|
|
|
256
|
+
### v2.3.0 (2024-12-25)
|
|
257
|
+
|
|
258
|
+
- **신규 명령어**: `aiag prd` - PRD 생성 (prd-taskmaster 스킬 통합)
|
|
259
|
+
- **신규 명령어**: `aiag feature` - PRD에서 feature_list.json 생성
|
|
260
|
+
- **prd-taskmaster 스킬 번들링**: `aiag init` 시 자동 설치
|
|
261
|
+
- **PRD 변환 기능**: `aiag prd --from <path>` 옵션 추가
|
|
262
|
+
- **Breaking Change**: `aiag init --from-prd` 옵션 제거 (→ `aiag feature` 사용)
|
|
263
|
+
|
|
223
264
|
### v2.0.0 (2024-12-22)
|
|
224
265
|
|
|
225
266
|
- **Breaking Change**: Claude Agent SDK로 완전 전환
|
|
@@ -234,12 +275,6 @@ Anthropic의 Long-Running Agent 아키텍처 기반:
|
|
|
234
275
|
- `login`, `logout`, `connect`, `sync` 명령어 추가
|
|
235
276
|
- SSE 실시간 스트리밍 지원
|
|
236
277
|
|
|
237
|
-
### v1.8.0
|
|
238
|
-
|
|
239
|
-
- `aiag auto` 자동 구현 모드 추가
|
|
240
|
-
- Claude Code 자동 실행
|
|
241
|
-
- 자동 재시도 및 실패 분석
|
|
242
|
-
|
|
243
278
|
[전체 변경 이력](CHANGELOG.md)
|
|
244
279
|
|
|
245
280
|
## Author
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { createRequire } from 'module';
|
|
4
4
|
import { init } from './commands/init.js';
|
|
5
|
+
import { prd } from './commands/prd.js';
|
|
6
|
+
import { feature } from './commands/feature.js';
|
|
5
7
|
import { status } from './commands/status.js';
|
|
6
8
|
import { next } from './commands/next.js';
|
|
7
9
|
import { test } from './commands/test.js';
|
|
@@ -25,11 +27,37 @@ program
|
|
|
25
27
|
.command('init')
|
|
26
28
|
.description('Initialize a new AIAG project')
|
|
27
29
|
.option('-f, --force', 'Force reinitialize')
|
|
28
|
-
.option('--
|
|
29
|
-
.option('--
|
|
30
|
+
.option('--minimal', 'Minimal structure only')
|
|
31
|
+
.option('--skip-skills', 'Skip skill installation')
|
|
30
32
|
.action(async (options) => {
|
|
31
33
|
await init(options);
|
|
32
34
|
});
|
|
35
|
+
// aiag prd - PRD 생성
|
|
36
|
+
program
|
|
37
|
+
.command('prd')
|
|
38
|
+
.description('Generate PRD using prd-taskmaster skill (interactive or from existing doc)')
|
|
39
|
+
.option('--from <path>', 'Convert existing requirements doc or PRD draft to taskmaster format')
|
|
40
|
+
.option('-o, --output <path>', 'PRD output path', '.taskmaster/docs/prd.md')
|
|
41
|
+
.option('-t, --template <name>', 'Template: minimal | comprehensive', 'comprehensive')
|
|
42
|
+
.option('--skip-validation', 'Skip 13 quality validations')
|
|
43
|
+
.option('--dry-run', 'Simulation mode')
|
|
44
|
+
.option('-v, --verbose', 'Verbose output')
|
|
45
|
+
.action(async (options) => {
|
|
46
|
+
await prd(options);
|
|
47
|
+
});
|
|
48
|
+
// aiag feature - Feature 목록 생성
|
|
49
|
+
program
|
|
50
|
+
.command('feature')
|
|
51
|
+
.description('Generate feature_list.json from PRD')
|
|
52
|
+
.option('--from <path>', 'PRD file path')
|
|
53
|
+
.option('--format <type>', 'Force PRD format: taskmaster | generic')
|
|
54
|
+
.option('-o, --output <path>', 'Output path')
|
|
55
|
+
.option('--validate', 'Validate after generation')
|
|
56
|
+
.option('--dry-run', 'Simulation mode')
|
|
57
|
+
.option('-v, --verbose', 'Verbose output')
|
|
58
|
+
.action(async (options) => {
|
|
59
|
+
await feature(options);
|
|
60
|
+
});
|
|
33
61
|
// aiag status
|
|
34
62
|
program
|
|
35
63
|
.command('status')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhG,YAAY;AACZ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC3C,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/auto.js
CHANGED
|
@@ -213,11 +213,11 @@ export async function auto(count = '5', options = {}) {
|
|
|
213
213
|
attemptNumber: interruptedWork.attemptNumber,
|
|
214
214
|
previousError: interruptedWork.previousError,
|
|
215
215
|
};
|
|
216
|
-
verboseLog(
|
|
216
|
+
verboseLog(`중단된 기능 자동 재시도: ${feature.id} (시도 ${interruptedWork.attemptNumber}/${maxAttempts})`);
|
|
217
217
|
}
|
|
218
218
|
else {
|
|
219
219
|
// 최대 시도 횟수 초과 - 영구 실패 처리
|
|
220
|
-
verboseLog(
|
|
220
|
+
verboseLog(`기능 ${interruptedWork.feature.id}가 최대 시도 횟수(${maxAttempts})를 초과하여 다음으로 이동`);
|
|
221
221
|
appendToProgress(baseDir, `- [!] ${interruptedWork.feature.id}: Permanently failed after ${maxAttempts} attempts\n`);
|
|
222
222
|
clearSessionContextUtil(baseDir); // 컨텍스트 정리하고 다음 feature로
|
|
223
223
|
feature = selectNextFeature(currentFeatureList, options, processedInDryRun);
|
|
@@ -229,7 +229,7 @@ export async function auto(count = '5', options = {}) {
|
|
|
229
229
|
feature = selectNextFeature(currentFeatureList, options, processedInDryRun);
|
|
230
230
|
featureContext = { attemptNumber: 1 };
|
|
231
231
|
if (feature) {
|
|
232
|
-
verboseLog(
|
|
232
|
+
verboseLog(`다음 기능 선택됨: ${feature.id}`);
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
if (!feature) {
|
|
@@ -277,25 +277,25 @@ export async function auto(count = '5', options = {}) {
|
|
|
277
277
|
category: feature.category,
|
|
278
278
|
});
|
|
279
279
|
// 2. Build enhanced prompt context
|
|
280
|
-
verboseLog(
|
|
280
|
+
verboseLog(`${feature.id}에 대한 프롬프트 컨텍스트 구축 중`);
|
|
281
281
|
const promptContext = await buildPromptContext(baseDir, feature, currentFeatureList, featureContext?.attemptNumber || 1, featureContext?.previousError);
|
|
282
282
|
// 3. Claude Code로 구현 시도 (SDK 사용)
|
|
283
283
|
console.log(` ${icons.arrow} ${colors.cyan('work')} ${feature.id}`);
|
|
284
|
-
verboseLog(
|
|
284
|
+
verboseLog(`${feature.id}에 대한 Claude SDK 시작`);
|
|
285
285
|
const implementStart = Date.now();
|
|
286
286
|
const implementResult = await runClaudeCode(baseDir, feature, promptContext, claudeTimeout, isVerbose);
|
|
287
287
|
if (!implementResult.success) {
|
|
288
|
-
verboseLog(
|
|
288
|
+
verboseLog(`구현 실패: ${implementResult.error}`);
|
|
289
289
|
throw new Error(implementResult.error || 'Implementation failed');
|
|
290
290
|
}
|
|
291
291
|
const implementDuration = Date.now() - implementStart;
|
|
292
292
|
console.log(` ${icons.success} work completed (${formatDuration(implementDuration)})`);
|
|
293
|
-
verboseLog('
|
|
293
|
+
verboseLog('구현이 성공적으로 완료됨');
|
|
294
294
|
// 서버에 progress 로그 전송
|
|
295
295
|
await sendFeatureLog(serverCtx, feature.id, 'progress', `Implementation completed in ${formatDuration(implementDuration)}`, { phase: 'implementation', duration: implementDuration });
|
|
296
296
|
// 2. Self-Verification
|
|
297
297
|
console.log(` ${icons.arrow} ${colors.cyan('verify')} ${feature.id}`);
|
|
298
|
-
verboseLog('
|
|
298
|
+
verboseLog('인수 조건의 자가 검증 실행 중');
|
|
299
299
|
const verifyStart = Date.now();
|
|
300
300
|
const verificationResult = await runSelfVerification(baseDir, feature, claudeTimeout, isVerbose);
|
|
301
301
|
if (!verificationResult.allPassed) {
|
|
@@ -303,12 +303,12 @@ export async function auto(count = '5', options = {}) {
|
|
|
303
303
|
.filter((r) => !r.passed)
|
|
304
304
|
.map((r) => `- ${r.criterion}: ${r.evidence}`)
|
|
305
305
|
.join('\n');
|
|
306
|
-
verboseLog(
|
|
306
|
+
verboseLog(`자가 검증 실패:\n${failedCriteria}`);
|
|
307
307
|
throw new Error(`Self-verification failed. Not all acceptance criteria are met:\n${failedCriteria}`);
|
|
308
308
|
}
|
|
309
309
|
const verifyDuration = Date.now() - verifyStart;
|
|
310
310
|
console.log(` ${icons.success} verify passed (${formatDuration(verifyDuration)})`);
|
|
311
|
-
verboseLog(
|
|
311
|
+
verboseLog(`모든 ${feature.acceptanceCriteria.length}개 조건이 검증을 통과함`);
|
|
312
312
|
// 서버에 verification 로그 전송
|
|
313
313
|
await sendFeatureLog(serverCtx, feature.id, 'progress', `Self-verification passed (${feature.acceptanceCriteria.length} criteria)`, { phase: 'verification', duration: verifyDuration });
|
|
314
314
|
// 3. 테스트 실행
|
|
@@ -373,9 +373,9 @@ export async function auto(count = '5', options = {}) {
|
|
|
373
373
|
console.log(` ${icons.error} Failed: ${errorMessage}`);
|
|
374
374
|
// Verbose: show failure analysis
|
|
375
375
|
if (isVerbose && failureAnalysis.category !== 'unknown') {
|
|
376
|
-
verboseLog(
|
|
377
|
-
verboseLog(
|
|
378
|
-
verboseLog(
|
|
376
|
+
verboseLog(`실패 카테고리: ${failureAnalysis.category}`);
|
|
377
|
+
verboseLog(`권장 수정: ${failureAnalysis.suggestion}`);
|
|
378
|
+
verboseLog(`재시도 여부: ${failureAnalysis.shouldRetry ? '예' : '아니오 (수동 수정 권장)'}`);
|
|
379
379
|
}
|
|
380
380
|
results.push({
|
|
381
381
|
featureId: feature.id,
|
|
@@ -529,7 +529,7 @@ async function runClaudeCode(baseDir, feature, context, timeout, verbose) {
|
|
|
529
529
|
}
|
|
530
530
|
};
|
|
531
531
|
// Claude Agent SDK 사용
|
|
532
|
-
verboseLog('
|
|
532
|
+
verboseLog('Claude Agent SDK 사용 중');
|
|
533
533
|
try {
|
|
534
534
|
const result = await runFeatureImplementation(feature, prompt, {
|
|
535
535
|
workingDirectory: baseDir,
|
|
@@ -552,17 +552,17 @@ async function runClaudeCode(baseDir, feature, context, timeout, verbose) {
|
|
|
552
552
|
},
|
|
553
553
|
});
|
|
554
554
|
if (result.success) {
|
|
555
|
-
verboseLog(`SDK
|
|
555
|
+
verboseLog(`SDK 실행 완료: turns=${result.numTurns}, cost=$${result.costUsd?.toFixed(4)}`);
|
|
556
556
|
return { success: true, output: result.result };
|
|
557
557
|
}
|
|
558
558
|
else {
|
|
559
|
-
verboseLog(`SDK
|
|
559
|
+
verboseLog(`SDK 실행 실패: ${result.error}`);
|
|
560
560
|
return { success: false, error: result.error, output: result.result };
|
|
561
561
|
}
|
|
562
562
|
}
|
|
563
563
|
catch (error) {
|
|
564
564
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
565
|
-
verboseLog(`SDK
|
|
565
|
+
verboseLog(`SDK 실행 오류: ${errorMessage}`);
|
|
566
566
|
return { success: false, error: errorMessage };
|
|
567
567
|
}
|
|
568
568
|
}
|
|
@@ -748,54 +748,58 @@ async function runSelfVerification(baseDir, feature, timeout, verbose) {
|
|
|
748
748
|
console.log(colors.dim(` [verbose] ${message}`));
|
|
749
749
|
}
|
|
750
750
|
};
|
|
751
|
-
verboseLog(
|
|
751
|
+
verboseLog(`${feature.id}에 대한 자가 검증 시작`);
|
|
752
752
|
const verificationPrompt = `
|
|
753
753
|
# Self-Verification for ${feature.id}
|
|
754
754
|
|
|
755
|
-
|
|
755
|
+
## 언어 규칙
|
|
756
|
+
- **모든 출력과 설명은 한국어로 작성하세요.**
|
|
757
|
+
- 코드, 명령어, 파일명은 영어로 유지하세요.
|
|
756
758
|
|
|
757
|
-
|
|
759
|
+
${feature.id} 구현이 완료되었습니다. 이제 모든 인수 조건(Acceptance Criteria)이 충족되었는지 반드시 검증해야 합니다.
|
|
760
|
+
|
|
761
|
+
## 검증할 인수 조건:
|
|
758
762
|
|
|
759
763
|
${feature.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join('\n')}
|
|
760
764
|
|
|
761
|
-
##
|
|
765
|
+
## 검증 방법:
|
|
762
766
|
|
|
763
|
-
|
|
764
|
-
1.
|
|
765
|
-
2.
|
|
766
|
-
3.
|
|
767
|
-
4.
|
|
767
|
+
각 조건에 대해 다음을 확인하세요:
|
|
768
|
+
1. 작성한 코드 검토
|
|
769
|
+
2. 파일 존재 여부 확인
|
|
770
|
+
3. 함수 시그니처 및 구현 확인
|
|
771
|
+
4. 예상 동작 확인
|
|
768
772
|
|
|
769
|
-
##
|
|
773
|
+
## 응답 형식:
|
|
770
774
|
|
|
771
|
-
|
|
775
|
+
각 조건에 대해 정확히 다음 형식으로 응답하세요:
|
|
772
776
|
|
|
773
777
|
\`\`\`
|
|
774
778
|
CRITERION 1: [PASS/FAIL]
|
|
775
|
-
Evidence: [
|
|
779
|
+
Evidence: [이 조건이 충족된 방법 또는 실패 이유에 대한 간단한 설명 (한국어)]
|
|
776
780
|
|
|
777
781
|
CRITERION 2: [PASS/FAIL]
|
|
778
|
-
Evidence: [
|
|
782
|
+
Evidence: [간단한 설명 (한국어)]
|
|
779
783
|
|
|
780
784
|
...
|
|
781
785
|
\`\`\`
|
|
782
786
|
|
|
783
|
-
|
|
787
|
+
마지막에 최종 판정을 제공하세요:
|
|
784
788
|
|
|
785
789
|
\`\`\`
|
|
786
790
|
FINAL VERDICT: [ALL PASS / FAILED]
|
|
787
791
|
\`\`\`
|
|
788
792
|
|
|
789
|
-
|
|
790
|
-
-
|
|
791
|
-
-
|
|
792
|
-
-
|
|
793
|
-
-
|
|
793
|
+
**중요:**
|
|
794
|
+
- 검증 시 정직하고 엄격하게 평가하세요
|
|
795
|
+
- 하나라도 충족되지 않으면 FAIL로 표시하세요
|
|
796
|
+
- 모든 조건이 충족된 경우에만 ALL PASS로 응답하세요
|
|
797
|
+
- 확신이 없는 조건은 FAIL로 표시하고 이유를 설명하세요
|
|
794
798
|
|
|
795
|
-
|
|
799
|
+
지금 검증을 시작하세요.
|
|
796
800
|
`;
|
|
797
801
|
// Claude Agent SDK를 사용한 검증
|
|
798
|
-
verboseLog('
|
|
802
|
+
verboseLog('SDK를 통한 검증 실행 중');
|
|
799
803
|
const result = await runAgent({
|
|
800
804
|
workingDirectory: baseDir,
|
|
801
805
|
prompt: verificationPrompt,
|
|
@@ -817,7 +821,7 @@ Start verification now.
|
|
|
817
821
|
},
|
|
818
822
|
});
|
|
819
823
|
if (!result.success) {
|
|
820
|
-
verboseLog(
|
|
824
|
+
verboseLog(`검증 실행 실패: ${result.error}`);
|
|
821
825
|
return {
|
|
822
826
|
allPassed: false,
|
|
823
827
|
results: feature.acceptanceCriteria.map((c) => ({
|
|
@@ -1221,8 +1225,8 @@ async function runInitializerSession(baseDir, timeout, verbose) {
|
|
|
1221
1225
|
console.log(colors.dim(` [verbose] ${message}`));
|
|
1222
1226
|
}
|
|
1223
1227
|
};
|
|
1224
|
-
verboseLog('
|
|
1225
|
-
verboseLog(`PRD
|
|
1228
|
+
verboseLog('SDK를 통해 Initializer Agent 실행 중');
|
|
1229
|
+
verboseLog(`PRD 발견: ${prdContent ? '예' : '아니오'}`);
|
|
1226
1230
|
// SDK의 runInitializer 함수 사용
|
|
1227
1231
|
const result = await runInitializer(prompt, {
|
|
1228
1232
|
workingDirectory: baseDir,
|