@walwal-harness/cli 2.3.2 → 2.4.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/assets/templates/memory.md +6 -0
- package/bin/init.js +7 -0
- package/package.json +1 -1
- package/skills/brainstorming/SKILL.md +2 -1
- package/skills/dispatcher/SKILL.md +19 -1
- package/skills/evaluator-functional/SKILL.md +2 -1
- package/skills/evaluator-functional-flutter/SKILL.md +6 -5
- package/skills/evaluator-visual/SKILL.md +3 -2
- package/skills/generator-backend/SKILL.md +6 -5
- package/skills/generator-frontend/SKILL.md +6 -5
- package/skills/generator-frontend-flutter/SKILL.md +5 -4
- package/skills/planner/SKILL.md +6 -5
package/bin/init.js
CHANGED
|
@@ -141,6 +141,13 @@ function scaffoldHarness() {
|
|
|
141
141
|
copyFile(harnessMdSrc, harnessMdDest);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
// Copy memory.md (shared learnings)
|
|
145
|
+
const memorySrc = path.join(PKG_ROOT, 'assets', 'templates', 'memory.md');
|
|
146
|
+
const memoryDest = path.join(HARNESS_DIR, 'memory.md');
|
|
147
|
+
if (fs.existsSync(memorySrc) && (!fileExists(memoryDest) || isForce)) {
|
|
148
|
+
copyFile(memorySrc, memoryDest);
|
|
149
|
+
}
|
|
150
|
+
|
|
144
151
|
// Create progress.log
|
|
145
152
|
const progressLog = path.join(HARNESS_DIR, 'progress.log');
|
|
146
153
|
if (!fileExists(progressLog) || isForce) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Production harness for AI agent engineering — Planner, Generator(BE/FE), Evaluator(Func/Visual), optional Brainstormer (requirements refinement). Supports React and Flutter FE stacks.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"walwal-harness": "bin/init.js"
|
|
@@ -37,7 +37,8 @@ Planner 가 곧바로 plan.md / feature-list.json / api-contract.json 으로 변
|
|
|
37
37
|
1. `.harness/progress.json` 읽기 — `next_agent == "brainstormer"` 인지 확인
|
|
38
38
|
- 아니면 즉시 STOP + "Dispatcher 를 먼저 실행하세요" 안내
|
|
39
39
|
2. progress.json 업데이트: `current_agent` → `"brainstormer"`, `agent_status` → `"running"`, `updated_at` 갱신
|
|
40
|
-
3.
|
|
40
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
41
|
+
4. **Skip 조건 검사**: `.harness/actions/brainstorm-spec.md` 가 이미 존재하고
|
|
41
42
|
사용자가 "새로 브레인스토밍" 을 명시하지 않았다면:
|
|
42
43
|
- 사용자에게 "기존 brainstorm-spec.md 가 있습니다. 재사용(Y) / 새로 작성(N)?" 질문
|
|
43
44
|
- Y → 즉시 On Complete 로 이동 (interactive 단계 전부 스킵)
|
|
@@ -11,6 +11,7 @@ disable-model-invocation: false
|
|
|
11
11
|
### On Start
|
|
12
12
|
1. `.harness/progress.json` 읽기 — `next_agent`가 `"dispatcher"`인지 확인
|
|
13
13
|
2. progress.json 업데이트: `current_agent` → `"dispatcher"`, `agent_status` → `"running"`, `updated_at` 갱신
|
|
14
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
14
15
|
|
|
15
16
|
### On Complete
|
|
16
17
|
1. progress.json 업데이트:
|
|
@@ -50,7 +51,16 @@ Claude 는 기본적으로 Dispatcher 경유로 분류/라우팅해야 한다.
|
|
|
50
51
|
- **혼합** → Gotcha 먼저 기록 → Pipeline 이어서
|
|
51
52
|
- **메타/인사/Claude 자체 질문** → Dispatcher skip, 짧은 일반 응답 허용
|
|
52
53
|
|
|
53
|
-
## 2. Gotcha Flow
|
|
54
|
+
## 2. Gotcha Flow vs Memory Flow
|
|
55
|
+
|
|
56
|
+
사용자의 교정/피드백을 받으면 **먼저 분류**:
|
|
57
|
+
|
|
58
|
+
| 유형 | 저장 위치 | 예시 |
|
|
59
|
+
|------|----------|------|
|
|
60
|
+
| **에이전트별 실수** (일회성 교정) | `.harness/gotchas/[agent].md` | "API 응답에 created_at은 ISO 8601로" |
|
|
61
|
+
| **프로젝트 공유 규칙** (구조적/반복적) | `.harness/memory.md` | "Playwright 스크린샷은 단계 완료 후 항상 삭제" |
|
|
62
|
+
|
|
63
|
+
### Gotcha Flow (에이전트별 실수)
|
|
54
64
|
|
|
55
65
|
실수 지적 감지 시 → [Gotcha 상세 가이드](references/gotcha-flow.md)
|
|
56
66
|
|
|
@@ -60,6 +70,14 @@ Claude 는 기본적으로 Dispatcher 경유로 분류/라우팅해야 한다.
|
|
|
60
70
|
3. `.harness/gotchas/[agent].md`에 항목 추가 (중복 시 Occurrences 증가)
|
|
61
71
|
4. 사용자에게 기록 확인
|
|
62
72
|
|
|
73
|
+
### Memory Flow (프로젝트 공유 규칙)
|
|
74
|
+
|
|
75
|
+
구조적/반복적 교훈 감지 시:
|
|
76
|
+
1. 이것이 특정 에이전트의 일회성 실수가 아니라 **전체 에이전트가 따라야 할 규칙**인지 판단
|
|
77
|
+
2. **맞으면**: `.harness/memory.md`에 항목 추가 (ID: `[M-NNN]`, 날짜, 규칙, 적용 범위)
|
|
78
|
+
3. 관련 스킬의 SKILL.md에 구조적 변경이 필요하면 → 사용자에게 "이건 스킬 자체에 반영해야 합니다" 안내 (Dispatcher가 직접 SKILL.md를 수정하지는 않음)
|
|
79
|
+
4. 사용자에게 기록 확인
|
|
80
|
+
|
|
63
81
|
## 3. Initialization Check (Phase 0)
|
|
64
82
|
|
|
65
83
|
파이프라인 선택 전 초기화 상태 확인:
|
|
@@ -54,7 +54,8 @@ disable-model-invocation: true
|
|
|
54
54
|
|
|
55
55
|
1. `AGENTS.md` 읽기 — IA-MAP
|
|
56
56
|
2. `.harness/gotchas/evaluator-functional.md` 읽기 — **과거 실수 반복 금지**
|
|
57
|
-
3.
|
|
57
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
58
|
+
4. `actions/sprint-contract.md` — BE + FE 성공 기준 전체
|
|
58
59
|
4. `actions/feature-list.json` — 이번 스프린트 범위
|
|
59
60
|
5. `actions/api-contract.json` — 기대 API 동작
|
|
60
61
|
6. `.harness/progress.json`
|
|
@@ -53,11 +53,12 @@ disable-model-invocation: true
|
|
|
53
53
|
|
|
54
54
|
1. `AGENTS.md` 읽기 — IA-MAP (Flutter 경로 확인)
|
|
55
55
|
2. `.harness/gotchas/evaluator-functional-flutter.md` (없으면 skip) — **과거 실수 반복 금지**
|
|
56
|
-
3.
|
|
57
|
-
4. `actions/
|
|
58
|
-
5. `actions/
|
|
59
|
-
6.
|
|
60
|
-
7.
|
|
56
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
57
|
+
4. `actions/sprint-contract.md` — FE 성공 기준
|
|
58
|
+
5. `actions/feature-list.json` — 이번 스프린트 범위 (`layer: "frontend"` + `fe_stack: "flutter"`)
|
|
59
|
+
6. `actions/api-contract.json` — 기대 API 계약 (Retrofit 매핑 대조용)
|
|
60
|
+
7. `.harness/progress.json`
|
|
61
|
+
8. **Generator의 anti-patterns.md 로드** — 정적 검증 rule 소스
|
|
61
62
|
→ `skills/generator-frontend-flutter/references/anti-patterns.md`
|
|
62
63
|
|
|
63
64
|
## Evaluation Steps
|
|
@@ -47,8 +47,9 @@ disable-model-invocation: true
|
|
|
47
47
|
|
|
48
48
|
1. `AGENTS.md` 읽기
|
|
49
49
|
2. `.harness/gotchas/evaluator-visual.md` 읽기 — **과거 실수 반복 금지**
|
|
50
|
-
3.
|
|
51
|
-
4.
|
|
50
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
51
|
+
4. `actions/evaluation-functional.md` — Verdict: PASS 확인
|
|
52
|
+
5. Frontend `http://localhost:5173` 실행 확인
|
|
52
53
|
|
|
53
54
|
## Evaluation Steps
|
|
54
55
|
|
|
@@ -28,11 +28,12 @@ disable-model-invocation: true
|
|
|
28
28
|
|
|
29
29
|
1. `AGENTS.md` 읽기 — IA-MAP, 권한 확인
|
|
30
30
|
2. `.harness/gotchas/generator-backend.md` 읽기 — **과거 실수 반복 금지**
|
|
31
|
-
3.
|
|
32
|
-
4. `.harness/
|
|
33
|
-
5. `.harness/actions/
|
|
34
|
-
6.
|
|
35
|
-
7.
|
|
31
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
32
|
+
4. `pwd` + `.harness/progress.json` + `git log --oneline -20`
|
|
33
|
+
5. `.harness/actions/api-contract.json` 읽기 — **이것이 스펙**
|
|
34
|
+
6. `.harness/actions/feature-list.json` — `layer: "backend"` 필터
|
|
35
|
+
7. 통합 러너: `npm run dev`
|
|
36
|
+
8. Gateway 헬스체크: `curl http://localhost:3000/health`
|
|
36
37
|
|
|
37
38
|
## AGENTS.md — 읽기 전용
|
|
38
39
|
|
|
@@ -28,11 +28,12 @@ disable-model-invocation: true
|
|
|
28
28
|
|
|
29
29
|
1. `AGENTS.md` 읽기 — IA-MAP, 권한 확인
|
|
30
30
|
2. `.harness/gotchas/generator-frontend.md` 읽기 — **과거 실수 반복 금지**
|
|
31
|
-
3.
|
|
32
|
-
4. `.harness/
|
|
33
|
-
5. `.harness/actions/
|
|
34
|
-
6.
|
|
35
|
-
7.
|
|
31
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
32
|
+
4. `pwd` + `.harness/progress.json` + `git log --oneline -20`
|
|
33
|
+
5. `.harness/actions/api-contract.json` 읽기 — **Gateway가 유일한 API 인터페이스**
|
|
34
|
+
6. `.harness/actions/feature-list.json` — `layer: "frontend"` 필터
|
|
35
|
+
7. Gateway 확인: `curl -s http://localhost:3000/health`
|
|
36
|
+
8. Frontend 시작: `cd apps/web && npm run dev`
|
|
36
37
|
|
|
37
38
|
## AGENTS.md — 읽기 전용
|
|
38
39
|
|
|
@@ -29,10 +29,11 @@ disable-model-invocation: true
|
|
|
29
29
|
|
|
30
30
|
1. `AGENTS.md` 읽기 — IA-MAP, 권한 확인 (Flutter 소유 경로)
|
|
31
31
|
2. `.harness/gotchas/generator-frontend-flutter.md` 읽기 (없으면 skip) — **과거 실수 반복 금지**
|
|
32
|
-
3.
|
|
33
|
-
4. `.harness/
|
|
34
|
-
5. `.harness/actions/
|
|
35
|
-
6.
|
|
32
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
33
|
+
4. `pwd` + `.harness/progress.json` + `git log --oneline -20`
|
|
34
|
+
5. `.harness/actions/api-contract.json` 읽기 — **서버 API 계약이 Source of Truth**
|
|
35
|
+
6. `.harness/actions/feature-list.json` — `layer: "frontend"` 필터
|
|
36
|
+
7. `pubspec.yaml` 확인 — Flutter 버전, Riverpod/Retrofit/json_serializable 의존성 존재 확인
|
|
36
37
|
|
|
37
38
|
## AGENTS.md — 읽기 전용
|
|
38
39
|
|
package/skills/planner/SKILL.md
CHANGED
|
@@ -25,16 +25,17 @@ disable-model-invocation: true
|
|
|
25
25
|
|
|
26
26
|
1. `AGENTS.md` 읽기
|
|
27
27
|
2. `.harness/gotchas/planner.md` 읽기 — **과거 실수 반복 금지**
|
|
28
|
-
3. `.harness/
|
|
29
|
-
4. `.harness/
|
|
30
|
-
5. `.harness/actions/
|
|
31
|
-
6.
|
|
28
|
+
3. `.harness/memory.md` 읽기 — **프로젝트 공유 학습 규칙 적용**
|
|
29
|
+
4. `.harness/progress.json` 읽기
|
|
30
|
+
5. `.harness/actions/pipeline.json` 읽기 — `planner_mode`, `fe_stack` 확인
|
|
31
|
+
6. `.harness/actions/scan-result.json` 읽기 — `tech_stack.fe_stack` 확인 (없으면 `react` 기본)
|
|
32
|
+
7. **Brainstorm Spec 우선 로드** — `.harness/actions/brainstorm-spec.md` 가 존재하면
|
|
32
33
|
**이 파일이 PRD 대체 입력**. Brainstormer 가 이미 사용자와 대화하여 확정한
|
|
33
34
|
결과이므로 **승인된 결정을 뒤엎지 않는다**. 없으면 사용자의 원본 요청 텍스트를 입력으로 사용.
|
|
34
35
|
- brainstorm-spec.md 에 `## Open Questions` 섹션이 있으면 Planner 가 해소 (API 계약으로 확정)
|
|
35
36
|
- brainstorm-spec.md 의 `## 7. 주요 컴포넌트 / 엔티티` → `feature-list.json` 초기 feature 목록 시드
|
|
36
37
|
- brainstorm-spec.md 의 `## 5. 선택된 접근법` / `## 6. 아키텍처 스케치` → MSA 서비스 분할 베이스
|
|
37
|
-
|
|
38
|
+
8. **FE Stack 확정** → [FE Stack 결정 가이드](references/fe-stack-detection.md)
|
|
38
39
|
- `pubspec.yaml` + `flutter:` 키 → `fe_stack = "flutter"`
|
|
39
40
|
- 혼재/불명확 → 사용자에게 단 한 번 질문
|
|
40
41
|
- 확정 후 `pipeline.json.fe_stack` 갱신 (없으면 생성)
|