@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.
@@ -0,0 +1,6 @@
1
+ # Harness Memory — 공유 학습 기록
2
+
3
+ > Dispatcher가 관리. **모든 에이전트**는 세션 시작 시 이 파일을 읽고 학습된 규칙을 따릅니다.
4
+ > gotchas(에이전트별 실수 기록)와 달리, 이 파일은 **프로젝트 전체에 적용되는 구조적 교훈**을 담습니다.
5
+
6
+ <!-- 항목이 추가되면 아래에 기록됩니다 -->
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.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. **Skip 조건 검사**: `.harness/actions/brainstorm-spec.md` 가 이미 존재하고
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. `actions/sprint-contract.md` — BE + FE 성공 기준 전체
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. `actions/sprint-contract.md` — FE 성공 기준
57
- 4. `actions/feature-list.json` — 이번 스프린트 범위 (`layer: "frontend"` + `fe_stack: "flutter"`)
58
- 5. `actions/api-contract.json` — 기대 API 계약 (Retrofit 매핑 대조용)
59
- 6. `.harness/progress.json`
60
- 7. **Generator의 anti-patterns.md 로드** — 정적 검증 rule 소스
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. `actions/evaluation-functional.md` — Verdict: PASS 확인
51
- 4. Frontend `http://localhost:5173` 실행 확인
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. `pwd` + `.harness/progress.json` + `git log --oneline -20`
32
- 4. `.harness/actions/api-contract.json` 읽기 — **이것이 스펙**
33
- 5. `.harness/actions/feature-list.json` — `layer: "backend"` 필터
34
- 6. 통합 러너: `npm run dev`
35
- 7. Gateway 헬스체크: `curl http://localhost:3000/health`
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. `pwd` + `.harness/progress.json` + `git log --oneline -20`
32
- 4. `.harness/actions/api-contract.json` 읽기 — **Gateway가 유일한 API 인터페이스**
33
- 5. `.harness/actions/feature-list.json` — `layer: "frontend"` 필터
34
- 6. Gateway 확인: `curl -s http://localhost:3000/health`
35
- 7. Frontend 시작: `cd apps/web && npm run dev`
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. `pwd` + `.harness/progress.json` + `git log --oneline -20`
33
- 4. `.harness/actions/api-contract.json` 읽기 — **서버 API 계약이 Source of Truth**
34
- 5. `.harness/actions/feature-list.json` — `layer: "frontend"` 필터
35
- 6. `pubspec.yaml` 확인 — Flutter 버전, Riverpod/Retrofit/json_serializable 의존성 존재 확인
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
 
@@ -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/progress.json` 읽기
29
- 4. `.harness/actions/pipeline.json` 읽기 — `planner_mode`, `fe_stack` 확인
30
- 5. `.harness/actions/scan-result.json` 읽기 — `tech_stack.fe_stack` 확인 (없으면 `react` 기본)
31
- 6. **Brainstorm Spec 우선 로드** — `.harness/actions/brainstorm-spec.md` 가 존재하면
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
- 7. **FE Stack 확정** → [FE Stack 결정 가이드](references/fe-stack-detection.md)
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` 갱신 (없으면 생성)