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 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
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.266-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v211-21%2F21-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-73-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-60-brightgreen)]() [![json-fields](https://img.shields.io/badge/JSON_통합-12_필드-blueviolet)]() [![rounds](https://img.shields.io/badge/autonomous_R-222-blueviolet)]() [![main-push](https://img.shields.io/badge/🎉_main--push_streak-128_rounds-success)]() [![npm-streak](https://img.shields.io/badge/🎉_npm--publish-89_streak-success)]() [![encoding](https://img.shields.io/badge/🌐_인코딩보호-Windows%2BPOSIX-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-370ms-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.272-green)]() [![tests](https://img.shields.io/badge/e2e-220%2F220-success)]() [![selftest](https://img.shields.io/badge/selftest-24%2F24-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-75-brightgreen)]() [![providers](https://img.shields.io/badge/AI_providers-6-brightgreen)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
7
 
7
8
  ```
8
9
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,525 +13,391 @@
12
13
  ║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
13
14
  ║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
14
15
  ║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
15
- v1.9.266 AI Agent Reliability Harness + Sandbox
16
- ║ verify · remember · orchestrate · audit · sandbox · drift
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> &nbsp;·&nbsp; 🇬🇧 <a href="#english">English</a></b></p>
22
+
21
23
  ---
22
24
 
23
- ## leerness는 무엇인가요?
25
+ <a id="한국어"></a>
24
26
 
25
- Claude Code · Cursor · Copilot · Codex · Gemini CLI 같은 **AI 코딩 에이전트와 함께 일할 때 발생하는 구조적 문제**를 자동으로 막는 CLI 하네스입니다.
27
+ # 🇰🇷 한국어
26
28
 
27
- AI 에이전트는 빠르게 코드를 쓰지만, 다음 **5가지 함정**에 반복해서 빠집니다:
29
+ ## 한눈에 보기
28
30
 
29
- ```
30
- 1. 거짓 완료 — "구현했습니다"는데 코드에 변경이 없거나 테스트 미실행
31
- 2. 중복 생성 — 이미 있는 함수를 다른 프로젝트에 만듦
32
- 3. 망각 — 다음 세션에서 컨텍스트(plan/decisions)를 잃음
33
- 4. 충돌 — 멀티 에이전트가 같은 파일을 동시에 써서 작업 손실
34
- 5. 도구 drift — 시간이 지날수록 메인 에이전트가 도구·메타파일을 잊음
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
- leerness는 5가지를 모두 **자동으로 감지·차단·회복**합니다.
61
+ > 💡 `@latest`를 붙이면 npx 캐시로 옛 버전이 실행되는 함정을 피할 수 있습니다.
38
62
 
39
63
  ---
40
64
 
41
- ## 어떻게 작동하나요?
65
+ ## 🧩 작동 방식
42
66
 
43
- ### 1. 워크스페이스에 4개 채널을 만듭니다
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
- 4개 파일은 사용자 메모리로 보호됩니다. leerness가 자동 업데이트하지만, 사용자/AI가 직접 편집한 내용은 **항상 보존**됩니다.
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
- leerness verify-claim T-0042 --run-tests
61
-
62
- evidence 파일 확인 테스트 실제 실행 URL 코드 매칭
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
- ```bash
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 agents list # claude/codex/gemini/copilot 상태
79
- leerness agents dispatch "<task>" --to gemini --write # 권장 플래그 자동 첨부
80
- leerness agents bench "<task>" # 3 CLI 동시 호출 + 시간/품질 비교
81
- leerness contract verify SPEC.md src/x.js # 사양 구현 함수/필드 일치 검증
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
- ### 5. 도구 drift 자동 감지 (1.9.37+)
100
+ > 역할 7종: 지휘(commander)·검수(reviewer)·코딩(coder)·설계(architect)·디자인(designer)·디버그(debugger)·분배(dispatcher). 한국어 별칭 지원.
85
101
 
86
- 라운드가 길어지면 AI가 leerness를 "점점 안 쓰는" 현상을 자동 감지:
102
+ ### 4. 라운드가 길어지면 "leerness를 안 쓰는" drift를 자동 감지
87
103
 
88
104
  ```bash
89
105
  leerness drift check .
90
- → 🔴 critical (100/200) — session close 4.6누락, task update 3.6일 stale
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
- ## 60초 시작
112
+ ## 📊 적용 효과 (정량)
99
113
 
100
- ```bash
101
- # 1) 설치 + 초기화 (방향키/스페이스 인터랙티브)
102
- npx leerness@latest init .
114
+ `leerness-bench` 28 프로젝트 124 task 측정:
103
115
 
104
- # 2) AI 세션 시작 컨텍스트 자동 적재
105
- npx leerness handoff .
106
-
107
- # 3) AI 작업 증거 자동 검증
108
- npx leerness verify-claim T-0001 --run-tests
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
- # 4) 세션 마감 다음 세션 인계
111
- npx leerness session close .
112
- ```
125
+ - 수동 검수 **90초 자동 1.5초**
126
+ - 컨텍스트 적재 **500자** (`handoff --compact`, AI 토큰 90% 절감)
113
127
 
114
128
  ---
115
129
 
116
- ## 적용시 효과 — 정량 데이터
130
+ ## 🛠️ 핵심 명령
117
131
 
118
- `leerness-bench` 28 프로젝트 124 task 측정 결과:
119
-
120
- | 카테고리 | 적용 | 미적용 | 개선 |
121
- | ------------------------ | ----------------------: | -----------: | -------------: |
122
- | 다중 에이전트 효율 | 100/100 | 3/100 | **+97** |
123
- | 자동 검수 (verify-claim) | 98/100 | 0/100 | +98 |
124
- | 재사용 인식 | 100/100 | 0/100 | +100 |
125
- | 워크스페이스 가시성 | 99/100 | 0/100 | +99 |
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
- - **수동 검수 90s → 자동 1.5s** (`verify-claim --run-tests`)
133
- - **워크스페이스 28 프로젝트 1 명령** (vs 112 개별 명령)
134
- - **컨텍스트 적재 500자** (`handoff --compact`, AI 토큰 비용 90% 절감)
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
- ### 실제 BUG 자동 발견 사례
153
+ # 버전
154
+ leerness update --check # 새 버전 감지
155
+ leerness update --yes # 자동 마이그레이션 + 검증
156
+ ```
137
157
 
138
- - **거짓 완료**: 5건 (모두 verify-claim에서 evidence 누락 감지)
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
- ```bash
169
- leerness init [path] [--language ko|en] # 신규 프로젝트 (방향키 multi-select)
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
- ```bash
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
- ### 외부 AI CLI · 멀티 에이전트
180
+ leerness 권한이 CLI 하네스입니다(child_process · git · 외부 CLI · 자동화 브리지 · hook 설치). **할 수 있는 전부와 끄는 법**을 공개합니다.
193
181
 
194
182
  ```bash
195
- leerness setup-agents # 인터랙티브 활성화 + 자동 설치
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
- ```bash
204
- leerness persona list / show <id> / add <id>
205
- leerness review <file> --persona security,performance,ux
206
- ```
191
+ ---
207
192
 
208
- ### Agent Skills 표준 (1.9.42, agentskills.io 호환)
193
+ <a id="english"></a>
209
194
 
210
- ```bash
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
- ### MCP Server — leerness 도구를 메인 에이전트의 sub-tool로 (1.9.43)
197
+ ## At a glance
219
198
 
220
- ```bash
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
- Claude Code · Hermes · Cursor 등이 `.mcp.json`에 등록하면 메인 에이전트가 leerness 검수를 sub-tool로 호출 가능:
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
- opt-in 설정 (`.env`):
240
- ```bash
241
- LEERNESS_SKILL_DISCOVER_URL=https://agentskills.io/llms.txt # 또는 자체 카탈로그 URL
242
- LEERNESS_SKILL_AUTO_DISCOVER=0 # 1=요청 자동 추천
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
- > ❌ leerness는 외부 URL을 자동 fetch하지 않습니다. `LEERNESS_SKILL_DISCOVER_URL` 설정 또는 `--source` 명시 후에만 호출.
211
+ ---
246
212
 
247
- ### 보안·인코딩
213
+ ## ⏱️ 60-second start
248
214
 
249
215
  ```bash
250
- leerness scan secrets . # AWS/GitHub/OpenAI/Anthropic/Google/Slack/PEM
251
- leerness encoding check . # BOM/UTF-16/한글 라운드트립
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
- ```bash
259
- leerness update --check # 24h 캐시로 새 버전 감지
260
- leerness update --yes # 자동 마이그레이션 + 검증
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
- ### 시나리오 1: AI에게 작업 시키고 거짓 완료 검증
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
- ### 시나리오 2: 멀티 AI 에이전트 협업
277
-
278
- ```bash
279
- # 1) 외부 CLI 활성화
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
- ### 시나리오 3: 라운드가 길어지며 drift 감지
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
- ```bash
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
- ### 시나리오 4: TodoWrite ↔ leerness 동기화
308
-
309
- ```bash
310
- # Claude Code의 TodoWrite를 JSON으로 export
311
- leerness task sync --from /path/to/todos.json
312
- # completed done, in_progress in-progress, pending planned로 자동 mirror
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
- .harness/
321
- ├── plan.md · progress-tracker.md · current-state.md · session-handoff.md
322
- ├── decisions.md · task-log.md · review-evidence.md · guideline.md
323
- ├── architecture.md · context-map.md · feature-contracts.md · reuse-map.md
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
- | `LEERNESS_OFFLINE=1` | npm 호출 스킵 (오프라인) |
349
- | `LEERNESS_OLLAMA_BASE_URL` | orchestrate opt-in (1.9.22+) |
350
- | `LEERNESS_ENABLE_CLAUDE/CODEX/GEMINI/COPILOT` | 외부 CLI 활성화 (1.9.30+) |
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
- ## Claude Code / Cursor / Copilot 통합
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
- | "회고해줘 / 돌아보자" | `leerness retro` |
376
- | "최근 N일 회고" | `leerness retro --days N` |
377
- | "통계 / 누적 지표" | `leerness insights` |
378
- | "X 관련 자료 / X 시작 전 검토" | `leerness brainstorm "X"` |
379
- | "매 X마다 Y를 해줘" | `leerness rule add "Y" --trigger every-X` |
380
- | "외부 CLI 설정" | `leerness setup-agents` |
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
- `AGENTS.md`에 자동 등록 AI 에이전트가 자연어를 명령으로 변환.
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
- # ❌ npx 캐시로 옛 버전 실행 가능
393
- npx leerness init .
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
- npx leerness@latest init .
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
- npx --yes clear-npx-cache && npx --yes leerness@latest init .
321
+ # Versions
322
+ leerness update --check # detect new version
323
+ leerness update --yes # auto-migrate + verify
400
324
  ```
401
325
 
402
- 1.9.33+ 부터 `leerness init` npm latest와 자동 비교 버전 경고.
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. AI 에이전트 없이 사용 가능한가요?**
412
- A. 네. 1인 개발자도 자기 자신의 작업 검증·기억·중복 감지에 활용 가능. `verify-claim` / `audit` / `reuse-map`은 모두 AI 무관.
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. CI에서 사용 가능?**
415
- A. 네. 모든 명령이 exit code + `--json` 출력 + `--yes` 비대화형 지원. 임의 `LEERNESS_NO_*` env로 prompt 강제 비활성.
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. 외부 AI CLI를 자동 호출하나요?**
418
- A. **절대 아니요.** `agents dispatch`는 명령 텍스트만 생성합니다. 사용자/메인이 명시적으로 spawn.
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. 영어 인스트럭션 옵션 (`--language en`). 도구 출력 메시지/안내는 한국어가 풍부합니다.
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
- ## E2E
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
- npm test # = node ./scripts/e2e.js
351
+ leerness capabilities # capability surface + opt-out + cautious commands (--json supported)
429
352
  ```
430
353
 
431
- **174/174 시나리오** 통과 (1.9.7~1.9.38 회귀 + 신규 검증).
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
- - **1.9.99** **`leerness handoff --quiet` 옵션** — 자동 회수 라인 6종 모두 비활성, 기본 컨텍스트만. CI/자동화용.
438
- - **1.9.98** — **`leerness skill publish` 보안 사전 점검** — `health` 자동 실행, issue 있으면 publish 중단. `--force`/`--no-security-check`로 우회.
439
- - **1.9.97** **자율 모드 27 라운드 마무리** (1.9.70~96) MCP 도구 12→21개, handoff 5단 통합, 보안 3중 가드, JSON 9종, 매 라운드 e2e PASS.
440
- - **1.9.96** **`leerness handoff --json` 옵션** 외부 AI/MCP에 handoff 데이터를 구조화 JSON으로 출력.
441
- - **1.9.95** — **`leerness lessons --json` + MCP lessons 자동 JSON** 외부 AI가 lessons 결과를 파싱 친화적으로 받음.
442
- - **1.9.94** **MCP server 21번째 도구 `leerness_benchmark`** — 1.9.46/51 benchmark를 외부 AI에 노출 (6 차원 점수 + 검수 시나리오 결과).
443
- - **1.9.93** **handoff 헤드라인에 health 종합 상태 1 토큰 추가** — `⚕ health: ✓/⚠` (1.9.81 + 1.9.85 통합, inline 추론으로 성능 비용 없음).
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
- - **이슈**: https://github.com/gugu9999gu/leerness/issues
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
- > 사용자 동의 없이 외부 LLM/API/CLI를 자동 호출하지 않습니다.
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.206 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
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.206는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **42개 도구**를 노출:
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.206)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
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.206: 2026-05-22
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.270';
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.270",
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);