leerness 1.9.163 → 1.9.164

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,54 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.164 — 2026-05-20
4
+
5
+ **`leerness which` 진단 명령 + REPL provider 전환 UX 강화 (사용자 명시 2종).**
6
+
7
+ 자율 모드 94 라운드.
8
+
9
+ ### Added — `leerness which` (사용자 명시: 구버전 충돌 해결)
10
+ 사용자가 "최신 버전 작동 안 함" 의심 시 한 번에 진단:
11
+ - **현재 실행 경로** — `__filename` 그대로 표시 (어떤 leerness 가 실행되는지 정확히)
12
+ - **버전 / Node / Platform**
13
+ - **`npm root -g`** — 글로벌 설치 경로
14
+ - **`npm cache`** — npx 캐싱 디렉토리
15
+ - **글로벌 설치 버전** — `npm ls -g leerness`
16
+ - **PATH 후보** — `where`/`which -a` 결과 (Windows/Unix 자동)
17
+ - **자동 진단** — 글로벌 ≠ 현재 실행 시 ⚠ 경고 + 강제 최신 명령 3종
18
+ - `npx --yes leerness@latest <command>`
19
+ - `npm i -g leerness@latest`
20
+ - `npm cache clean --force`
21
+ - `--json` 옵션 — 구조화 출력
22
+
23
+ ### Added — REPL UX: Ollama 실패 시 다른 CLI 즉시 전환 안내 (사용자 명시)
24
+ - **시작 시**: Ollama 미가동 + 활성 외부 CLI 발견 → 즉시 번호 선택 prompt 추가
25
+ - `1) claude 2) codex ...` 형태로 즉시 전환 가능
26
+ - Enter 누르면 Ollama fallback (기존 동작 유지)
27
+ - **메시지 호출 실패 시**: `:provider claude / :provider codex` 즉시 가이드 1줄 추가
28
+ - 사용자 명시 "모델은 codex cli 같은 에이전트로 간편하게 전환 가능" 해결
29
+
30
+ ### Diagnostic 실제 사용 예시
31
+ ```
32
+ # leerness which (1.9.164)
33
+ 현재 실행: /usr/local/lib/node_modules/leerness/bin/harness.js
34
+ 버전: v1.9.164
35
+ Node: v24.11.1 (linux/x64)
36
+
37
+ ## npm 환경
38
+ 글로벌 설치: leerness@1.9.139 ← 옛 버전!
39
+
40
+ ## ⚠ 진단
41
+ ⚠ 글로벌 설치 1.9.139 ≠ 현재 실행 1.9.164 — npx 캐시 또는 PATH 충돌 의심
42
+ → 강제 최신: npm i -g leerness@latest / 또는 npx --yes leerness@latest <command>
43
+ ```
44
+
45
+ ### Verified
46
+ - e2e 217/217 ✓
47
+ - stress-v109: 16/16 (which 6종 + REPL UX 3종 + 누적 회귀 7종)
48
+ - VERSION = 1.9.164 / autonomous-rounds = 94
49
+
50
+ ---
51
+
3
52
  ## 1.9.163 — 2026-05-20
4
53
 
