leerness 1.9.270 → 1.9.272
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 +42 -0
- package/README.md +246 -379
- package/SECURITY.md +56 -0
- package/bin/harness.js +63 -4
- package/package.json +3 -2
- package/scripts/e2e.js +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.272 — 2026-06-03 — 공개 신뢰도·투명성 강화 (GPT-5.5 외부 리뷰 반영)
|
|
4
|
+
|
|
5
|
+
**🔒 외부 평가(GPT-5.5 직접 실행/검사, 7/10)에서 지적된 공개 패키지 신뢰도·투명성 항목을 반영.**
|
|
6
|
+
|
|
7
|
+
### 배경
|
|
8
|
+
GPT-5.5 가 패키지를 직접 받아 실행·검사한 외부 리뷰: 기능은 실용적이나 (1) README 배지 버전 불일치, (2) `.claude` hook 자동 설치 명시성 부족, (3) 권한이 큰 CLI(child_process/git/외부CLI/automation)인데 표면 비공개, (4) CI 공개 부재로 e2e 신뢰도, (5) 잦은 릴리스·단일 대형 파일·e2e 5분 초과를 지적. 실행 가능한 신뢰도 항목을 이번 라운드에 반영하고 나머지는 백로그(UR-0025~0027)에 기록.
|
|
9
|
+
|
|
10
|
+
### 구현
|
|
11
|
+
1. **`leerness capabilities` (alias `security-surface`) 신규 명령** — 권한 표면 6영역(filesystem/network/childProcess/externalAgents/automationBridges/claudeHook) + risk/opt-out + ⚠ 주의 명령 7종 공개. `--json` 기계 판독. (GPT #3 반영)
|
|
12
|
+
2. **`SECURITY.md` 신규** (npm `files` 포함) — 동일 표면 + 설계원칙(0-dep/no-postinstall/백업/무동의 호출금지) + 권장 도입 방식. (GPT #3)
|
|
13
|
+
3. **`.claude` hook 투명성** — 설치 시 "무엇을/왜/끄는 법(`--no-auto-update`, 파일 경로)" 명시 안내. (GPT #2/#4)
|
|
14
|
+
4. **README 버전 배지 불일치 영구 방지** — `prepack` 에 `readme sync` 추가 → 매 publish 시 배지가 현재 버전/e2e 결과와 자동 일치. ASCII 배너 버전 숫자 제거(drift-proof). (GPT #1 근본 해결)
|
|
15
|
+
5. **GitHub Actions CI** — `.github/workflows/ci.yml` (ubuntu+windows × node 18/20/22, selftest+e2e). 공개 CI 로 e2e 배지 신뢰도. (GPT #4)
|
|
16
|
+
6. **README 보안·투명성 섹션** (한/영) + selftest 24→25 + e2e 219→220.
|
|
17
|
+
|
|
18
|
+
### 백로그 기록 (GPT 장기 항목)
|
|
19
|
+
- UR-0025: `bin/harness.js` 단일 대형 파일 모듈 분리 (점진적·비파괴).
|
|
20
|
+
- UR-0026: 릴리스 채널 (npm dist-tag latest/next 안정·실험 구분).
|
|
21
|
+
- UR-0027: `npm test` 5분 초과 → `test:fast` 서브셋 분리 + CI 전체.
|
|
22
|
+
|
|
23
|
+
### 검증
|
|
24
|
+
- **selftest 25/25 PASS** · **E2E 220/220 PASS** (회귀 0).
|
|
25
|
+
- `capabilities --json` 6영역/주의명령/원칙 + alias 확인 · 배지 자동 동기화(1.9.272 / e2e 220) 확인.
|
|
26
|
+
|
|
27
|
+
## 1.9.271 — 2026-06-02 — README 한/영 이중 사용자 친화 재작성 (가독성) + e2e 배지 카운트 정확화
|
|
28
|
+
|
|
29
|
+
**📖 README 를 한국어/영어 이중 버전으로 가독성 좋게 재작성 (사용자 명시).**
|
|
30
|
+
|
|
31
|
+
### 배경
|
|
32
|
+
기존 README 는 한국어 단일(636줄)에 변경이력 덤프가 길어 가독성이 낮고, 일부 내용이 stale(gemini 표기, 배지 버전/카운트)했음. 사용자 요청: 사용 방법을 유저 친화적으로·이해하기 쉽게·한/영 버전으로·가독성 좋게.
|
|
33
|
+
|
|
34
|
+
### 구현
|
|
35
|
+
1. **언어 스위처 + 이중 섹션** — 상단 `🇰🇷 한국어 · 🇬🇧 English` 앵커 네비 + 명시적 `<a id>` 앵커(이모지 무관 안정). 한국어 전문 → 영어 전문 미러 구조.
|
|
36
|
+
2. **가독성 재구성** — "5가지 함정 → 방어" 표, 60초 시작, 작동 방식 4단계, 핵심 명령(카테고리별), FAQ, 환경변수, 최근 변경 5건 + CHANGELOG 링크. 긴 변경이력 덤프 제거(링크 대체).
|
|
37
|
+
3. **최신화** — gemini → agy(Antigravity)/grok 표기, 1.9.269 시스템 언어 감지·1.9.270 역할 부여 반영, 배지(version 1.9.271 / e2e 219 / selftest 24 / MCP 75 / providers 6).
|
|
38
|
+
4. **`syncReadme` e2e 배지 카운트 보강** — 기존 `^total++;`만 세어 177(부정확) → `run(...)` 호출(42) 포함 = **219**(실제 결과와 정확히 일치). 1.9.40 배지 자동 동기화의 정확도 개선.
|
|
39
|
+
5. **관리 블록 보존** — `leerness:project-readme` 마커 유지, `readme sync` 로 정합화.
|
|
40
|
+
|
|
41
|
+
### 검증
|
|
42
|
+
- **E2E 219/219 PASS** (readme sync + consistency check 포함) · **selftest 24/24 PASS** (회귀 0).
|
|
43
|
+
- 배지 자동 동기화 후 e2e 배지 = 219/219 (실제 결과 일치 확인).
|
|
44
|
+
|
|
3
45
|
## 1.9.270 — 2026-06-02 — agent roles: 모델별 역할 부여 (코딩/검수/지휘/디자인/디버그/설계/분배)
|
|
4
46
|
|
|
5
47
|
**🎭 여러 AI 에이전트 활성 시 역할을 provider+model 에 매핑하고 `dispatch --role` 로 라우팅 — 사용자가 선택적으로 역할 룰 설정 (사용자 명시).**
|
package/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Leerness
|
|
2
2
|
|
|
3
3
|
> **AI 코딩 에이전트의 거짓 완료·중복·망각·충돌을 막아주는 검수·기억·협업 CLI 하네스.**
|
|
4
|
+
> **A CLI harness that stops AI coding agents from faking completion, duplicating work, forgetting context, and colliding.**
|
|
4
5
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []()
|
|
6
7
|
|
|
7
8
|
```
|
|
8
9
|
╔══════════════════════════════════════════════════════════════╗
|
|
@@ -12,525 +13,391 @@
|
|
|
12
13
|
║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
|
|
13
14
|
║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
|
|
14
15
|
║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
|
|
15
|
-
║
|
|
16
|
-
║ verify · remember · orchestrate · audit ·
|
|
17
|
-
║ 🤖 dispatch 슬래시 주입 + MCP 73 (UR-0021 2단계 · R222) ║
|
|
16
|
+
║ AI Agent Reliability Harness (버전: 상단 배지 참조) ║
|
|
17
|
+
║ verify · remember · orchestrate · audit · drift · roles ║
|
|
18
18
|
╚══════════════════════════════════════════════════════════════╝
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
+
<p align="center"><b>🇰🇷 <a href="#한국어">한국어</a> · 🇬🇧 <a href="#english">English</a></b></p>
|
|
22
|
+
|
|
21
23
|
---
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
<a id="한국어"></a>
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
# 🇰🇷 한국어
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
## 한눈에 보기
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
`leerness`는 **Claude Code · Cursor · Copilot · Codex · Antigravity · Grok** 같은 AI 코딩 에이전트와 함께 일할 때 생기는 구조적 문제를 자동으로 막아주는 CLI 도구입니다.
|
|
32
|
+
|
|
33
|
+
AI는 코드를 빠르게 쓰지만, 다음 **5가지 함정**에 반복해서 빠집니다 — leerness는 이를 모두 자동으로 감지·차단·회복합니다.
|
|
34
|
+
|
|
35
|
+
| # | 함정 | leerness의 방어 |
|
|
36
|
+
|---|------|-----------------|
|
|
37
|
+
| 1 | **거짓 완료** — "구현했습니다"인데 코드 변경/테스트가 없음 | `verify-claim --run-tests` (증거 파일 + 실제 테스트 실행) |
|
|
38
|
+
| 2 | **중복 생성** — 이미 있는 함수를 또 만듦 | `reuse-map` (워크스페이스 전체 중복 감지) |
|
|
39
|
+
| 3 | **망각** — 다음 세션에서 계획·결정을 잃음 | `handoff` (컨텍스트 자동 적재) |
|
|
40
|
+
| 4 | **충돌** — 멀티 에이전트가 같은 파일을 동시에 수정 | `agents dispatch` (경로 격리 + 역할 분배) |
|
|
41
|
+
| 5 | **도구 drift** — 시간이 지나며 도구·메타파일을 잊음 | `drift check` (자동 감지 + 회복) |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## ⏱️ 60초 시작
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 1) 설치 + 초기화 — 시스템 언어를 자동 감지해 한/영 가이드 표시 (1.9.269)
|
|
49
|
+
npx leerness@latest init .
|
|
50
|
+
|
|
51
|
+
# 2) AI 세션 시작 — 컨텍스트 자동 적재
|
|
52
|
+
npx leerness handoff .
|
|
53
|
+
|
|
54
|
+
# 3) AI 작업 끝 — "정말 했는지" 증거로 검증
|
|
55
|
+
npx leerness verify-claim T-0001 --run-tests
|
|
56
|
+
|
|
57
|
+
# 4) 세션 마감 — 다음 세션으로 자동 인계
|
|
58
|
+
npx leerness session close .
|
|
35
59
|
```
|
|
36
60
|
|
|
37
|
-
|
|
61
|
+
> 💡 `@latest`를 붙이면 npx 캐시로 옛 버전이 실행되는 함정을 피할 수 있습니다.
|
|
38
62
|
|
|
39
63
|
---
|
|
40
64
|
|
|
41
|
-
##
|
|
65
|
+
## 🧩 작동 방식
|
|
42
66
|
|
|
43
|
-
### 1. 워크스페이스에
|
|
67
|
+
### 1. 워크스페이스에 "기억 채널"을 만듭니다
|
|
44
68
|
|
|
45
69
|
```
|
|
46
70
|
.harness/
|
|
47
71
|
├── plan.md ← 무엇을 할 것인가
|
|
48
72
|
├── progress-tracker.md ← 무엇을 했는가 (증거 포함)
|
|
49
73
|
├── decisions.md ← 왜 그렇게 했는가
|
|
50
|
-
└── session-handoff.md ← 다음 세션에 무엇을
|
|
74
|
+
└── session-handoff.md ← 다음 세션에 무엇을 넘기는가
|
|
51
75
|
```
|
|
52
76
|
|
|
53
|
-
이
|
|
77
|
+
이 파일들은 **사용자 메모리로 보호**됩니다. leerness가 자동 갱신하되, 사람이나 AI가 직접 쓴 내용은 **항상 보존**되고 변경 전 `.harness/archive/`에 백업됩니다.
|
|
54
78
|
|
|
55
|
-
### 2. AI가
|
|
79
|
+
### 2. AI가 "완료"라고 할 때마다 증거로 검증
|
|
56
80
|
|
|
57
81
|
```
|
|
58
82
|
AI: "T-0042 API 호출 구현 완료했습니다"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
↓
|
|
64
|
-
✓ 검증 통과 또는 ✗ "코드에 fetch 호출 흔적 없음 (confidence 0.85)"
|
|
83
|
+
↓ leerness verify-claim T-0042 --run-tests
|
|
84
|
+
evidence 파일 확인 → 테스트 실제 실행 → 코드 매칭
|
|
85
|
+
↓
|
|
86
|
+
✓ 검증 통과 또는 ✗ "코드에 fetch 호출 흔적 없음 (신뢰도 0.85)"
|
|
65
87
|
```
|
|
66
88
|
|
|
67
|
-
### 3.
|
|
89
|
+
### 3. 여러 AI 에이전트를 역할별로 지휘 (1.9.270 신규)
|
|
68
90
|
|
|
69
|
-
|
|
70
|
-
leerness reuse-map --all-apps --strict-elements
|
|
71
|
-
→ escapeHtml in 3 projects (project-a:42, project-b:18, project-c:103)
|
|
72
|
-
→ useCart depends on AuthContext (cycle detected)
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### 4. 다중 AI 에이전트 안전 협업
|
|
91
|
+
모델마다 강점이 다릅니다. **역할을 모델에 매핑**해 적재적소로 일을 시킵니다.
|
|
76
92
|
|
|
77
93
|
```bash
|
|
78
|
-
leerness
|
|
79
|
-
leerness
|
|
80
|
-
leerness
|
|
81
|
-
leerness
|
|
94
|
+
leerness roles set 코딩 --provider codex --model gpt-5.5 # 코딩 담당
|
|
95
|
+
leerness roles set 검수자 --provider claude --model claude-opus-4-7 # 검수 담당
|
|
96
|
+
leerness roles suggest # 활성 에이전트 기반 최적 배치 + 근거 추천
|
|
97
|
+
leerness agents dispatch "이 변경 검수" --role 검수자 # 역할 → 모델 자동 라우팅
|
|
82
98
|
```
|
|
83
99
|
|
|
84
|
-
|
|
100
|
+
> 역할 7종: 지휘(commander)·검수(reviewer)·코딩(coder)·설계(architect)·디자인(designer)·디버그(debugger)·분배(dispatcher). 한국어 별칭 지원.
|
|
85
101
|
|
|
86
|
-
라운드가 길어지면
|
|
102
|
+
### 4. 라운드가 길어지면 "leerness를 안 쓰는" drift를 자동 감지
|
|
87
103
|
|
|
88
104
|
```bash
|
|
89
105
|
leerness drift check .
|
|
90
|
-
→ 🔴 critical (
|
|
91
|
-
→ 권장: leerness session close .
|
|
106
|
+
→ 🔴 critical (110/200) — session close 11일 누락
|
|
107
|
+
→ 권장: leerness session close . (1회 실행으로 🟠 attention 회복)
|
|
92
108
|
```
|
|
93
109
|
|
|
94
|
-
→ `handoff` 호출 시 inline 경고 자동, severe 시 `.harness/agent-reminders.md` 자동 생성.
|
|
95
|
-
|
|
96
110
|
---
|
|
97
111
|
|
|
98
|
-
##
|
|
112
|
+
## 📊 적용 효과 (정량)
|
|
99
113
|
|
|
100
|
-
|
|
101
|
-
# 1) 설치 + 초기화 (방향키/스페이스 인터랙티브)
|
|
102
|
-
npx leerness@latest init .
|
|
114
|
+
`leerness-bench` 28 프로젝트 124 task 측정:
|
|
103
115
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
116
|
+
| 항목 | 적용 | 미적용 |
|
|
117
|
+
|------|-----:|-------:|
|
|
118
|
+
| 다중 에이전트 효율 | 100/100 | 3/100 |
|
|
119
|
+
| 자동 검수 (verify-claim) | 98/100 | 0/100 |
|
|
120
|
+
| 재사용 인식 | 100/100 | 0/100 |
|
|
121
|
+
| 자동 BUG 감지 | 100/100 | 0/100 |
|
|
122
|
+
| 컨텍스트 유지 | 100/100 | 0/100 |
|
|
123
|
+
| **종합** | **597/600 (99%)** | **3/600 (0.5%)** |
|
|
109
124
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
```
|
|
125
|
+
- 수동 검수 **90초 → 자동 1.5초**
|
|
126
|
+
- 컨텍스트 적재 **500자** (`handoff --compact`, AI 토큰 90% 절감)
|
|
113
127
|
|
|
114
128
|
---
|
|
115
129
|
|
|
116
|
-
##
|
|
130
|
+
## 🛠️ 핵심 명령
|
|
117
131
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
| 자동 BUG 감지 | 100/100 | 0/100 | +100 |
|
|
127
|
-
| 컨텍스트 유지 | 100/100 | 0/100 | +100 |
|
|
128
|
-
| **종합** | **597/600 (99%)** | 3/600 (0.5%) | **+594** |
|
|
132
|
+
```bash
|
|
133
|
+
# 일상
|
|
134
|
+
leerness init [path] # 신규 설치 (시스템 언어 자동 감지)
|
|
135
|
+
leerness handoff [path] [--compact] # 세션 시작 컨텍스트 적재
|
|
136
|
+
leerness verify-claim T-XXX --run-tests # 거짓 완료 검증
|
|
137
|
+
leerness audit [path] [--fix] # 일관성 감사 (--fix 자동 갱신)
|
|
138
|
+
leerness session close [path] # 세션 마감 + 다음 세션 인계
|
|
139
|
+
leerness drift check [path] # leerness 미사용 drift 점수
|
|
129
140
|
|
|
130
|
-
|
|
141
|
+
# 멀티 AI 에이전트 · 역할
|
|
142
|
+
leerness setup-agents # 활성화 (claude/codex/agy/grok/copilot/ollama)
|
|
143
|
+
leerness agents list | quota # 상태 / 한도
|
|
144
|
+
leerness agents dispatch "<task>" --role coder # 역할 기반 모델 라우팅
|
|
145
|
+
leerness agents bench "<task>" # 여러 CLI 동시 호출 + 비교
|
|
146
|
+
leerness roles list | set | suggest | verify # 모델별 역할 부여
|
|
131
147
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
148
|
+
# 보안 · 인코딩
|
|
149
|
+
leerness scan secrets . # API 키/토큰 패턴 스캔
|
|
150
|
+
leerness encoding check . # BOM/UTF-16/한글 라운드트립
|
|
151
|
+
leerness gate [path] # verify+audit+scan+encoding+lazy 통합
|
|
135
152
|
|
|
136
|
-
|
|
153
|
+
# 버전
|
|
154
|
+
leerness update --check # 새 버전 감지
|
|
155
|
+
leerness update --yes # 자동 마이그레이션 + 검증
|
|
156
|
+
```
|
|
137
157
|
|
|
138
|
-
|
|
139
|
-
- **사양 불일치**: rpg-replay에서 `tick.damage` vs `tick.amount` 필드명 충돌 자동 감지 (contract verify)
|
|
140
|
-
- **보안 위험**: `contract verify`가 require()로 임의 코드 실행 → 정적 분석으로 즉시 수정 (1.9.36)
|
|
141
|
-
- **drift**: 실 워크스페이스에서 4.6일 stale 자동 감지 → session close 1회로 70점 회복 (1.9.37/38)
|
|
158
|
+
전체 명령은 `leerness commands`, MCP 도구는 `leerness mcp serve`로 확인하세요.
|
|
142
159
|
|
|
143
160
|
---
|
|
144
161
|
|
|
145
|
-
##
|
|
146
|
-
|
|
147
|
-
| AI와 일할 때 함정 | leerness 도구 | 효과 |
|
|
148
|
-
| ------------------------------------ | ------------------------------------------------------- | ----------------------------------------- |
|
|
149
|
-
| "완료했습니다"인데 코드 변경이 없음 | `verify-claim --run-tests` | 증거 파일 + 테스트 실제 실행 검증 |
|
|
150
|
-
| "API 호출 완료"인데 URL 코드 없음 | `optimism-check` | 10 카테고리 패턴 + URL 매핑 + 신뢰도 점수 |
|
|
151
|
-
| 같은 함수를 여러 프로젝트에 중복 | `reuse-map --strict-elements` | 함수명 fuzzy 중복 감지 |
|
|
152
|
-
| 다음 세션이 컨텍스트 잃음 | `handoff` 3채널 자동 적재 | 500자 압축 (`--compact`) |
|
|
153
|
-
| 표면적 코드 리뷰 (도메인 깊이 부족) | `review --persona security,performance,ux` | 도메인 sub-agent 자동 부여 |
|
|
154
|
-
| 외부 AI CLI 자동 호출 위험 | `agents list/dispatch/quota` | 환경변수 활성화 + 명시적 분배 |
|
|
155
|
-
| npx 캐시로 옛 버전 실행 | `_warnIfStale` 자동 (1.9.33+) | npm latest 자동 비교 + 경고 |
|
|
156
|
-
| 멀티 sub-agent 파일 충돌 | `agents dispatch` 안내 + 경로 격리 | last-writer-wins 위험 사전 차단 |
|
|
157
|
-
| sub-agent마다 사양 해석 다름 | **`contract verify`** | 명세 ↔ 구현 함수/필드 자동 검사 |
|
|
158
|
-
| 신규 모듈 capability 미등록 | **`reuse autodetect`** | `module.exports` 정적 분석 + 자동 등록 |
|
|
159
|
-
| 라운드 길어지며 메인이 leerness 잊음 | **`drift check`** + `agent-reminders.md` 자동 | 4 신호 + 자동 reminder + 학습 |
|
|
160
|
-
| TodoWrite ↔ progress-tracker 분리 | **`task sync --from`** (1.9.38) | TodoWrite JSON 자동 import |
|
|
162
|
+
## ❓ FAQ
|
|
161
163
|
|
|
162
|
-
|
|
164
|
+
**Q. leerness가 내 코드를 바꾸나요?**
|
|
165
|
+
A. 사용자 메모리(plan/progress/decisions)는 **항상 보존**, 모든 변경 전 자동 백업합니다. 소스 코드는 직접 수정하지 않습니다.
|
|
163
166
|
|
|
164
|
-
|
|
167
|
+
**Q. AI 에이전트 없이도 쓸 수 있나요?**
|
|
168
|
+
A. 네. 1인 개발자의 작업 검증·기억·중복 감지에도 유용합니다.
|
|
165
169
|
|
|
166
|
-
|
|
170
|
+
**Q. 외부 AI CLI를 자동으로 호출하나요?**
|
|
171
|
+
A. **절대 아니요.** `agents dispatch`는 실행 명령 텍스트만 생성합니다. 실제 실행은 사용자/메인 에이전트가 명시적으로 합니다.
|
|
167
172
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
leerness handoff [path] [--compact] # 컨텍스트 적재 (drift 자동 경고)
|
|
171
|
-
leerness verify-claim T-XXX --run-tests # 증거 + 실 테스트
|
|
172
|
-
leerness optimism-check T-XXX # 낙관적 표시 감지
|
|
173
|
-
leerness audit [path] [--fix] # 일관성 감사 (--fix: 자동 갱신)
|
|
174
|
-
leerness session close [path] # 세션 마감
|
|
175
|
-
leerness drift check [path] # drift 점수 + 4단계 레벨
|
|
176
|
-
leerness usage stats [path] # 명령별 누적 카운터
|
|
177
|
-
```
|
|
173
|
+
**Q. CI에서 쓸 수 있나요?**
|
|
174
|
+
A. 네. 모든 명령이 exit code + `--json` + `--yes` 비대화형을 지원합니다.
|
|
178
175
|
|
|
179
|
-
|
|
176
|
+
---
|
|
180
177
|
|
|
181
|
-
|
|
182
|
-
leerness handoff --all-apps # 전 프로젝트 통합 뷰
|
|
183
|
-
leerness reuse-map --all-apps --strict-elements
|
|
184
|
-
leerness reuse autodetect [--apply] # src/bin/lib/app 정적 스캔 + 등록
|
|
185
|
-
leerness contract verify <spec> <impl> # 명세 ↔ 구현 검증
|
|
186
|
-
leerness deps <capability> --run-tests # 영향 추적 + 자동 회귀
|
|
187
|
-
leerness retro --all-apps --days 7 # 회고
|
|
188
|
-
leerness insights --all-apps # 통계
|
|
189
|
-
leerness task sync --from <todo.json> # TodoWrite import
|
|
190
|
-
```
|
|
178
|
+
## 🔒 보안·투명성
|
|
191
179
|
|
|
192
|
-
|
|
180
|
+
leerness 는 권한이 큰 CLI 하네스입니다(child_process · git · 외부 CLI · 자동화 브리지 · hook 설치). **할 수 있는 전부와 끄는 법**을 공개합니다.
|
|
193
181
|
|
|
194
182
|
```bash
|
|
195
|
-
leerness
|
|
196
|
-
leerness agents list / check / quota # 상태/한도
|
|
197
|
-
leerness agents dispatch "<task>" --to gemini --write
|
|
198
|
-
leerness agents bench "<task>" # 3 CLI 동시 호출 + 비교표
|
|
183
|
+
leerness capabilities # 권한 표면 + opt-out + 주의 명령 (--json 지원)
|
|
199
184
|
```
|
|
200
185
|
|
|
201
|
-
|
|
186
|
+
- **런타임 의존성 0** · **postinstall 없음** · **변경 전 자동 백업** · **동의 없는 외부 호출 금지**
|
|
187
|
+
- `init` 시 `.claude/settings.local.json` 에 SessionStart hook(`update --check`)이 설치됩니다 → 끄기: `leerness init . --no-auto-update`
|
|
188
|
+
- 회사/운영 코드에서는 먼저 한 프로젝트에서 `init` 후 `git diff` 로 검토하고 커밋하세요.
|
|
189
|
+
- 자세히: [SECURITY.md](SECURITY.md)
|
|
202
190
|
|
|
203
|
-
|
|
204
|
-
leerness persona list / show <id> / add <id>
|
|
205
|
-
leerness review <file> --persona security,performance,ux
|
|
206
|
-
```
|
|
191
|
+
---
|
|
207
192
|
|
|
208
|
-
|
|
193
|
+
<a id="english"></a>
|
|
209
194
|
|
|
210
|
-
|
|
211
|
-
# Claude Code/Cursor/Copilot/Codex/Gemini CLI/Hermes Agent 등 30+ 도구와 스킬 공유
|
|
212
|
-
leerness skill install <url-or-path> # SKILL.md 다운로드/import
|
|
213
|
-
leerness skill discover --query "<task>" # 매칭 추천 (opt-in)
|
|
214
|
-
leerness skill export <id> [--out <dir>] # 자체 skill → 표준 SKILL.md 변환
|
|
215
|
-
leerness skill export-all [--out <dir>] # 1.9.43 9개 자체 skill 일괄 SKILL.md export
|
|
216
|
-
```
|
|
195
|
+
# 🇬🇧 English
|
|
217
196
|
|
|
218
|
-
|
|
197
|
+
## At a glance
|
|
219
198
|
|
|
220
|
-
|
|
221
|
-
leerness mcp serve # stdio JSON-RPC로 leerness 도구 10종 노출
|
|
222
|
-
```
|
|
199
|
+
`leerness` is a CLI harness that automatically prevents the structural problems that arise when working with AI coding agents like **Claude Code · Cursor · Copilot · Codex · Antigravity · Grok**.
|
|
223
200
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
```json
|
|
227
|
-
{
|
|
228
|
-
"mcpServers": {
|
|
229
|
-
"leerness": {
|
|
230
|
-
"command": "npx",
|
|
231
|
-
"args": ["leerness", "mcp", "serve"]
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
노출 도구 10종: `leerness_handoff` · `leerness_drift_check` · `leerness_audit` · `leerness_verify_claim` · `leerness_contract_verify` · `leerness_agents_list` · `leerness_reuse_map` · `leerness_whats_new` · `leerness_usage_stats` · `leerness_session_close`
|
|
201
|
+
AI writes code fast, but repeatedly falls into **5 traps** — leerness detects, blocks, and recovers from all of them.
|
|
238
202
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
203
|
+
| # | Trap | leerness defense |
|
|
204
|
+
|---|------|------------------|
|
|
205
|
+
| 1 | **Fake completion** — "done!" but no code change / no tests run | `verify-claim --run-tests` (evidence files + real test execution) |
|
|
206
|
+
| 2 | **Duplication** — rebuilding a function that already exists | `reuse-map` (workspace-wide duplicate detection) |
|
|
207
|
+
| 3 | **Amnesia** — losing plans/decisions across sessions | `handoff` (automatic context loading) |
|
|
208
|
+
| 4 | **Collisions** — multiple agents editing the same file | `agents dispatch` (path isolation + role routing) |
|
|
209
|
+
| 5 | **Tool drift** — forgetting tools/meta files over time | `drift check` (auto detection + recovery) |
|
|
244
210
|
|
|
245
|
-
|
|
211
|
+
---
|
|
246
212
|
|
|
247
|
-
|
|
213
|
+
## ⏱️ 60-second start
|
|
248
214
|
|
|
249
215
|
```bash
|
|
250
|
-
|
|
251
|
-
leerness
|
|
252
|
-
leerness lazy detect . # 증거 없는 done · 빈 handoff · 추적 없는 TODO
|
|
253
|
-
leerness gate [path] # verify + audit + scan + encoding + lazy 통합
|
|
254
|
-
```
|
|
216
|
+
# 1) Install + init — auto-detects system language for KO/EN guides (1.9.269)
|
|
217
|
+
npx leerness@latest init .
|
|
255
218
|
|
|
256
|
-
|
|
219
|
+
# 2) Start an AI session — auto-load context
|
|
220
|
+
npx leerness handoff .
|
|
257
221
|
|
|
258
|
-
|
|
259
|
-
leerness
|
|
260
|
-
|
|
222
|
+
# 3) After AI claims "done" — verify with evidence
|
|
223
|
+
npx leerness verify-claim T-0001 --run-tests
|
|
224
|
+
|
|
225
|
+
# 4) Close the session — hand off to the next one
|
|
226
|
+
npx leerness session close .
|
|
261
227
|
```
|
|
262
228
|
|
|
229
|
+
> 💡 Adding `@latest` avoids the trap of npx running a stale cached version.
|
|
230
|
+
|
|
263
231
|
---
|
|
264
232
|
|
|
265
|
-
##
|
|
233
|
+
## 🧩 How it works
|
|
266
234
|
|
|
267
|
-
###
|
|
235
|
+
### 1. Creates "memory channels" in your workspace
|
|
268
236
|
|
|
269
|
-
```bash
|
|
270
|
-
# AI에게 작업 지시 후
|
|
271
|
-
leerness verify-claim T-0042 --run-tests --strict-claims
|
|
272
|
-
# → evidence 파일 존재 + 실제 npm test 실행 + 낙관적 표시 자동 감지
|
|
273
|
-
# → 거짓이면 exit 1, 진짜면 진행
|
|
274
237
|
```
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
leerness setup-agents . # 방향키로 claude/codex/gemini 선택
|
|
281
|
-
|
|
282
|
-
# 2) 같은 task를 3 CLI에 동시 호출 → 비교
|
|
283
|
-
leerness agents bench "rpg-core/combat.js useSkill 함수 한 줄 요약"
|
|
284
|
-
# | claude | 7s | "..." | ← 가장 빠름
|
|
285
|
-
# | codex | 21s | "..." | ← 가장 상세
|
|
286
|
-
# | gemini | 19s | "..." | ← 중간
|
|
287
|
-
|
|
288
|
-
# 3) 작업 유형별 최적 CLI에 분배
|
|
289
|
-
leerness agents dispatch "파일 생성" --to gemini --write
|
|
290
|
-
# → --yolo 자동 첨부, 안전 규칙 안내
|
|
238
|
+
.harness/
|
|
239
|
+
├── plan.md ← what to do
|
|
240
|
+
├── progress-tracker.md ← what was done (with evidence)
|
|
241
|
+
├── decisions.md ← why it was done that way
|
|
242
|
+
└── session-handoff.md ← what to pass to the next session
|
|
291
243
|
```
|
|
292
244
|
|
|
293
|
-
|
|
245
|
+
These are **protected as user memory**. leerness updates them automatically, but anything a human or AI wrote is **always preserved** and backed up to `.harness/archive/` before any change.
|
|
294
246
|
|
|
295
|
-
|
|
296
|
-
# 며칠 후 새 세션 시작
|
|
297
|
-
leerness handoff .
|
|
298
|
-
# ⚠ leerness drift 감지 — 메타파일이 stale합니다
|
|
299
|
-
# session-handoff.md: 4.6일 stale
|
|
300
|
-
# → 권장: leerness session close .
|
|
301
|
-
|
|
302
|
-
# 권장 명령 1회 실행으로 회복
|
|
303
|
-
leerness session close .
|
|
304
|
-
# 🔴 critical (100/200) → 🟠 attention (30/200)
|
|
305
|
-
```
|
|
247
|
+
### 2. Verifies every "done" with evidence
|
|
306
248
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
249
|
+
```
|
|
250
|
+
AI: "Finished implementing the T-0042 API call"
|
|
251
|
+
↓ leerness verify-claim T-0042 --run-tests
|
|
252
|
+
check evidence files → actually run tests → match code
|
|
253
|
+
↓
|
|
254
|
+
✓ verified or ✗ "no trace of a fetch call in code (confidence 0.85)"
|
|
313
255
|
```
|
|
314
256
|
|
|
315
|
-
|
|
257
|
+
### 3. Directs multiple AI agents by role (new in 1.9.270)
|
|
316
258
|
|
|
317
|
-
|
|
259
|
+
Each model has different strengths. **Map roles to models** to put the right model on the right job.
|
|
318
260
|
|
|
319
|
-
```
|
|
320
|
-
.
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
├── design-system.md · consistency-policy.md · writeback-policy.md
|
|
325
|
-
├── anti-lazy-work-policy.md · secret-policy.md · encoding-policy.md
|
|
326
|
-
├── protected-files.md · guardrails.md · language-policy.md
|
|
327
|
-
├── orchestrate-log.md · llm-bench-history.md (1.9.22+)
|
|
328
|
-
├── skill-index.md · skills/<id>/ · templates/
|
|
329
|
-
├── personas/<id>.md (1.9.29+, 사용자 정의 페르소나)
|
|
330
|
-
├── reviews/ (1.9.29+, 페르소나 리뷰 결과)
|
|
331
|
-
├── cache/
|
|
332
|
-
│ ├── update-check.json (1.9.33+)
|
|
333
|
-
│ └── usage-stats.json (1.9.38+ 명령 카운터)
|
|
334
|
-
└── agent-reminders.md (1.9.38+, drift critical 시 자동 생성)
|
|
335
|
-
|
|
336
|
-
.claude/ (commands · skills · settings.local.json)
|
|
337
|
-
.cursor/rules/leerness.mdc
|
|
338
|
-
.github/copilot-instructions.md
|
|
339
|
-
AGENTS.md · CLAUDE.md
|
|
261
|
+
```bash
|
|
262
|
+
leerness roles set coder --provider codex --model gpt-5.5
|
|
263
|
+
leerness roles set reviewer --provider claude --model claude-opus-4-7
|
|
264
|
+
leerness roles suggest # recommend optimal layout from active agents + rationale
|
|
265
|
+
leerness agents dispatch "review this change" --role reviewer # role → model auto-routing
|
|
340
266
|
```
|
|
341
267
|
|
|
342
|
-
|
|
268
|
+
> 7 roles: commander · reviewer · coder · architect · designer · debugger · dispatcher.
|
|
343
269
|
|
|
344
|
-
|
|
270
|
+
### 4. Detects "drift" when you stop using leerness over long rounds
|
|
345
271
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
| `LEERNESS_NO_BANNER` | ASCII 배너 스킵 (1.9.32+) |
|
|
352
|
-
| `LEERNESS_NO_PROMPT` | readline prompt 비활성 (1.9.32+) |
|
|
353
|
-
| `LEERNESS_NO_STALE_CHECK` | npx 옛 버전 경고 끄기 (1.9.33+) |
|
|
354
|
-
| `LEERNESS_NO_INTERACTIVE` | 방향키 multi-select 비활성 (1.9.34+) |
|
|
355
|
-
| `LEERNESS_NO_DRIFT_CHECK` | drift 자동 경고 끄기 (1.9.37+) |
|
|
272
|
+
```bash
|
|
273
|
+
leerness drift check .
|
|
274
|
+
→ 🔴 critical (110/200) — session close missing for 11 days
|
|
275
|
+
→ recommended: leerness session close . (one run recovers to 🟠 attention)
|
|
276
|
+
```
|
|
356
277
|
|
|
357
278
|
---
|
|
358
279
|
|
|
359
|
-
##
|
|
360
|
-
|
|
361
|
-
설치 시 자동 등록:
|
|
362
|
-
|
|
363
|
-
- `.claude/commands/{handoff, session-close, audit, lazy-detect, update}.md`
|
|
364
|
-
- `.claude/skills/leerness.md` (스킬 정의)
|
|
365
|
-
- `.claude/settings.local.json` (SessionStart hook = `update --check`)
|
|
366
|
-
- `.cursor/rules/leerness.mdc` · `.github/copilot-instructions.md`
|
|
367
|
-
- `AGENTS.md` · `CLAUDE.md`
|
|
280
|
+
## 📊 Measured impact
|
|
368
281
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
## 자연어 트리거
|
|
282
|
+
From `leerness-bench` across 28 projects / 124 tasks:
|
|
372
283
|
|
|
373
|
-
|
|
|
374
|
-
|
|
375
|
-
|
|
|
376
|
-
|
|
|
377
|
-
|
|
|
378
|
-
|
|
|
379
|
-
|
|
|
380
|
-
|
|
|
381
|
-
| "drift 점검 / leerness를 잘 쓰고 있나?" | `leerness drift check` |
|
|
284
|
+
| Metric | With | Without |
|
|
285
|
+
|--------|-----:|--------:|
|
|
286
|
+
| Multi-agent efficiency | 100/100 | 3/100 |
|
|
287
|
+
| Auto-verification (verify-claim) | 98/100 | 0/100 |
|
|
288
|
+
| Reuse awareness | 100/100 | 0/100 |
|
|
289
|
+
| Auto bug detection | 100/100 | 0/100 |
|
|
290
|
+
| Context retention | 100/100 | 0/100 |
|
|
291
|
+
| **Total** | **597/600 (99%)** | **3/600 (0.5%)** |
|
|
382
292
|
|
|
383
|
-
|
|
293
|
+
- Manual review **90s → 1.5s automated**
|
|
294
|
+
- Context load **~500 chars** (`handoff --compact`, ~90% fewer AI tokens)
|
|
384
295
|
|
|
385
296
|
---
|
|
386
297
|
|
|
387
|
-
##
|
|
388
|
-
|
|
389
|
-
### `@latest` 명시 권장
|
|
298
|
+
## 🛠️ Core commands
|
|
390
299
|
|
|
391
300
|
```bash
|
|
392
|
-
#
|
|
393
|
-
|
|
301
|
+
# Daily
|
|
302
|
+
leerness init [path] # new install (auto-detects system language)
|
|
303
|
+
leerness handoff [path] [--compact] # load session-start context
|
|
304
|
+
leerness verify-claim T-XXX --run-tests # verify fake completion
|
|
305
|
+
leerness audit [path] [--fix] # consistency audit (--fix auto-update)
|
|
306
|
+
leerness session close [path] # close session + hand off
|
|
307
|
+
leerness drift check [path] # leerness-disuse drift score
|
|
394
308
|
|
|
395
|
-
#
|
|
396
|
-
|
|
309
|
+
# Multi AI agents · roles
|
|
310
|
+
leerness setup-agents # enable (claude/codex/agy/grok/copilot/ollama)
|
|
311
|
+
leerness agents list | quota # status / limits
|
|
312
|
+
leerness agents dispatch "<task>" --role coder # role-based model routing
|
|
313
|
+
leerness agents bench "<task>" # call several CLIs at once + compare
|
|
314
|
+
leerness roles list | set | suggest | verify # per-model role assignment
|
|
315
|
+
|
|
316
|
+
# Security · encoding
|
|
317
|
+
leerness scan secrets . # API key/token pattern scan
|
|
318
|
+
leerness encoding check . # BOM/UTF-16/CJK round-trip
|
|
319
|
+
leerness gate [path] # verify+audit+scan+encoding+lazy combined
|
|
397
320
|
|
|
398
|
-
#
|
|
399
|
-
|
|
321
|
+
# Versions
|
|
322
|
+
leerness update --check # detect new version
|
|
323
|
+
leerness update --yes # auto-migrate + verify
|
|
400
324
|
```
|
|
401
325
|
|
|
402
|
-
|
|
326
|
+
Run `leerness commands` for the full list, or `leerness mcp serve` to expose tools to a main agent.
|
|
403
327
|
|
|
404
328
|
---
|
|
405
329
|
|
|
406
|
-
## FAQ
|
|
407
|
-
|
|
408
|
-
**Q. leerness가 코드를 변경하나요?**
|
|
409
|
-
A. 사용자 메모리(plan/progress/decisions 등)는 **항상 보존**. 관리 인스트럭션은 머지 + preserved 블록 보존. 모든 변경 전 `.harness/archive/`에 자동 백업.
|
|
330
|
+
## ❓ FAQ
|
|
410
331
|
|
|
411
|
-
**Q.
|
|
412
|
-
A.
|
|
332
|
+
**Q. Does leerness change my code?**
|
|
333
|
+
A. User memory (plan/progress/decisions) is **always preserved** and backed up before any change. It never edits your source code directly.
|
|
413
334
|
|
|
414
|
-
**Q.
|
|
415
|
-
A.
|
|
335
|
+
**Q. Can I use it without an AI agent?**
|
|
336
|
+
A. Yes. Solo developers can use it for self-verification, memory, and duplicate detection.
|
|
416
337
|
|
|
417
|
-
**Q.
|
|
418
|
-
A.
|
|
338
|
+
**Q. Does it auto-call external AI CLIs?**
|
|
339
|
+
A. **Never.** `agents dispatch` only generates command text. Actual execution is explicit, by you or your main agent.
|
|
419
340
|
|
|
420
|
-
**Q.
|
|
421
|
-
A.
|
|
341
|
+
**Q. Can I use it in CI?**
|
|
342
|
+
A. Yes. Every command supports exit codes, `--json`, and non-interactive `--yes`.
|
|
422
343
|
|
|
423
344
|
---
|
|
424
345
|
|
|
425
|
-
##
|
|
346
|
+
## 🔒 Security & transparency
|
|
347
|
+
|
|
348
|
+
leerness is a powerful CLI harness (child_process, git, external CLIs, automation bridges, hook install). It discloses **everything it can do and how to turn each off**.
|
|
426
349
|
|
|
427
350
|
```bash
|
|
428
|
-
|
|
351
|
+
leerness capabilities # capability surface + opt-out + cautious commands (--json supported)
|
|
429
352
|
```
|
|
430
353
|
|
|
431
|
-
**
|
|
354
|
+
- **Zero runtime deps** · **no postinstall** · **auto-backup before changes** · **never auto-calls external services without consent**
|
|
355
|
+
- `init` installs a SessionStart hook (`update --check`) in `.claude/settings.local.json` → disable with `leerness init . --no-auto-update`
|
|
356
|
+
- For company/production code, trial `init` in one project, review with `git diff`, then commit.
|
|
357
|
+
- Details: [SECURITY.md](SECURITY.md)
|
|
432
358
|
|
|
433
359
|
---
|
|
434
360
|
|
|
435
|
-
##
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
- **1.9.92** — **`skill info --json` + MCP 20번째 도구 `leerness_skill_info`** — 외부 AI가 개별 skill 상세 (능력/소스/패턴/사용 이력) 정확 파악.
|
|
445
|
-
- **1.9.91** — **MCP server 19번째 도구 `leerness_skill_search`** — 1.9.90 skill search를 외부 AI에 노출.
|
|
446
|
-
- **1.9.90** — **`leerness skill search <capability>` 새 명령** — capability 배열 부분 일치 검색 (skill match와 다른 정확 매칭). `--json` 옵션.
|
|
447
|
-
- **1.9.89** — **자율 모드 19 라운드 종합 검증** — stress-v35 24/24 PASS + handoff 692ms / health 689ms (회귀 없음). 자율 모드 (1.9.70~88) 안정 완료.
|
|
448
|
-
- **1.9.88** — **`handoff`에 brainstorm 자동 hits 노출** — 현재 task 키워드로 자동 호출 → decisions / lessons / task-log fail / skill 미리보기 1줄씩 (1.9.72 brainstorm 통합).
|
|
449
|
-
- **1.9.87** — **`session-workflow.md` 템플릿 갱신** — 1.9.69~86 누적 신규 기능 안내 추가 (handoff history hit / 보안 요약 / CRITICAL / 헤드라인 / health / drift --auto-fix 보안 / MCP 18 도구). init 가이드 정확성 보장.
|
|
450
|
-
- **1.9.86** — **MCP server 18번째 도구 `leerness_health`** — 1.9.85 health 종합 헬스 체크를 외부 AI에 노출. drift + 보안 + skill + MCP + tasks 한 호출.
|
|
451
|
-
- **1.9.85** — **`leerness health` 새 명령** — drift + 보안 + skill + MCP + 누적 통계 종합 헬스 체크. `--json` / `--strict` 옵션.
|
|
452
|
-
- **1.9.84** — **MCP server 17번째 도구 `leerness_skill_list`** — 외부 AI에 skill 카탈로그 (id/이름/출처/능력/사용 횟수) 조회 노출. `skill list --json` 옵션도 함께 추가.
|
|
453
|
-
- **1.9.83** — **MCP server 16번째 도구 `leerness_skill_match`** — 1.9.45/50/68 skill match를 외부 AI에 노출. rolling history 자동 누적.
|
|
454
|
-
- **1.9.82** — **`drift check --auto-fix` 보안 회복 통합** — 1.9.78 보안 신호 발견 시 `audit --fix` 자동 실행 → `.gitignore` + `.env.example` 동기화 후 재검사. 보안 + 세션 마감 한 번에 자동 회복.
|
|
455
|
-
- **1.9.81** — **`handoff` 통합 헤드라인** — drift level + 보안 상태 + MCP 활동 + skill query + 설치 skill 수를 한 줄로 압축. AI가 세션 시작 즉시 워크스페이스 상태 인지.
|
|
456
|
-
- **1.9.80** — **handoff 보안 critical 자동 회복** — `.env` 가 `.gitignore` 에 없으면 🚨 CRITICAL 경고 + `LEERNESS_AUTO_SECURITY_FIX=1` 시 `audit --fix` 자동 실행.
|
|
457
|
-
- **1.9.79** — **`leerness skill suggest` 알고리즘 강화** — 1.9.68 rolling history 빈도 (×2 가중) 추가. 반복 검색된 키워드를 신규 skill 후보로 자동 식별 (Hermes-style 학습).
|
|
458
|
-
- **1.9.78** — **`drift check` 5번째 신호** — `.env` + `.gitignore` 보안 누락을 drift score에 가중 (`.env` 자체 누락 시 +30, 동기화 누락 +15). 보안 위험이 drift critical 승격 가능.
|
|
459
|
-
- **1.9.77** — **MCP server 15번째 도구 `leerness_brainstorm`** — 1.9.72 brainstorm (decisions + skills + tasks + rules + evidence + lessons + skillHistory + taskLogFails)을 외부 AI에 노출. AI가 새 작업 시작 전 누적 컨텍스트 자동 회수.
|
|
460
|
-
- **1.9.76** — **`leerness handoff`에 보안 상태 요약 자동 표시** — `.env→.env.example` 누락 + `.gitignore` 시크릿 패턴 누락을 매 handoff에 1-2 line 자동 노출. AI가 세션 시작 즉시 보안 위험 인지.
|
|
461
|
-
- **1.9.75** — **`leerness audit` 보안 강화** — `.env` 존재 시 `.gitignore`에 시크릿 패턴 (`.env`/`.env.local`/`.env.production`/`*.pem`/`credentials.json`) 자동 검증, `--fix`로 자동 추가.
|
|
462
|
-
- **1.9.74** — **`session close` 마감 시 누적 회고 통계 강화** — MCP tools/call 카운트 + skill match query top + drift 통계를 자동 요약 (1.9.70 + 1.9.68 결합).
|
|
463
|
-
- **1.9.73** — **MCP server 14번째 도구 `leerness_env_check`** — 1.9.71 env 보안 검사를 외부 AI에 노출 (외부 워크스페이스 .env/.env.example 동기화 자동 점검).
|
|
464
|
-
- **1.9.72** — **`leerness brainstorm`에 skill-suggestions.md history + task-log 실패 라인 통합** — 누적 컨텍스트 기반 brainstorm 강화 (이전 매칭 이력 + task-log 실패 회수).
|
|
465
|
-
- **1.9.71** — **`.env` / `.env.example` 자동 동기화** — `leerness env check` / `env sync` 명령 + `audit` 통합 (`--fix`로 누락 키 자동 추가). 보안 정책: 실제 값 절대 노출 안 함 (키만 추가, 값은 빈 문자열).
|
|
466
|
-
- **1.9.70** — **MCP server `tools/call` 자동 사용 통계** — 도구별 호출 카운트 (`.harness/cache/usage-stats.json#mcp.tools`) + `leerness usage stats` 출력에 MCP 섹션 + 드물게 호출되는 도구 식별.
|
|
467
|
-
- **1.9.69** — **handoff에 skill-suggestions.md history hit 노출** (fuzzy 매칭, 최근 2건 + top 2 매치). AI가 이전 세션 결정을 일관 유지. mtime 기반 캐시 (1.9.65/66/67 캐시 패밀리 연속).
|
|
468
|
-
- **1.9.68** — **`skill match` 결과 → `.harness/skill-suggestions.md` rolling history 자동 누적** (AI가 다음 세션에 이전 추천 참조 가능). `--no-save` / `LEERNESS_NO_SKILL_HISTORY=1`로 끄기.
|
|
469
|
-
- **1.9.67** — **handoff 자동 skill 추천 default ON** (jaccard 매칭) + lessons 인덱스에 task-log.md 실패 라인 통합 (회수 범위 확장).
|
|
470
|
-
- **1.9.66** — **성능 최적화 2차 + MCP 13번째 도구**. `listAllSkills` 메모리 캐시 (skill list/info/match/discover/suggest 공유) + MCP `leerness_task_export` 추가 (TodoWrite 양방향 sync 외부 노출).
|
|
471
|
-
- **1.9.65** — **성능 최적화 1차** — usage-stats 메모리 캐시 + lessons 인덱스 캐시 (mtime invalidation). handoff -37% · drift -19% · audit -29% · skill list -17% · 100-task handoff -42% · status -48% (vs 1.9.64).
|
|
472
|
-
- **1.9.64** — `leerness install <SKILL.md>` 별칭 (skill install 단축) · **성능 벤치마크 1차 실측** (status/handoff/drift/audit/skill list 평균 1.2~1.5초).
|
|
473
|
-
- **1.9.63** — `leerness audit --strict [--threshold N]` — CI 친화 옵션 (warnings → failures 승격).
|
|
474
|
-
- **1.9.62** — `leerness audit` npm CVE 자동 감지 (npm audit --json 통합, OFFLINE/no-npm-audit 스킵).
|
|
475
|
-
- **1.9.61** — MCP server cursor 기반 페이지네이션 — `nextCursor` + `_chunkSize` override.
|
|
476
|
-
- **1.9.60** — `leerness task export` — progress-tracker → TodoWrite JSON 형식. **양방향 sync 완성** (1.9.38 sync + 1.9.60 export).
|
|
477
|
-
- **1.9.59** — `session close` **--suggest default 활성** (잊을 단계 없음, `--no-suggest`로 비활성 가능) · 설치 가이드 갱신.
|
|
478
|
-
- **1.9.58** — handoff lessons **fuzzy 매칭** (어간 변형, 복합어, decisions.md 매칭 추가).
|
|
479
|
-
- **1.9.57** — `session close --suggest` (마감 시 skill suggest + drift + 명령 통계 통합 보고) · install banner quickStart + session-workflow.md 갱신 (1.9.56/57 흐름 자동 안내).
|
|
480
|
-
- **1.9.56** — `handoff`에 lessons 자동 재상기 통합 (현재 in-progress task 키워드 매칭 → 과거 실패 자동 표시).
|
|
481
|
-
- **1.9.55** — MCP server에 `leerness_skill_suggest` + `leerness_lessons` 추가 (10 → 12 도구) · lessons --auto의 stopword 확장 (false positive 차단).
|
|
482
|
-
- **1.9.54** — `leerness lessons --auto` — 최근 in-progress task에서 키워드 자동 추출 → 과거 lessons 자동 매칭·재상기.
|
|
483
|
-
- **1.9.53** — `leerness skill suggest` — task-log / progress-tracker / usage-stats에서 반복 패턴 **자동 감지 → 새 skill 후보 제안** (Hermes-style 자동 학습의 leerness 버전).
|
|
484
|
-
- **1.9.52** — `skill discover` 카탈로그 형식 다양성 — JSON manifest / RSS·Atom / Markdown / llms.txt URL 4 형식 자동 감지 (`_parseSkillCatalog`).
|
|
485
|
-
- **1.9.51** — `benchmark --scenario <id|all>` — leerness 고유 가치 시나리오 4종 (거짓 완료 / 사양 불일치 / drift / BOM) **command 한 번에 정량 증명**.
|
|
486
|
-
- **1.9.50** — `skill match --embedding` — Ollama API 코사인 유사도 매칭 (opt-in, 실패 시 jaccard fallback).
|
|
487
|
-
- **1.9.49** — `benchmark --measure "<task>"` — 외부 CLI 실 호출 시간 측정 + leerness 검수 오버헤드 측정.
|
|
488
|
-
- **1.9.48** — cross-platform archive — `skill publish` tar 실패 시 PowerShell ZIP 자동 fallback (stress-v3 H1-H3 검증).
|
|
489
|
-
- **1.9.47** — `leerness skill publish` — 자체 skill을 SKILL.md + manifest.json 번들로 export (외부 공유 가능, agentskills.io 표준).
|
|
490
|
-
- **1.9.46** — `leerness benchmark` — 자체 6 차원 점수 + 6 도구 (vanilla/claude_code/hermes/leerness+claude 등) 시뮬 비교 매트릭스.
|
|
491
|
-
- **1.9.45** — `leerness skill match <query>` — 사용자 요청 ↔ 설치 SKILL.md description **jaccard 매칭** + 자동 추천.
|
|
492
|
-
- **1.9.44** — 1.9.34~43 13종 기능 통합 stress test 25/25 PASS · 발견된 BOM 처리 BUG 1건 즉시 패치 (`_parseSkillMd` UTF-8 BOM 자동 제거) · e2e 196/196.
|
|
493
|
-
- **1.9.43** — MCP 서버로 leerness 도구 10종 노출 (`leerness mcp serve`, Claude Code/Hermes/Cursor 등이 직접 호출 가능) · `skill export-all` (9개 일괄 SKILL.md export) · 내부 보고서 자동 비공개 (`_reports/` gitignore + npmignore).
|
|
494
|
-
- **1.9.42** — [agentskills.io](https://agentskills.io) 공개 표준 호환 (Claude Code · Cursor · Copilot · Codex · Gemini CLI · Hermes Agent 등 30+ 도구와 스킬 공유): `skill install <url>` · `skill discover` (opt-in) · `skill export` (SKILL.md frontmatter) · `LEERNESS_SKILL_DISCOVER_URL` .env opt-in.
|
|
495
|
-
- **1.9.41** — 디스크↔AI 컨텍스트 인지 갭 차단: `leerness whats-new` 명령 (CHANGELOG 자동 차분 추출) · `migrate` 후 stdout에 AI must re-read 차분 자동 출력 · `migration-report.md`에 신규 명령/파일 영구 기록 · `handoff`가 fresh migrate(24h 내) 시 자동 알림.
|
|
496
|
-
- **1.9.40** — dogfooding gap 차단: `leerness release pack` 통합 명령 (라운드 마감 자동화 — npm pack + parent migrate + task add + close + readme sync) · `audit`에 README ↔ package.json version mismatch 자동 감지 + `--fix`로 자동 갱신.
|
|
497
|
-
- **1.9.39** — AI 하네스 엔지니어링 6단계 워크플로 자동 유도 (`session-workflow.md` + handoff 끝 가이드 + AGENTS/CLAUDE 인스트럭션 통합) · `drift check --auto-fix` · `handoff --auto-recover` (critical 시 session close 자동 실행).
|
|
498
|
-
- **1.9.38** — drift 자동 reminder (`agent-reminders.md`) · `usage stats` 명령 · `task sync --from <todo.json>` · drift 임계 학습 (skip ≥5 → 임계 완화).
|
|
499
|
-
- **1.9.37** — `leerness drift check` (4 신호 + 4단계 레벨) — 라운드 길어지며 메인이 leerness 잊는 현상 자동 감지.
|
|
500
|
-
- **1.9.36** — `agents bench` (3 CLI 동시 비교) · `dispatch --write` (CLI별 권장 플래그) · 작업 유형 추천 · `contract verify` require() side-effect 25× 속도 회복.
|
|
501
|
-
- **1.9.35** — `contract verify` · `reuse autodetect` · `audit --fix` · `handoff` init 부재 경고 · `agents dispatch` 안전 규칙.
|
|
502
|
-
- **1.9.34** — 방향키/스페이스 인터랙티브 multi-select · 256색 그라데이션 배너 · 3단계 sub-agent 오케스트레이션 검증 (2.2× 효율).
|
|
503
|
-
- **1.9.33** — npx 캐시 옛 버전 자동 경고.
|
|
504
|
-
- **1.9.32** — ASCII 배너 · `setup-agents` 인터랙티브 + 자동 설치.
|
|
505
|
-
- **1.9.31** — `agents quota` (provider별 사용량 추정).
|
|
506
|
-
- **1.9.30** — 외부 AI CLI 오케스트레이션 (claude/codex/gemini/copilot).
|
|
507
|
-
- **1.9.29** — 페르소나 리뷰 (5종 내장).
|
|
508
|
-
- **1.9.24** — `deps <capability>` 영향 추적 + 자동 회귀.
|
|
509
|
-
- **1.9.22** — Ollama opt-in · `handoff --compact` · `llm-bench`.
|
|
510
|
-
- **1.9.18** — `verify-claim` · `--strict-elements` · depends-on 그래프.
|
|
511
|
-
- **1.9.17** — `--all-apps` 워크스페이스 모드.
|
|
512
|
-
- ... (전체 [CHANGELOG.md](CHANGELOG.md) 참조)
|
|
361
|
+
## 🔧 Environment variables / 환경변수
|
|
362
|
+
|
|
363
|
+
| Variable | Effect |
|
|
364
|
+
|----------|--------|
|
|
365
|
+
| `LEERNESS_OFFLINE=1` | Skip npm calls (offline) / npm 호출 스킵 |
|
|
366
|
+
| `LEERNESS_ENABLE_CLAUDE/CODEX/AGY/GROK/COPILOT/OLLAMA` | Enable external CLIs / 외부 CLI 활성화 |
|
|
367
|
+
| `LEERNESS_NO_BANNER` | Skip ASCII banner / 배너 스킵 |
|
|
368
|
+
| `LEERNESS_NO_DRIFT_CHECK` | Disable drift warning / drift 경고 끄기 |
|
|
369
|
+
| `LEERNESS_NO_INTERACTIVE` | Disable arrow-key select / 방향키 선택 끄기 |
|
|
513
370
|
|
|
514
371
|
---
|
|
515
372
|
|
|
516
|
-
##
|
|
373
|
+
## 📜 Recent highlights / 최근 변경
|
|
374
|
+
|
|
375
|
+
- **1.9.271** — README 한/영 이중 사용자 친화 재작성 / Bilingual KO-EN README rewrite.
|
|
376
|
+
- **1.9.270** — agent roles: 모델별 역할 부여 / per-model role assignment (`roles` CLI + `dispatch --role`).
|
|
377
|
+
- **1.9.269** — init 시 OS 시스템 언어 감지 / OS system-language detection on init.
|
|
378
|
+
- **1.9.268** — grok 정식 provider 승격 / grok promoted to a first-class provider.
|
|
379
|
+
- **1.9.265~267** — CLI 에이전트 슬래시 명령 레지스트리 + `--help` probe 자동 갱신.
|
|
517
380
|
|
|
518
|
-
|
|
519
|
-
- **PR**: e2e 통과 + 한국어 주석 + UTF-8 BOM 없음
|
|
381
|
+
> 전체 이력 / full history: [CHANGELOG.md](CHANGELOG.md)
|
|
520
382
|
|
|
521
383
|
---
|
|
522
384
|
|
|
523
|
-
##
|
|
385
|
+
## 🤝 Contributing / 기여
|
|
386
|
+
|
|
387
|
+
- Issues: https://github.com/gugu9999gu/leerness/issues
|
|
388
|
+
- PRs: e2e 통과 + 한국어 주석 + UTF-8 (no BOM) / pass e2e, Korean comments, UTF-8 without BOM.
|
|
389
|
+
|
|
390
|
+
## 📄 License
|
|
524
391
|
|
|
525
392
|
MIT — © leerness contributors
|
|
526
393
|
|
|
527
|
-
> **AI 에이전트가 신뢰할 수 있게 일하도록 만드는
|
|
528
|
-
>
|
|
394
|
+
> **AI 에이전트가 신뢰할 수 있게 일하도록 만드는 도구. 사용자 동의 없이 외부 LLM/API/CLI를 자동 호출하지 않습니다.**
|
|
395
|
+
> **A tool that makes AI agents work reliably. It never auto-calls external LLMs/APIs/CLIs without your consent.**
|
|
529
396
|
|
|
530
397
|
<!-- leerness:project-readme:start -->
|
|
531
398
|
## Leerness Project Harness
|
|
532
399
|
|
|
533
|
-
이 프로젝트는 Leerness v1.9.
|
|
400
|
+
이 프로젝트는 Leerness v1.9.272 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
534
401
|
|
|
535
402
|
### Core Commands
|
|
536
403
|
|
|
@@ -572,7 +439,7 @@ leerness memory restore decision <date|title>
|
|
|
572
439
|
|
|
573
440
|
### MCP server (외부 AI 통합)
|
|
574
441
|
|
|
575
|
-
Leerness v1.9.
|
|
442
|
+
Leerness v1.9.272는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **42개 도구**를 노출:
|
|
576
443
|
|
|
577
444
|
```jsonc
|
|
578
445
|
// 카테고리별
|
|
@@ -593,7 +460,7 @@ Leerness v1.9.206는 stdio JSON-RPC MCP server를 내장합니다 — Claude Cod
|
|
|
593
460
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
594
461
|
1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) stress-v* 신규 작성 + 누적 회귀 → 4) e2e 219/219 → 5) npm pack + git tag + GitHub release → 6) main 자동 push (1.9.140+) → 7) session close → 8) 다음 라운드 예약.
|
|
595
462
|
|
|
596
|
-
현재 누적: **70 라운드 (1.9.40 → 1.9.
|
|
463
|
+
현재 누적: **70 라운드 (1.9.40 → 1.9.272)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
|
|
597
464
|
|
|
598
465
|
### 성능 가이드 (1.9.140 측정)
|
|
599
466
|
|
|
@@ -631,6 +498,6 @@ leerness release pack --close --auto-main-push
|
|
|
631
498
|
- `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
632
499
|
- `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
633
500
|
|
|
634
|
-
Last synced by Leerness v1.9.
|
|
501
|
+
Last synced by Leerness v1.9.272: 2026-06-03
|
|
635
502
|
<!-- leerness:project-readme:end -->
|
|
636
503
|
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Security & Transparency / 보안·투명성
|
|
2
|
+
|
|
3
|
+
> `leerness capabilities` 로 언제든 아래 표면을 CLI 에서 확인할 수 있습니다 (`--json` 지원).
|
|
4
|
+
> Run `leerness capabilities` anytime to view this surface from the CLI (`--json` supported).
|
|
5
|
+
|
|
6
|
+
leerness 는 **권한이 큰 CLI 하네스**입니다 (child_process · git · 외부 AI CLI · 자동화 브리지 · hook 설치). 신뢰를 위해 **할 수 있는 전부와 각 항목의 끄는 법(opt-out)** 을 공개합니다.
|
|
7
|
+
|
|
8
|
+
leerness is a **powerful CLI harness** (child_process, git, external AI CLIs, automation bridges, hook install). For trust, we disclose **everything it can do and how to opt out of each**.
|
|
9
|
+
|
|
10
|
+
## 설계 원칙 / Design principles
|
|
11
|
+
|
|
12
|
+
- **런타임 의존성 0** — `npm audit` 취약점 0. / Zero runtime dependencies.
|
|
13
|
+
- **postinstall 없음** — 설치만으로 코드가 실행되지 않음. / No postinstall scripts.
|
|
14
|
+
- **변경 전 자동 백업** — 모든 메타파일 변경 전 `.harness/archive/` 에 백업. / Auto-backup before any change.
|
|
15
|
+
- **동의 없는 자동 호출 금지** — 사용자 동의 없이 외부 LLM/API/CLI 를 자동 호출하지 않음. / Never auto-calls external LLMs/APIs/CLIs without consent.
|
|
16
|
+
|
|
17
|
+
## 권한 표면 / Capability surface
|
|
18
|
+
|
|
19
|
+
| 영역 / Area | 위험 / Risk | 설명 / What | opt-out |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| filesystem | 🟢 low | `.harness/` 메타파일 생성·갱신, 변경 전 백업. 소스코드 직접 수정 안 함. | 핵심 동작 (백업으로 보호) |
|
|
22
|
+
| network | 🟢 low | `update --check` 의 npm 최신 버전 비교만. 외부 URL 자동 fetch 안 함. | `LEERNESS_OFFLINE=1` |
|
|
23
|
+
| childProcess | 🟡 medium | git(명시 명령 시), `npm test`(verify-code), 외부 CLI `--version` 감지. | verify 계열 한정 · 외부 CLI 는 opt-in |
|
|
24
|
+
| externalAgents | 🟡 medium | `agents dispatch/multi` — 기본은 명령 텍스트만 생성, `multi --execute` 시 실제 spawn. | `LEERNESS_ENABLE_*` 미설정 시 비활성 (기본 off) |
|
|
25
|
+
| automationBridges | 🔴 high | `web`(playwright)/`pc`(robotjs)/`lsp`(typescript) — opt-in 의존성. `pc` 는 마우스/키보드 제어. | 의존성 미설치 시 비활성 (기본 off) |
|
|
26
|
+
| claudeHook | 🟢 low | `init` 시 `.claude/settings.local.json` 에 SessionStart hook(`update --check`) 설치. | `leerness init . --no-auto-update` |
|
|
27
|
+
|
|
28
|
+
## ⚠ 주의해서 쓸 명령 / Use with caution
|
|
29
|
+
|
|
30
|
+
회사·운영 코드에서는 아래 명령을 먼저 검토하세요. / Review these before using on company/production code.
|
|
31
|
+
|
|
32
|
+
| 명령 / Command | 동작 / Action |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `init` | `.harness/` 50+ 파일 + `.claude` hook 생성 (변경 전 백업) |
|
|
35
|
+
| `update --yes` | 자동 마이그레이션 — 메타파일 갱신 |
|
|
36
|
+
| `agents multi --execute` | 외부 AI CLI 실제 spawn (병렬) |
|
|
37
|
+
| `release publish` / `sync-main` | git push + npm publish + GitHub release |
|
|
38
|
+
| `pc <click|type>` | 마우스/키보드 제어 (robotjs, full 권한) |
|
|
39
|
+
| `web <...>` | 헤드리스 브라우저 자동화 (playwright) |
|
|
40
|
+
| `setup-agents` | 외부 CLI 활성화 + 자동 설치 시도 |
|
|
41
|
+
|
|
42
|
+
## 권장 도입 방식 / Recommended adoption
|
|
43
|
+
|
|
44
|
+
전역 자동 적용보다, 먼저 한 프로젝트에서 확인 후 커밋하세요.
|
|
45
|
+
Prefer per-project trial over global auto-adoption.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx leerness@latest init . --yes --language ko # 또는 --language en
|
|
49
|
+
git diff && git status # 생성 파일 검토 후 커밋
|
|
50
|
+
leerness capabilities # 권한 표면 확인
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 취약점 보고 / Reporting
|
|
54
|
+
|
|
55
|
+
보안 이슈는 공개 이슈 대신 비공개로 알려주세요 / Report security issues privately (not public issues):
|
|
56
|
+
https://github.com/gugu9999gu/leerness/issues (보안 라벨 / security label)
|
package/bin/harness.js
CHANGED
|
@@ -7,7 +7,7 @@ const cp = require('child_process');
|
|
|
7
7
|
const os = require('os'); // 1.9.178: _publishToNpm 에서 os.tmpdir() 사용 (전역 import)
|
|
8
8
|
const readline = require('readline');
|
|
9
9
|
|
|
10
|
-
const VERSION = '1.9.
|
|
10
|
+
const VERSION = '1.9.272';
|
|
11
11
|
|
|
12
12
|
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning 억제 (사용자 명시).
|
|
13
13
|
// leerness 는 cross-platform PATH resolution 을 위해 shell: true 를 의도적으로 사용 (claude.cmd / ollama.cmd 등 Windows .cmd 처리).
|
|
@@ -794,9 +794,9 @@ function syncReadme(root) {
|
|
|
794
794
|
// e2e 배지: scripts/e2e.js의 출력 "E2E result: N/N passed" 추정 (직접 grep)
|
|
795
795
|
const e2ePath = path.join(root, 'scripts', 'e2e.js');
|
|
796
796
|
if (exists(e2ePath)) {
|
|
797
|
-
// total
|
|
797
|
+
// 1.9.271: e2e 테스트 수 = `total++;` 블록 + `run(...)` 호출 (run 헬퍼가 내부에서 total++ 수행) → 실제 결과와 일치.
|
|
798
798
|
const body = read(e2ePath);
|
|
799
|
-
const total = (body.match(/^total\+\+;/gm) || []).length;
|
|
799
|
+
const total = (body.match(/^total\+\+;/gm) || []).length + (body.match(/^run\(/gm) || []).length;
|
|
800
800
|
if (total > 0) {
|
|
801
801
|
updated = updated.replace(/badge\/e2e-(\d+)%2F(\d+)-success/g, `badge/e2e-${total}%2F${total}-success`);
|
|
802
802
|
}
|
|
@@ -2950,6 +2950,7 @@ function _selfTestCases() {
|
|
|
2950
2950
|
{ name: '_detectSystemLang: LC_ALL 우선 + LANGUAGE 폴백 (1.9.269)', run: () => _detectSystemLang({ LC_ALL: 'ko_KR.UTF-8', LANG: 'en_US.UTF-8' }) === 'ko' && _detectSystemLang({ LANGUAGE: 'en_GB' }) === 'en' },
|
|
2951
2951
|
{ name: 'ROLE_CATALOG + _normalizeRole: 7종 + 한국어 별칭 (1.9.270)', run: () => { const keys = Object.keys(ROLE_CATALOG); return keys.length === 7 && keys.includes('coder') && keys.includes('reviewer') && _normalizeRole('코딩') === 'coder' && _normalizeRole('검수자') === 'reviewer' && _normalizeRole('지휘관') === 'commander'; } },
|
|
2952
2952
|
{ name: '_pickModel: top/code/fast 등급 선택 (1.9.270)', run: () => { return _pickModel('codex', 'code') === 'gpt-5-codex' && _pickModel('claude', 'top') === 'claude-opus-4-7' && /haiku/.test(_pickModel('claude', 'fast')); } },
|
|
2953
|
+
{ name: 'CAPABILITY_SURFACE: 6 영역 + risk/optOut + 주의명령 (1.9.272)', run: () => { const ks = Object.keys(CAPABILITY_SURFACE); return ks.length === 6 && ks.includes('automationBridges') && Object.values(CAPABILITY_SURFACE).every(v => ['low','medium','high'].includes(v.risk) && v.optOut && v.desc) && POWERFUL_COMMANDS.length >= 5; } },
|
|
2953
2954
|
{ name: 'VERSION 형식 (x.y.z)', run: () => /^\d+\.\d+\.\d+$/.test(VERSION) }
|
|
2954
2955
|
];
|
|
2955
2956
|
}
|
|
@@ -3606,6 +3607,7 @@ function commandsCmd(root) {
|
|
|
3606
3607
|
{ cmd: 'route <task-type>', desc: '작업 유형 분류 (11종)' },
|
|
3607
3608
|
{ cmd: 'agents list|check|quota|dispatch|multi', desc: '외부 AI CLI 오케스트레이션 (dispatch --role 모델 라우팅 1.9.270)' },
|
|
3608
3609
|
{ cmd: 'roles list|set|unset|catalog|suggest|verify', desc: '모델별 역할 부여 (코딩/검수/지휘/디자인/디버그/설계/분배) — 1.9.270' },
|
|
3610
|
+
{ cmd: 'capabilities [--json]', desc: '권한·보안 표면 공개 (무엇을 하는지 + opt-out + 주의 명령) — 1.9.272' },
|
|
3609
3611
|
{ cmd: 'slash-commands [agent] [--json --record --detect --refresh]', desc: 'CLI 에이전트 슬래시 명령 레지스트리 + --help probe 자동 갱신 (1.9.265~267, UR-0021)' },
|
|
3610
3612
|
{ cmd: 'review-request "<request>"', desc: '사용자 요청 사전 검토 (1.9.176)' },
|
|
3611
3613
|
{ cmd: 'review <file> --persona <ids>', desc: '페르소나 리뷰 (1.9.29)' },
|
|
@@ -15258,6 +15260,9 @@ function autoUpdateInstall(root) {
|
|
|
15258
15260
|
ok('auto-update SessionStart hook installed (.claude/settings.local.json)');
|
|
15259
15261
|
if (removedLegacy) ok(`legacy hook 제거: ${removedLegacy}건 (leerness-plus → leerness 통합)`);
|
|
15260
15262
|
ok('/update slash command added');
|
|
15263
|
+
// 1.9.272 (GPT-5.5 외부 리뷰 반영): hook 설치 투명성 — 무엇을/왜/어떻게 끄는지 명시.
|
|
15264
|
+
log(` ⓘ 이 hook 은 Claude Code 세션 시작 시 \`leerness update --check\` 를 1회 실행합니다 (네트워크: npm 최신 버전 비교, 자동 설치는 안 함).`);
|
|
15265
|
+
log(` ⓘ 제거: ${rel(root, settingsFile)} 의 hooks.SessionStart 항목 삭제 · 설치 시 끄기: leerness init . --no-auto-update`);
|
|
15261
15266
|
}
|
|
15262
15267
|
|
|
15263
15268
|
// 1.9.151: ViewWork hook 제거 (사용자 명시 — leerness와 무관한 외부 도구)
|
|
@@ -17893,6 +17898,56 @@ function rolesCmd(root, sub, ...args) {
|
|
|
17893
17898
|
log(`\n 사용: leerness agents dispatch "<task>" --role <role> · 검증: leerness roles verify`);
|
|
17894
17899
|
}
|
|
17895
17900
|
|
|
17901
|
+
// ===== 1.9.272: Capability / Security Surface 공개 (GPT-5.5 외부 리뷰 반영) =====
|
|
17902
|
+
// leerness 는 권한이 큰 CLI 하네스(child_process/git/외부 CLI/automation 브리지/hook 설치)이므로,
|
|
17903
|
+
// 무엇을 할 수 있고 어떻게 끄는지를 명시적으로 공개해 신뢰도를 높인다. SECURITY.md 와 동일 출처.
|
|
17904
|
+
const CAPABILITY_SURFACE = {
|
|
17905
|
+
filesystem: { risk: 'low', desc: '.harness/ 메타파일 생성·갱신, 변경 전 .harness/archive/ 자동 백업. 소스코드는 직접 수정 안 함.', optOut: '핵심 동작 (백업으로 보호)' },
|
|
17906
|
+
network: { risk: 'low', desc: 'npm 최신 버전 비교(update --check)만. 그 외 외부 URL 자동 fetch 안 함.', optOut: 'LEERNESS_OFFLINE=1' },
|
|
17907
|
+
childProcess: { risk: 'medium', desc: 'git(명시 명령 시 status/commit/push), npm test(verify-code), 외부 CLI --version 감지. 셸 spawn.', optOut: 'verify 계열 한정 · 외부 CLI 는 opt-in' },
|
|
17908
|
+
externalAgents: { risk: 'medium', desc: 'agents dispatch/multi — 외부 AI CLI(claude/codex/agy/grok/copilot) 호출. 기본은 명령 텍스트만 생성, multi --execute 시 실제 spawn.', optOut: 'LEERNESS_ENABLE_* 미설정 시 비활성 (기본 off)' },
|
|
17909
|
+
automationBridges: { risk: 'high', desc: 'web(playwright)/pc(robotjs)/lsp(typescript) 브리지 — opt-in 의존성. pc 는 마우스/키보드 제어(full 권한).', optOut: '의존성 미설치 시 비활성 (기본 off, 명시 설치 필요)' },
|
|
17910
|
+
claudeHook: { risk: 'low', desc: 'init 시 .claude/settings.local.json 에 SessionStart hook(update --check) 설치.', optOut: 'leerness init . --no-auto-update' }
|
|
17911
|
+
};
|
|
17912
|
+
const POWERFUL_COMMANDS = [
|
|
17913
|
+
{ cmd: 'init', note: '.harness/ 50+ 파일 + .claude hook 생성 (변경 전 백업)' },
|
|
17914
|
+
{ cmd: 'update --yes', note: '자동 마이그레이션 — 메타파일 갱신' },
|
|
17915
|
+
{ cmd: 'agents multi --execute', note: '외부 AI CLI 실제 spawn (병렬 실행)' },
|
|
17916
|
+
{ cmd: 'release publish / sync-main', note: 'git push + npm publish + GitHub release' },
|
|
17917
|
+
{ cmd: 'pc <click|type|...>', note: '마우스/키보드 제어 (robotjs, full 권한)' },
|
|
17918
|
+
{ cmd: 'web <...>', note: '헤드리스 브라우저 자동화 (playwright)' },
|
|
17919
|
+
{ cmd: 'setup-agents', note: '외부 CLI 활성화 + 자동 설치 시도' }
|
|
17920
|
+
];
|
|
17921
|
+
function capabilitiesCmd(root, opts = {}) {
|
|
17922
|
+
if (opts.json) {
|
|
17923
|
+
log(JSON.stringify({ version: VERSION, surface: CAPABILITY_SURFACE, powerfulCommands: POWERFUL_COMMANDS,
|
|
17924
|
+
principles: ['0 런타임 의존성', 'postinstall 없음', '사용자 동의 없이 외부 LLM/API/CLI 자동 호출 안 함', '변경 전 자동 백업'] }, null, 2));
|
|
17925
|
+
return;
|
|
17926
|
+
}
|
|
17927
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
17928
|
+
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
17929
|
+
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
17930
|
+
const riskMark = r => r === 'high' ? '🔴 high' : r === 'medium' ? '🟡 medium' : '🟢 low';
|
|
17931
|
+
log(cy(`# leerness capabilities (1.9.272) — 권한·보안 표면 공개`));
|
|
17932
|
+
log(dm(` leerness 는 권한이 큰 CLI 하네스입니다. 아래가 할 수 있는 전부이며, 각 항목의 opt-out 을 함께 표기합니다.`));
|
|
17933
|
+
log('');
|
|
17934
|
+
log(`## 원칙`);
|
|
17935
|
+
log(` ✓ 런타임 의존성 0 · postinstall 없음 · 변경 전 자동 백업`);
|
|
17936
|
+
log(` ✓ 사용자 동의 없이 외부 LLM/API/CLI 를 자동 호출하지 않음`);
|
|
17937
|
+
log('');
|
|
17938
|
+
log(`## 권한 표면`);
|
|
17939
|
+
for (const [k, v] of Object.entries(CAPABILITY_SURFACE)) {
|
|
17940
|
+
log(` ${riskMark(v.risk)} ${cy(k)}`);
|
|
17941
|
+
log(` ${v.desc}`);
|
|
17942
|
+
log(dm(` opt-out: ${v.optOut}`));
|
|
17943
|
+
}
|
|
17944
|
+
log('');
|
|
17945
|
+
log(`## ⚠ 주의해서 쓸 명령 (회사/운영 코드)`);
|
|
17946
|
+
for (const c of POWERFUL_COMMANDS) log(` • ${c.cmd.padEnd(22)} ${dm(c.note)}`);
|
|
17947
|
+
log('');
|
|
17948
|
+
log(dm(` 전체 정책: SECURITY.md · 기계 판독: leerness capabilities --json`));
|
|
17949
|
+
}
|
|
17950
|
+
|
|
17896
17951
|
// 1.9.149+1.9.153: REPL 모드 — leerness 자율 AI 에이전트 (multi-provider 세션)
|
|
17897
17952
|
async function _agentRepl(root, opts) {
|
|
17898
17953
|
// 1.9.153: .env 자동 로드 (REPL 진입 직전) — install 직후 LEERNESS_ENABLE_* 즉시 반영
|
|
@@ -20816,6 +20871,8 @@ async function main() {
|
|
|
20816
20871
|
}
|
|
20817
20872
|
// 1.9.270: leerness roles <list|set|unset|catalog|suggest|verify> — 모델별 역할 부여 (사용자 명시)
|
|
20818
20873
|
if (cmd === 'roles' || cmd === 'role') return rolesCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
20874
|
+
// 1.9.272: leerness capabilities — 권한/보안 표면 공개 (GPT-5.5 외부 리뷰 반영)
|
|
20875
|
+
if (cmd === 'capabilities' || cmd === 'security-surface') return capabilitiesCmd(arg('--path', process.cwd()), { json: has('--json') });
|
|
20819
20876
|
// 1.9.245: API skill cache — 공식 문서·관련링크 자동 정리 (사용자 명시 UR-0015)
|
|
20820
20877
|
if (cmd === 'api-skill') return apiSkillCmd(arg('--path', process.cwd()), args[1] || 'help');
|
|
20821
20878
|
// 1.9.208: leerness constraints <list|check|add> — 플랫폼/API 제약 사전 체크 (사용자 명시)
|
|
@@ -20988,5 +21045,7 @@ module.exports = {
|
|
|
20988
21045
|
// 1.9.269: 시스템(OS) 언어 감지 (UR-0022) + 언어 판별 — 단위 테스트
|
|
20989
21046
|
_detectSystemLang, detectLanguageValue,
|
|
20990
21047
|
// 1.9.270: agent roles — 모델별 역할 부여 (사용자 명시) — 단위 테스트
|
|
20991
|
-
ROLE_CATALOG, _normalizeRole, _pickModel, _rolesFile, _loadRoles, _saveRoles, _resolveRole, _suggestRoles, rolesCmd, _dispatchCommand
|
|
21048
|
+
ROLE_CATALOG, _normalizeRole, _pickModel, _rolesFile, _loadRoles, _saveRoles, _resolveRole, _suggestRoles, rolesCmd, _dispatchCommand,
|
|
21049
|
+
// 1.9.272: 권한/보안 표면 공개 (GPT-5.5 리뷰) — 단위 테스트
|
|
21050
|
+
CAPABILITY_SURFACE, POWERFUL_COMMANDS, capabilitiesCmd
|
|
20992
21051
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.272",
|
|
4
4
|
"description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|
|
@@ -42,12 +42,13 @@
|
|
|
42
42
|
"docs",
|
|
43
43
|
"README.md",
|
|
44
44
|
"CHANGELOG.md",
|
|
45
|
+
"SECURITY.md",
|
|
45
46
|
"LICENSE"
|
|
46
47
|
],
|
|
47
48
|
"scripts": {
|
|
48
49
|
"test": "node ./bin/harness.js --version && node ./bin/harness.js selftest && node ./scripts/e2e.js",
|
|
49
50
|
"test:smoke": "node ./scripts/e2e.js",
|
|
50
|
-
"prepack": "node ./bin/harness.js --version"
|
|
51
|
+
"prepack": "node ./bin/harness.js readme sync . && node ./bin/harness.js --version"
|
|
51
52
|
},
|
|
52
53
|
"publishConfig": {
|
|
53
54
|
"access": "public"
|
package/scripts/e2e.js
CHANGED
|
@@ -2748,5 +2748,23 @@ total++;
|
|
|
2748
2748
|
if (!ok) { failed++; console.log((rRoute.stdout || '').slice(0, 400)); }
|
|
2749
2749
|
}
|
|
2750
2750
|
|
|
2751
|
+
// 1.9.272 회귀: capabilities — 권한/보안 표면 공개 (GPT-5.5 리뷰 반영)
|
|
2752
|
+
total++;
|
|
2753
|
+
{
|
|
2754
|
+
const rJson = cp.spawnSync(process.execPath, [CLI, 'capabilities', '--json'], { encoding: 'utf8', timeout: 15000 });
|
|
2755
|
+
let jsonOk = false;
|
|
2756
|
+
try {
|
|
2757
|
+
const j = JSON.parse(rJson.stdout);
|
|
2758
|
+
jsonOk = j.surface && Object.keys(j.surface).length === 6 && j.surface.automationBridges
|
|
2759
|
+
&& j.surface.automationBridges.risk === 'high' && Array.isArray(j.powerfulCommands) && j.powerfulCommands.length >= 5
|
|
2760
|
+
&& Array.isArray(j.principles);
|
|
2761
|
+
} catch {}
|
|
2762
|
+
const rTxt = cp.spawnSync(process.execPath, [CLI, 'security-surface'], { encoding: 'utf8', timeout: 15000 });
|
|
2763
|
+
const txtOk = rTxt.status === 0 && /권한·보안 표면/.test(rTxt.stdout) && /opt-out/.test(rTxt.stdout);
|
|
2764
|
+
const ok = jsonOk && txtOk;
|
|
2765
|
+
console.log(ok ? '✓ B(1.9.272) capabilities: 6 영역 surface + 주의명령 + alias(security-surface)' : `✗ capabilities 실패 (json=${jsonOk} txt=${txtOk})`);
|
|
2766
|
+
if (!ok) { failed++; console.log((rJson.stdout || '').slice(0, 300)); }
|
|
2767
|
+
}
|
|
2768
|
+
|
|
2751
2769
|
console.log(`\nE2E result: ${total - failed}/${total} passed`);
|
|
2752
2770
|
if (failed > 0) process.exit(1);
|