5
54
  **`leerness health` 에 5능력 매트릭스 자동 평가 통합.**
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **AI 코딩 에이전트의 거짓 완료·중복·망각·충돌을 막아주는 검수·기억·협업 CLI 하네스.**
4
4
 
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.163-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v108-14%2F14-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-50-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-93-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-24_rounds-success)]() [![capability](https://img.shields.io/badge/5_capability_matrix-58%25_beta--ready-yellow)]() [![provider-crud](https://img.shields.io/badge/provider_registry-CRUD%2Bsync-success)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
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.164-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v109-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-50-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-94-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-25_rounds-success)]() [![which-diag](https://img.shields.io/badge/leerness_which-version_conflict_diag-success)]() [![capability](https://img.shields.io/badge/5_capability-58%25_beta--ready-yellow)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,7 +12,7 @@
12
12
  ║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
13
13
  ║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
14
14
  ║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
15
- ║ v1.9.163 AI Agent Reliability Harness + Sandbox ║
15
+ ║ v1.9.164 AI Agent Reliability Harness + Sandbox ║
16
16
  ║ verify · remember · orchestrate · audit · sandbox · drift ║
17
17
  ╚══════════════════════════════════════════════════════════════╝
18
18
  ```
package/bin/harness.js CHANGED
@@ -6,7 +6,7 @@ const path = require('path');
6
6
  const cp = require('child_process');
7
7
  const readline = require('readline');
8
8
 
9
- const VERSION = '1.9.163';
9
+ const VERSION = '1.9.164';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -10769,9 +10769,35 @@ async function _agentRepl(root, opts) {
10769
10769
  state.model = (idx >= 0 && idx < r.models.length) ? r.models[idx] : r.models[0];
10770
10770
  log(C.green(` ✓ 모델 선택: ${state.model}`));
10771
10771
  } else {
10772
- log(C.yel(` ⚠ Ollama 미가동 또는 모델 없음 — ollama serve + ollama pull <model>`));
10773
- state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
10774
- log(C.dim(` fallback: ${state.model}`));
10772
+ log(C.yel(` ⚠ Ollama 미가동 또는 모델 없음`));
10773
+ // 1.9.164: Ollama 실패 시 다른 활성 CLI 즉시 제안 (UX 개선 — 사용자 명시 요청)
10774
+ try {
10775
+ const readyCli = EXTERNAL_AGENTS.filter(a => a.id !== 'ollama')
10776
+ .map(a => ({ def: a, status: _checkAgent(a) }))
10777
+ .filter(x => x.status.status === 'ready');
10778
+ if (readyCli.length) {
10779
+ log('');
10780
+ log(C.cy(` 💡 활성 외부 CLI ${readyCli.length}개 발견 — provider 전환 가능:`));
10781
+ readyCli.forEach((x, i) => log(` ${i + 1}) ${x.def.id} (v${x.status.version || '?'})`));
10782
+ const choice = await new Promise(res => rl.question(C.cy('\n provider 전환 (번호 / Enter=ollama 계속): '), res));
10783
+ const idx = parseInt(choice, 10) - 1;
10784
+ if (idx >= 0 && idx < readyCli.length) {
10785
+ state.provider = readyCli[idx].def.id;
10786
+ state.model = null; // 새 provider 기본 모델 사용
10787
+ log(C.green(` ✓ provider 전환: ${state.provider} (메시지 입력 즉시 사용)`));
10788
+ } else {
10789
+ state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
10790
+ log(C.dim(` ollama fallback: ${state.model} — 추후 :provider <이름> 으로 전환 가능`));
10791
+ }
10792
+ } else {
10793
+ log(C.dim(` ollama serve + ollama pull <model> / 또는 .env 에서 LEERNESS_ENABLE_CLAUDE=1 등 활성화`));
10794
+ state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
10795
+ log(C.dim(` fallback: ${state.model} (실 호출 실패 시 :provider 메뉴 또는 :quit)`));
10796
+ }
10797
+ } catch {
10798
+ state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
10799
+ log(C.dim(` fallback: ${state.model}`));
10800
+ }
10775
10801
  }
10776
10802
  }
10777
10803
  log('');
@@ -10997,6 +11023,17 @@ async function _agentRepl(root, opts) {
10997
11023
  if (state.history.length % 6 === 0) saveSession(); // 6턴마다 자동 저장
10998
11024
  } else {
10999
11025
  log(C.yel(` ⚠ 실패: ${result.error || 'unknown'}`));
11026
+ // 1.9.164: 실패 시 즉시 전환 가능 provider 안내 (UX 개선 — 사용자 명시 요청)
11027
+ try {
11028
+ const others = EXTERNAL_AGENTS.filter(a => a.id !== state.provider)
11029
+ .map(a => ({ def: a, status: _checkAgent(a) }))
11030
+ .filter(x => x.status.status === 'ready');
11031
+ if (others.length) {
11032
+ log(C.dim(` 💡 전환 가능: ${others.map(x => `:provider ${x.def.id}`).join(' / ')}`));
11033
+ } else {
11034
+ log(C.dim(` 💡 다른 provider 활성화: .env 에서 LEERNESS_ENABLE_<CLAUDE|CODEX|GEMINI|COPILOT>=1`));
11035
+ }
11036
+ } catch {}
11000
11037
  }
11001
11038
  rl.prompt();
11002
11039
  });
@@ -11884,8 +11921,88 @@ function reuseAutodetectCmd(root) {
11884
11921
  }
11885
11922
  }
11886
11923
 
11924
+ // 1.9.164: leerness which — 진단 도구 (구버전 충돌 / npx 캐시 / PATH 충돌 해결)
11925
+ // 사용자가 "최신 버전 작동 안 함" 의심 시: 실제 실행 중인 leerness 의 경로 / 버전 / npm 캐시 / PATH 후보 표시.
11926
+ function whichCmd() {
11927
+ const out = {
11928
+ version: VERSION,
11929
+ runningFrom: __filename,
11930
+ nodeVersion: process.version,
11931
+ platform: process.platform,
11932
+ arch: process.arch,
11933
+ npm: {},
11934
+ pathCandidates: []
11935
+ };
11936
+ // npm root -g (글로벌 설치 경로)
11937
+ try {
11938
+ const r = cp.spawnSync('npm', ['root', '-g'], { encoding: 'utf8', timeout: 5000, shell: true });
11939
+ if (r.status === 0) out.npm.globalRoot = (r.stdout || '').trim();
11940
+ } catch {}
11941
+ // npm cache (npx 캐시 경로)
11942
+ try {
11943
+ const r = cp.spawnSync('npm', ['config', 'get', 'cache'], { encoding: 'utf8', timeout: 5000, shell: true });
11944
+ if (r.status === 0) out.npm.cacheDir = (r.stdout || '').trim();
11945
+ } catch {}
11946
+ // npm 글로벌 leerness 설치 정보
11947
+ try {
11948
+ const r = cp.spawnSync('npm', ['ls', '-g', 'leerness', '--depth=0', '--json'], { encoding: 'utf8', timeout: 8000, shell: true });
11949
+ if (r.stdout) {
11950
+ try {
11951
+ const j = JSON.parse(r.stdout);
11952
+ if (j.dependencies?.leerness) out.npm.globalInstalled = j.dependencies.leerness.version;
11953
+ } catch {}
11954
+ }
11955
+ } catch {}
11956
+ // PATH 후보 (Windows: where / Unix: which)
11957
+ try {
11958
+ const isWin = process.platform === 'win32';
11959
+ const tool = isWin ? 'where' : 'which';
11960
+ const r = cp.spawnSync(tool, ['-a', 'leerness'], { encoding: 'utf8', timeout: 5000, shell: true });
11961
+ if (r.stdout) out.pathCandidates = (r.stdout || '').trim().split(/\r?\n/).filter(Boolean);
11962
+ } catch {}
11963
+ // 진단: 글로벌 설치된 leerness 와 현재 실행 버전이 다르면 경고
11964
+ out.diagnostics = [];
11965
+ if (out.npm.globalInstalled && out.npm.globalInstalled !== VERSION) {
11966
+ out.diagnostics.push(`⚠ 글로벌 설치 ${out.npm.globalInstalled} ≠ 현재 실행 ${VERSION} — npx 캐시 또는 PATH 충돌 의심`);
11967
+ out.diagnostics.push(` → 강제 최신: npm i -g leerness@latest / 또는 npx --yes leerness@latest <command>`);
11968
+ }
11969
+ if (out.pathCandidates.length > 1) {
11970
+ out.diagnostics.push(`⚠ PATH 에 leerness 가 ${out.pathCandidates.length}개 — 우선순위 충돌 가능`);
11971
+ out.diagnostics.push(` → 명시적 경로 사용: ${out.runningFrom}`);
11972
+ }
11973
+ if (has('--json')) { log(JSON.stringify(out, null, 2)); return; }
11974
+ log(`# leerness which (1.9.164)`);
11975
+ log(`현재 실행: ${out.runningFrom}`);
11976
+ log(`버전: v${out.version}`);
11977
+ log(`Node: ${out.nodeVersion} (${out.platform}/${out.arch})`);
11978
+ log('');
11979
+ log(`## npm 환경`);
11980
+ if (out.npm.globalRoot) log(` npm root -g: ${out.npm.globalRoot}`);
11981
+ if (out.npm.cacheDir) log(` npm cache: ${out.npm.cacheDir} (npx 옛 버전이 여기 캐싱 — 의심 시 \`npm cache clean --force\`)`);
11982
+ if (out.npm.globalInstalled) log(` 글로벌 설치: leerness@${out.npm.globalInstalled}`);
11983
+ else log(` 글로벌 설치: (없음 — npx 또는 로컬 경로만 사용 중)`);
11984
+ if (out.pathCandidates.length) {
11985
+ log('');
11986
+ log(`## PATH 후보 (${out.pathCandidates.length}개)`);
11987
+ for (const p of out.pathCandidates) log(` - ${p}`);
11988
+ }
11989
+ if (out.diagnostics.length) {
11990
+ log('');
11991
+ log(`## ⚠ 진단`);
11992
+ for (const d of out.diagnostics) log(` ${d}`);
11993
+ } else {
11994
+ log('');
11995
+ log(`✓ 충돌 없음 (현재 실행 버전 = 글로벌 설치 버전)`);
11996
+ }
11997
+ log('');
11998
+ log(`💡 강제 최신 실행 방법:`);
11999
+ log(` 1) npx --yes leerness@latest <command> # npx 캐시 무시하고 최신 다운로드`);
12000
+ log(` 2) npm i -g leerness@latest # 글로벌 설치 갱신`);
12001
+ log(` 3) npm cache clean --force # npx 캐시 강제 비우기 (의심 시)`);
12002
+ }
12003
+
11887
12004
  function help() {
11888
- log(`Leerness v${VERSION}\n\nUsage:\n leerness init [path] [--language auto|ko|en] [--skills recommended|all|a,b]\n leerness migrate [path] [--dry-run] [--force]\n leerness update [path] [--check|--yes|--force|--from <tarball>]\n leerness auto-update install [path]\n leerness status [path]\n leerness verify [path]\n leerness debug [path]\n leerness audit [path]\n leerness check [path]\n leerness scan secrets [path]\n leerness encoding check [path]\n leerness lazy detect [path]\n leerness memory search "query" [--limit 5]\n leerness handoff [path] [--all-apps] [--include p1,p2] [--since 24h|3d] [--compact] [--json] # 1.9.17-22 워크스페이스 (--compact: LLM 시스템 프롬프트용 1줄 요약)\n leerness orchestrate "<목표>" [--agents N] [--model qwen2.5:7b-instruct] [--retry-on-fail K] # 1.9.22 Ollama opt-in (LEERNESS_OLLAMA_BASE_URL 필요)\n leerness llm-bench record --score N --model X [--label L] [--tokens T] # 1.9.22 LLM 벤치 히스토리 누적\n leerness deps <capability> [--run-tests] [--json] # 1.9.24 depends-on 역방향 추적 + 자동 회귀 sweep\n leerness memory search "키" [--include-code] # 1.9.25 소스 코드 본문도 검색 (모순 감지 핵심)\n leerness brainstorm "주제" [--include-code] # 1.9.25 코드 본문 hits 포함\n leerness register-pending "<요청>" [--agent X] [--note Y] # 1.9.25 다중 세션 in-progress 즉시 등록\n leerness optimism-check <T-ID> [--json] # 1.9.26/27 낙관적 표시 감지 (1.9.27: 10 카테고리 + URL/메서드 매핑 + 신뢰도 점수)\n leerness persona list|show <id>|add <id> # 1.9.29 페르소나 카탈로그 (보안/성능/UX/testing/docs 5종 내장)\n leerness review <file> --persona <id1,id2,...> # 1.9.29 도메인 페르소나 리뷰 프롬프트 자동 생성\n leerness agents list|check|quota # 1.9.30/31 외부 AI CLI 가용성 + quota 추정 (claude/codex/gemini/copilot)\n leerness agents dispatch "<task>" --to <id> # 1.9.30 활성 CLI 대상 실행 명령 생성 (실 호출 X, 사용자 실행)\n leerness agents multi "<task>" [--only c1,c2] [--write] [--execute] [--timeout 60] # 1.9.152/156 활성 N개 일괄 dispatch (--execute: 실 spawn + consensus)\n leerness provider list|add|remove [args] # 1.9.157 Provider Registry — 사용자 정의 CLI provider 동적 추가 (OpenRouter/Bedrock 흡수)\n leerness agents dispatch "<task>" --multi # 1.9.152 multi 모드 alias (또는 --to all)\n leerness setup-agents [path] [--yes|--no-setup-agents] # 1.9.32 sub-agent CLI 인터랙티브 설정 (.env + 미설치 자동 설치)\n leerness init [path] [--no-stale-check] # 1.9.33 npx 캐시 함정 — 옛 버전 자동 경고 (끄려면 --no-stale-check)\n leerness contract verify <spec.md> <impl.js> [--json] # 1.9.35 명세 ↔ 구현 일치 검사 (함수/필드)\n leerness reuse autodetect [path] [--apply] [--json] # 1.9.35 src/*.js의 module.exports → reuse-map 후보 등록\n leerness audit [path] [--fix] # 1.9.35 --fix: session-handoff/current-state 자동 갱신\n leerness verify-claim <T-ID> ... [--strict-claims] # 1.9.26 verify-claim에 낙관적 표시 자동 검사 통합\n leerness reuse-map [path] [--all-apps] [--include p1,p2] [--strict-elements] [--json] # 1.9.18 중복/잠재중복/depends-on\n leerness verify-claim <T-ID> [--path .] [--run-tests] [--json] # 1.9.18-20 evidence 자동 검증 (1.9.20: scenes/scripts 등 도메인 폴더 + jest/mocha 파싱)\n leerness verify-code [path] [--build] [--bench] # 1.9.20 --bench: scripts.bench 추가 실행 + evidence 누적\n leerness session close [path]\n leerness route <task-type>\n leerness self check [path]\n leerness readme sync [path]\n leerness consistency check [path]\n leerness consistency merge-design-guide [path]\n leerness plan show|init|add|drop|progress|sync [args]\n leerness task list|add|update|drop|fix-evidence|relink [args]\n leerness skill list|info <name>\n leerness skill learn <id> --doc <url> --command "..." --capability "..." [--note ...]\n leerness skill use <id> [--note ...]\n leerness skill optimize <id> --before "..." --after "..." [--note ...]\n leerness skill remove <id>\n leerness skill consolidate [--threshold 0.3]\n leerness gate [path] # verify+audit+scan+encoding+lazy
12005
+ log(`Leerness v${VERSION}\n\nUsage:\n leerness init [path] [--language auto|ko|en] [--skills recommended|all|a,b]\n leerness migrate [path] [--dry-run] [--force]\n leerness update [path] [--check|--yes|--force|--from <tarball>]\n leerness auto-update install [path]\n leerness status [path]\n leerness verify [path]\n leerness debug [path]\n leerness audit [path]\n leerness check [path]\n leerness scan secrets [path]\n leerness encoding check [path]\n leerness lazy detect [path]\n leerness memory search "query" [--limit 5]\n leerness handoff [path] [--all-apps] [--include p1,p2] [--since 24h|3d] [--compact] [--json] # 1.9.17-22 워크스페이스 (--compact: LLM 시스템 프롬프트용 1줄 요약)\n leerness orchestrate "<목표>" [--agents N] [--model qwen2.5:7b-instruct] [--retry-on-fail K] # 1.9.22 Ollama opt-in (LEERNESS_OLLAMA_BASE_URL 필요)\n leerness llm-bench record --score N --model X [--label L] [--tokens T] # 1.9.22 LLM 벤치 히스토리 누적\n leerness deps <capability> [--run-tests] [--json] # 1.9.24 depends-on 역방향 추적 + 자동 회귀 sweep\n leerness memory search "키" [--include-code] # 1.9.25 소스 코드 본문도 검색 (모순 감지 핵심)\n leerness brainstorm "주제" [--include-code] # 1.9.25 코드 본문 hits 포함\n leerness register-pending "<요청>" [--agent X] [--note Y] # 1.9.25 다중 세션 in-progress 즉시 등록\n leerness optimism-check <T-ID> [--json] # 1.9.26/27 낙관적 표시 감지 (1.9.27: 10 카테고리 + URL/메서드 매핑 + 신뢰도 점수)\n leerness persona list|show <id>|add <id> # 1.9.29 페르소나 카탈로그 (보안/성능/UX/testing/docs 5종 내장)\n leerness review <file> --persona <id1,id2,...> # 1.9.29 도메인 페르소나 리뷰 프롬프트 자동 생성\n leerness agents list|check|quota # 1.9.30/31 외부 AI CLI 가용성 + quota 추정 (claude/codex/gemini/copilot)\n leerness agents dispatch "<task>" --to <id> # 1.9.30 활성 CLI 대상 실행 명령 생성 (실 호출 X, 사용자 실행)\n leerness agents multi "<task>" [--only c1,c2] [--write] [--execute] [--timeout 60] # 1.9.152/156 활성 N개 일괄 dispatch (--execute: 실 spawn + consensus)\n leerness provider list|add|remove [args] # 1.9.157 Provider Registry — 사용자 정의 CLI provider 동적 추가 (OpenRouter/Bedrock 흡수)\n leerness agents dispatch "<task>" --multi # 1.9.152 multi 모드 alias (또는 --to all)\n leerness setup-agents [path] [--yes|--no-setup-agents] # 1.9.32 sub-agent CLI 인터랙티브 설정 (.env + 미설치 자동 설치)\n leerness init [path] [--no-stale-check] # 1.9.33 npx 캐시 함정 — 옛 버전 자동 경고 (끄려면 --no-stale-check)\n leerness which [--json] # 1.9.164 진단: 현재 실행 경로/버전 + npm 캐시 + PATH 후보 (구버전 충돌 해결)\n leerness contract verify <spec.md> <impl.js> [--json] # 1.9.35 명세 ↔ 구현 일치 검사 (함수/필드)\n leerness reuse autodetect [path] [--apply] [--json] # 1.9.35 src/*.js의 module.exports → reuse-map 후보 등록\n leerness audit [path] [--fix] # 1.9.35 --fix: session-handoff/current-state 자동 갱신\n leerness verify-claim <T-ID> ... [--strict-claims] # 1.9.26 verify-claim에 낙관적 표시 자동 검사 통합\n leerness reuse-map [path] [--all-apps] [--include p1,p2] [--strict-elements] [--json] # 1.9.18 중복/잠재중복/depends-on\n leerness verify-claim <T-ID> [--path .] [--run-tests] [--json] # 1.9.18-20 evidence 자동 검증 (1.9.20: scenes/scripts 등 도메인 폴더 + jest/mocha 파싱)\n leerness verify-code [path] [--build] [--bench] # 1.9.20 --bench: scripts.bench 추가 실행 + evidence 누적\n leerness session close [path]\n leerness route <task-type>\n leerness self check [path]\n leerness readme sync [path]\n leerness consistency check [path]\n leerness consistency merge-design-guide [path]\n leerness plan show|init|add|drop|progress|sync [args]\n leerness task list|add|update|drop|fix-evidence|relink [args]\n leerness skill list|info <name>\n leerness skill learn <id> --doc <url> --command "..." --capability "..." [--note ...]\n leerness skill use <id> [--note ...]\n leerness skill optimize <id> --before "..." --after "..." [--note ...]\n leerness skill remove <id>\n leerness skill consolidate [--threshold 0.3]\n leerness gate [path] # verify+audit+scan+encoding+lazy
11889
12006
  leerness retro [path] [--days 7] [--all-apps] [--include p1,p2] [--json] # 회고 (1.9.13~1.9.16)
11890
12007
  leerness insights [path] [--all-apps] [--include p1,p2] [--json] # 누적 통계 (1.9.13~1.9.16)
11891
12008
  leerness brainstorm "<주제>" [--all-apps] [--include p1,p2] [--json] # 브레인스토밍 (1.9.13~1.9.16)
@@ -11959,6 +12076,8 @@ async function main() {
11959
12076
  if (cmd === 'agents') return agentsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
11960
12077
  // 1.9.157: Provider Registry — 사용자 정의 provider 동적 추가
11961
12078
  if (cmd === 'provider') return providerCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
12079
+ // 1.9.164: leerness which — 진단 도구 (구버전 충돌 / npx 캐시 / PATH 후보)
12080
+ if (cmd === 'which') return whichCmd();
11962
12081
  if (cmd === 'contract' && args[1] === 'verify') return contractVerifyCmd(args[2], args[3]);
11963
12082
  if (cmd === 'drift' && (args[1] === 'check' || !args[1])) return driftCheckCmd(args[2] || arg('--path', process.cwd()));
11964
12083
  if (cmd === 'usage' && (args[1] === 'stats' || !args[1])) return usageStatsCmd(args[2] || arg('--path', process.cwd()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.163",
3
+ "version": "1.9.164",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",