leerness 1.9.232 β†’ 1.9.234

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,74 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.234 β€” 2026-05-23
4
+
5
+ **πŸ“œ handoff/session close/health --json recentChanges 톡합 (8 ν•„λ“œ μ™„μ„±) β€” μ™ΈλΆ€ AI 졜근 5 λΌμš΄λ“œ μ¦‰μ‹œ 인지.**
6
+
7
+ ### 1. handoff/session close/health --json 8번째 톡합 ν•„λ“œ `recentChanges`
8
+ - git tag 기반 졜근 5 λΌμš΄λ“œμ˜ 핡심 λ³€κ²½ μžλ™ 회수
9
+ - ν˜•μ‹: `[{ version, date, subject }]` (κ°€μž₯ μ΅œκ·ΌλΆ€ν„°)
10
+ - AI κ°€ "졜근 무엇이 λ°”λ€Œμ—ˆλ‚˜?"λ₯Ό 단일 호좜둜 인지 β†’ μ»¨ν…μŠ€νŠΈ μ ˆμ•½
11
+ - 1.9.218 (4 ν•„λ“œ) β†’ 1.9.223 (5) β†’ 1.9.227 (6) β†’ 1.9.230 (7) β†’ 1.9.234 (**8 ν•„λ“œ**)
12
+
13
+ ### 2. 3 λͺ…λ Ή 일관성 맀트릭슀 β€” 3 Γ— 8 = 24 톡합 포인트
14
+ - handoff/session close/health 동일 ν˜•μ‹ + 동일 κ²°κ³Ό
15
+ - μ™ΈλΆ€ μžλ™ν™”/CI μ–΄λŠ λͺ…λ ΉμœΌλ‘œ μ‘°νšŒν•΄λ„ 동일 응닡
16
+
17
+ ### 3. AI 인지 λΉ„μš© 절감
18
+ - κΈ°μ‘΄: AI κ°€ CHANGELOG.md 읽기 β†’ 토큰 λ‹€λŸ‰ μ†ŒλΉ„
19
+ - 1.9.234: handoff --json ν•œ λ²ˆμ— 졜근 5 λΌμš΄λ“œ μžλ™ 회수 β†’ ~500 토큰 μ ˆμ•½
20
+
21
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~233) β€” λͺ¨λ‘ μœ μ§€
22
+
23
+ ### 5. stress-v179 β€” 17/17 PASS
24
+ - 1.9.234 (7): VERSION + handoff/session close/health JSON + 3 λͺ…λ Ή 일관성 + 8 ν•„λ“œ 검증 + ν˜•νƒœ 검증
25
+ - μ„±λŠ₯ (2): cold_start avg 376ms / handoff --json (8 ν•„λ“œ) 1109ms
26
+ - λˆ„μ  νšŒκ·€ (8): 1.9.207~233
27
+
28
+ ### 6. μžλ™ release (96 λΌμš΄λ“œ main-push streak Β· 57 λΌμš΄λ“œ npm publish streak)
29
+
30
+ πŸ“œ **JSON 톡합 맀트릭슀 8 ν•„λ“œ μ™„μ„±** β€” μ™ΈλΆ€ AI κ°€ leerness μƒνƒœ + 졜근 λ³€κ²½ λͺ¨λ‘ ν•œ λ²ˆμ— 회수
31
+
32
+ ---
33
+
34
+ ## 1.9.233 β€” 2026-05-23
35
+
36
+ **πŸ“š leerness commands μƒˆ λͺ…λ Ή (9 μΉ΄ν…Œκ³ λ¦¬ 51 CLI) + MCP 65번째 도ꡬ.**
37
+
38
+ ### 1. `leerness commands` μƒˆ λͺ…λ Ή β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ©λ‘
39
+ - **9 μΉ΄ν…Œκ³ λ¦¬ Β· 51 λͺ…λ Ή** ν•œ λˆˆμ—:
40
+ - status (8) β€” handoff/health/pulse/round-history/milestones/session-resume/which/memory status
41
+ - task (5) β€” add/update/drop/export + next-action
42
+ - memory (4) β€” decision/rule/plan/lesson CRUD
43
+ - audit (10) β€” audit/drift/scan secrets/encoding/lazy/verify-claim/optimism/requests/pre-wake/idempotency
44
+ - workflow (7) β€” session close/resume/route/agents/review-request/review/brainstorm
45
+ - release (3) β€” sync-main/pack/publish
46
+ - skill (2) β€” list/info/learn/use/optimize/match/suggest + install/install-top/publish/search/discover
47
+ - bridge (3) β€” web/pc/lsp
48
+ - config (9) β€” init/migrate/update/wakeup-interval/workspace-dir/intent/constraints/provider/commands
49
+ - `--json` μ˜΅μ…˜ (μ™ΈλΆ€ μžλ™ν™”)
50
+
51
+ ### 2. MCP 65번째 도ꡬ β€” `leerness_commands`
52
+ - μ™ΈλΆ€ AI κ°€ 전체 CLI λͺ©λ‘μ„ 직접 회수 β†’ 맀뉴얼/도움말 동적 생성
53
+ - MCP 64 β†’ 65 (+1)
54
+
55
+ ### 3. μ‹€ μΈ‘μ • β€” leerness 전체 ν‘œλ©΄ κ°€μ‹œν™”
56
+ - 9 μΉ΄ν…Œκ³ λ¦¬ Γ— 평균 5.7 λͺ…λ Ή = **51 CLI λͺ…λ Ή**
57
+ - handoff/health/pulse λ“± 핡심 status λͺ…령은 status μΉ΄ν…Œκ³ λ¦¬μ— κ·Έλ£Ήν™”
58
+
59
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~232) β€” λͺ¨λ‘ μœ μ§€
60
+
61
+ ### 5. stress-v178 β€” 16/16 PASS
62
+ - 1.9.233 (6): VERSION + CLI + --json μΉ΄ν…Œκ³ λ¦¬ 검증 + human 좜λ ₯ + MCP 65 + μ‹€ 호좜
63
+ - μ„±λŠ₯ (2): cold_start avg 413ms / commands 390ms (정적 데이터, 빠름)
64
+ - λˆ„μ  νšŒκ·€ (8): 1.9.207~232
65
+
66
+ ### 6. μžλ™ release (95 λΌμš΄λ“œ main-push streak Β· 56 λΌμš΄λ“œ npm publish streak)
67
+
68
+ πŸ“š **전체 ν‘œλ©΄ κ°€μ‹œν™”** β€” 9 μΉ΄ν…Œκ³ λ¦¬ Γ— 51 CLI Γ— 65 MCP 도ꡬ ν•œλˆˆμ—
69
+
70
+ ---
71
+
3
72
  ## 1.9.232 β€” 2026-05-23
4
73
 
5
74
  **πŸ› pulse memorySurface BUG fix + handoff --pulse μ˜΅μ…˜ + session close μžλ™ pulse.**
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.232-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v177-13%2F13-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-64-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-188-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-94_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![bugfix](https://img.shields.io/badge/πŸ›_pulse-BUG_fix-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-389ms-success)]() [![install](https://img.shields.io/badge/npm_i_leerness-μ¦‰μ‹œ_μ‚¬μš©_κ°€λŠ₯-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.234-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v179-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-65-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-51-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-190-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-96_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![json-8fields](https://img.shields.io/badge/πŸ“œ_JSON_톡합-8%2F8_ν•„λ“œ-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-376ms-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,9 +12,9 @@
12
12
  β•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β•β•β–ˆβ–ˆβ•‘ β•‘
13
13
  β•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β•‘
14
14
  β•‘ β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β• β•‘
15
- β•‘ v1.9.232 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.234 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ› pulse BUG fix Β· handoff --pulse Β· session close μžλ™ β•‘
17
+ β•‘ πŸ“œ JSON 8 ν•„λ“œ μ™„μ„± (3 λͺ…λ Ή Γ— 8 = 24 톡합 포인트) β•‘
18
18
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
19
19
  ```
20
20
 
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.232';
10
+ const VERSION = '1.9.234';
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 처리).
@@ -2196,6 +2196,36 @@ function milestonesCmd(root) {
2196
2196
  }
2197
2197
  }
2198
2198
 
2199
+ // 1.9.234: recentChanges β€” 졜근 N λΌμš΄λ“œμ˜ 핡심 λ³€κ²½ μš”μ•½ (git tag commit subject)
2200
+ // 응닡: [{ version, date, subject }] (κ°€μž₯ μ΅œκ·ΌλΆ€ν„°)
2201
+ function _computeRecentChanges(root, limit = 5) {
2202
+ const items = [];
2203
+ try {
2204
+ const r = cp.spawnSync('git', ['log', '--tags', '--simplify-by-decoration', '--pretty=format:%H|%D|%ad|%s', '--date=short', '-n', String(limit * 3)], {
2205
+ cwd: root, encoding: 'utf8', timeout: 5000
2206
+ });
2207
+ if (r.status !== 0 || !r.stdout) return items;
2208
+ const lines = r.stdout.split('\n').filter(l => l.trim());
2209
+ for (const line of lines) {
2210
+ const idx1 = line.indexOf('|');
2211
+ if (idx1 < 0) continue;
2212
+ const idx2 = line.indexOf('|', idx1 + 1);
2213
+ const idx3 = line.indexOf('|', idx2 + 1);
2214
+ if (idx2 < 0 || idx3 < 0) continue;
2215
+ const refs = line.slice(idx1 + 1, idx2);
2216
+ const date = line.slice(idx2 + 1, idx3);
2217
+ const subject = line.slice(idx3 + 1);
2218
+ const m = refs.match(/tag: v(\d+\.\d+\.\d+)/);
2219
+ if (!m) continue;
2220
+ const version = m[1];
2221
+ const cleanSubject = subject.replace(/^\d+\.\d+\.\d+\s*[β€”-]\s*/, '').trim();
2222
+ items.push({ version, date, subject: cleanSubject.slice(0, 100) });
2223
+ if (items.length >= limit) break;
2224
+ }
2225
+ } catch {}
2226
+ return items;
2227
+ }
2228
+
2199
2229
  // 1.9.231: leerness pulse β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ)
2200
2230
  // handoff ν—€λ“œλΌμΈμ˜ μΆ•μ•½ 버전 β€” μ‚¬μš©μžκ°€ λΉ λ₯΄κ²Œ μƒνƒœ νŒŒμ•…
2201
2231
  // 응닡 (--json): { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormal }
@@ -2278,6 +2308,114 @@ function pulseCmd(root) {
2278
2308
  log(dm(` β†’ 상세: leerness handoff . | health . | round-history | milestones`));
2279
2309
  }
2280
2310
 
2311
+ // 1.9.233: leerness commands β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
2312
+ // λŒ€ν™”/AI/MCP/CI κ°€ λΉ λ₯΄κ²Œ 전체 κΈ°λŠ₯을 νŒŒμ•…ν•  수 μžˆλ„λ‘.
2313
+ // μΉ΄ν…Œκ³ λ¦¬: status (handoff/health/pulse/round-history/milestones/session-resume/which/memory status)
2314
+ // task (task add/update/drop/export/sync)
2315
+ // memory (decision/rule/plan/lesson add/list/drop)
2316
+ // workflow (route/agents/orchestrate/review/persona)
2317
+ // release (release pack/bump/note/publish/sync-main)
2318
+ // audit (audit/scan secrets/encoding check/drift check/optimism-check/verify-claim/lazy detect)
2319
+ // skill (skill list/info/learn/use/optimize/match/suggest/install/publish/discover)
2320
+ // bridge (web/pc/lsp β€” opt-in)
2321
+ // config (init/migrate/update/auto-update/setup-agents/install/workspace-dir/wakeup-interval)
2322
+ // advanced (intent/requests/constraints/pre-wake-audit/idempotency/round-history/milestones/pulse)
2323
+ function commandsCmd(root) {
2324
+ const isTty = process.stdout && process.stdout.isTTY;
2325
+ const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
2326
+ const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
2327
+ const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
2328
+ const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
2329
+ const cats = {
2330
+ status: [
2331
+ { cmd: 'handoff [path] [--json] [--pulse] [--compact] [--quiet]', desc: 'μ„Έμ…˜ μ‹œμž‘ μ»¨ν…μŠ€νŠΈ + 7 톡합 ν•„λ“œ' },
2332
+ { cmd: 'health [path] [--json] [--strict]', desc: 'μ’…ν•© ν—¬μŠ€ + drift/security/skill/memory/featureGraph/roundHistory/milestones' },
2333
+ { cmd: 'pulse [path] [--json]', desc: 'ν•œ 쀄 μ’…ν•© μš”μ•½ (1.9.231)' },
2334
+ { cmd: 'round-history [path] [--json]', desc: 'git tag 기반 자율 λΌμš΄λ“œ 톡계 (1.9.226)' },
2335
+ { cmd: 'milestones [path] [--json]', desc: '도달 λ§ˆμΌμŠ€ν†€ + λ‹€μŒ ETA (1.9.229)' },
2336
+ { cmd: 'session-resume [path] [--auto-fix] [--json]', desc: '비정상 μ’…λ£Œ 감지 + 자율 재개 (1.9.220/222)' },
2337
+ { cmd: 'which', desc: 'ν™œμ„± provider + 경둜 진단' },
2338
+ { cmd: 'memory status [path] [--json]', desc: 'T/D/R/P/L Memory Surface (1.9.114)' }
2339
+ ],
2340
+ task: [
2341
+ { cmd: 'task add "<request>"', desc: 'task μΆ”κ°€ (μžλ™ dedup 1.9.212, review trigger 1.9.177)' },
2342
+ { cmd: 'task update <id> --status <S>', desc: 'task μƒνƒœ κ°±μ‹ ' },
2343
+ { cmd: 'task drop <id>', desc: 'task λ“œλ‘­' },
2344
+ { cmd: 'task export --to <path>', desc: 'TodoWrite JSON ν˜•μ‹ export (1.9.60)' },
2345
+ { cmd: 'next-action take|list [--json]', desc: 'next-action queue (1.9.201)' }
2346
+ ],
2347
+ memory: [
2348
+ { cmd: 'decision add|list|drop <id>', desc: 'decisions.md CRUD (1.9.108/118/125)' },
2349
+ { cmd: 'rule add|list|pause|resume|remove', desc: 'rules.md CRUD (1.9.8/109)' },
2350
+ { cmd: 'plan add|list <M-id>', desc: 'plan.md milestone CRUD (1.9.110/119)' },
2351
+ { cmd: 'lesson save|list|drop', desc: 'lessons.md CRUD (1.9.112/117/124)' }
2352
+ ],
2353
+ audit: [
2354
+ { cmd: 'audit [path] [--fix] [--strict] [--json]', desc: '메타 + λ³΄μ•ˆ + npm CVE 톡합 감사' },
2355
+ { cmd: 'drift check [path] [--auto-fix] [--json]', desc: 'drift μ‹ ν˜Έ + μžλ™ 회볡 (1.9.37/82/225)' },
2356
+ { cmd: 'scan secrets [path]', desc: 'μ‹œν¬λ¦Ώ 탐지' },
2357
+ { cmd: 'encoding check [path]', desc: '인코딩 검증' },
2358
+ { cmd: 'lazy detect [path] [--json]', desc: '게으λ₯Έ μž‘μ—… 감지 (1.9.101)' },
2359
+ { cmd: 'verify-claim <T-ID> [--run-tests] [--strict-claims]', desc: 'μ£Όμž₯ 검증 (1.9.18~26)' },
2360
+ { cmd: 'optimism-check <T-ID>', desc: '낙관적 API 감지 (1.9.26)' },
2361
+ { cmd: 'requests audit|list|complete|drop|auto-complete', desc: 'μ‚¬μš©μž μš”μ²­ 좔적 (1.9.207/223)' },
2362
+ { cmd: 'pre-wake-audit [path] [--last]', desc: 'sleep μ „ 점검 (1.9.209)' },
2363
+ { cmd: 'idempotency audit', desc: 'λ©±λ“±μ„± μœ„λ°˜ 탐지 (1.9.212)' }
2364
+ ],
2365
+ workflow: [
2366
+ { cmd: 'session close [path] [--json] [--auto-apply-delivered]', desc: 'μ„Έμ…˜ 마감 + 9 μΉ΄ν…Œκ³ λ¦¬ + μžλ™ 톡합' },
2367
+ { cmd: 'resume [path]', desc: 'auto-resume-plan 적용 (1.9.203)' },
2368
+ { cmd: 'route <task-type>', desc: 'μž‘μ—… μœ ν˜• λΆ„λ₯˜ (11μ’…)' },
2369
+ { cmd: 'agents list|check|quota|dispatch|multi', desc: 'μ™ΈλΆ€ AI CLI μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜' },
2370
+ { cmd: 'review-request "<request>"', desc: 'μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (1.9.176)' },
2371
+ { cmd: 'review <file> --persona <ids>', desc: '페λ₯΄μ†Œλ‚˜ 리뷰 (1.9.29)' },
2372
+ { cmd: 'brainstorm "<topic>" [--include-code]', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 회수 + μ½”λ“œ grep' }
2373
+ ],
2374
+ release: [
2375
+ { cmd: 'release sync-main [path]', desc: 'main merge + push + μžλ™ npm publish (1.9.140/178)' },
2376
+ { cmd: 'release pack', desc: 'tarball 생성' },
2377
+ { cmd: 'release publish', desc: 'GitHub release λ°œν–‰' }
2378
+ ],
2379
+ skill: [
2380
+ { cmd: 'skill list|info|learn|use|optimize|match|suggest', desc: 'skill μΉ΄νƒˆλ‘œκ·Έ CRUD' },
2381
+ { cmd: 'skill install|install-top|publish|search|discover', desc: 'skill 배포 + 검색' }
2382
+ ],
2383
+ bridge: [
2384
+ { cmd: 'web check|screenshot|extract <url>', desc: 'playwright bridge (opt-in, 1.9.165)' },
2385
+ { cmd: 'pc check|click|type|screenshot', desc: 'robotjs/nut-tree bridge (opt-in, 1.9.166)' },
2386
+ { cmd: 'lsp check|symbols|references', desc: 'LSP μ–΄λŒ‘ν„° (1.9.167)' }
2387
+ ],
2388
+ config: [
2389
+ { cmd: 'init [path]', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ΄ˆκΈ°ν™”' },
2390
+ { cmd: 'migrate [path] [--dry-run]', desc: 'μ—…λ°μ΄νŠΈ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜' },
2391
+ { cmd: 'update [--check|--yes|--force]', desc: 'μžκ°€ μ—…λ°μ΄νŠΈ' },
2392
+ { cmd: 'wakeup-interval get|set|auto|history|record', desc: 'adaptive wakeup (1.9.210)' },
2393
+ { cmd: 'workspace-dir get|guide', desc: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 디렉토리 (1.9.211)' },
2394
+ { cmd: 'intent classify|expand|domains "<request>"', desc: 'μ˜λ„ νŒŒμ•… + scope (1.9.213)' },
2395
+ { cmd: 'constraints list|check|add', desc: 'ν”Œλž«νΌ/API μ œμ•½ (1.9.208)' },
2396
+ { cmd: 'provider list|add|remove|sync', desc: 'Provider Registry (1.9.157~160)' },
2397
+ { cmd: 'commands [--json]', desc: '전체 λͺ…λ Ή μΉ΄ν…Œκ³ λ¦¬ λͺ©λ‘ (1.9.233)' }
2398
+ ]
2399
+ };
2400
+ if (has('--json')) {
2401
+ log(JSON.stringify({ version: VERSION, totalCommands: Object.values(cats).reduce((s, a) => s + a.length, 0), categories: cats }, null, 2));
2402
+ return;
2403
+ }
2404
+ log(cy(`# leerness commands (1.9.233) β€” 전체 CLI λͺ…λ Ή μΉ΄ν…Œκ³ λ¦¬ λͺ©λ‘`));
2405
+ log('');
2406
+ for (const [catName, list] of Object.entries(cats)) {
2407
+ log(gr(`## ${catName} (${list.length}개)`));
2408
+ list.forEach(c => {
2409
+ log(` β€’ ${c.cmd}`);
2410
+ log(dm(` ${c.desc}`));
2411
+ });
2412
+ log('');
2413
+ }
2414
+ log(dm(` β†’ 총 ${Object.values(cats).reduce((s, a) => s + a.length, 0)} λͺ…λ Ή (9 μΉ΄ν…Œκ³ λ¦¬)`));
2415
+ log(dm(` β†’ MCP 도ꡬ: 65 (μ™ΈλΆ€ AI λ…ΈμΆœ)`));
2416
+ log(dm(` β†’ λΉ λ₯Έ μ‹œμž‘: leerness pulse | handoff | health`));
2417
+ }
2418
+
2281
2419
  function roundHistoryCmd(root) {
2282
2420
  root = absRoot(root);
2283
2421
  const isTty = process.stdout && process.stdout.isTTY;
@@ -6098,6 +6236,10 @@ function handoff(root) {
6098
6236
  avgRoundsPerDay: ms.avgRoundsPerDay
6099
6237
  };
6100
6238
  } catch {}
6239
+ // 1.9.234: recentChanges 톡합 (handoff JSON 8번째 톡합 ν•„λ“œ) β€” 졜근 5 λΌμš΄λ“œ λ³€κ²½ μš”μ•½
6240
+ try {
6241
+ result.recentChanges = _computeRecentChanges(root, 5);
6242
+ } catch {}
6101
6243
  } catch {}
6102
6244
  try {
6103
6245
  const pwState = _loadPreWakeReport(root);
@@ -10257,6 +10399,10 @@ function sessionClose(root, opts = {}) {
10257
10399
  avgRoundsPerDay: ms.avgRoundsPerDay
10258
10400
  };
10259
10401
  } catch {}
10402
+ // 1.9.234: recentChanges 톡합 (session close JSON 8번째 톡합 ν•„λ“œ) β€” 졜근 5 λΌμš΄λ“œ λ³€κ²½
10403
+ try {
10404
+ jsonResult.recentChanges = _computeRecentChanges(root, 5);
10405
+ } catch {}
10260
10406
  } catch {}
10261
10407
  try {
10262
10408
  // 1.9.209: pre-wake-audit μžλ™ μ‹€ν–‰ + μ €μž₯ (sleep μ „ μžλ™ 점검)
@@ -14232,7 +14378,8 @@ function mcpServeCmd(root) {
14232
14378
  { name: 'leerness_requests_auto_complete', description: '1.9.224 (1.9.223 μžλ™ 회수) β€” delivered νŒ¨ν„΄ μžλ™ 감지 + μžλ™ μ™„λ£Œ. "Round X.Y.Z β€” κ΅¬ν˜„ μ™„λ£Œ" / "implemented" / "delivered" νŒ¨ν„΄μ΄ μžˆλŠ” open μš”μ²­ 쀑 ν˜„μž¬ 버전 μ΄ν•˜μΈ 것을 ν›„λ³΄λ‘œ λΆ„λ₯˜. 응닡: { total, candidates: [{id, text, claimedVersion, currentVersion, deliveredKeyword, recordedAt}], currentVersion, applied (apply=true μ‹œ), completedIds[] }. μ™ΈλΆ€ AIκ°€ "운영 λˆ„μ λœ κ°€μ§œ λ―Έλ‹΅ μ‹ ν˜Έ 정리 κ°€λŠ₯ν•œκ°€?"λ₯Ό 회수. κΈ°λ³Έ dry-run, apply: true λͺ…μ‹œ μ‹œμ—λ§Œ μ‹€ 적용. 인자: { path?, apply? (default false) }', inputSchema: { type: 'object', properties: { path: { type: 'string' }, apply: { type: 'boolean' } } } },
14233
14379
  { name: 'leerness_round_history', description: '1.9.226 β€” 자율 λΌμš΄λ“œ 톡계. git tag v1.9.X 기반 λˆ„μ  λΌμš΄λ“œ 카운트 + λ‹€μŒ λ§ˆμΌμŠ€ν†€ (50/75/100/125/150/175/200/250/300/400/500) + 평균 rounds/day. 응닡: { currentVersion, roundCount, baselineVersion, latestTags[], nextMilestone, roundsToNextMilestone, firstTagAt, latestTagAt, daysActive, avgRoundsPerDay }. μ™ΈλΆ€ AIκ°€ "이 ν”„λ‘œμ νŠΈλŠ” μ–Όλ§ˆλ‚˜ 진행됐고 λ‹€μŒ λ§ˆμΌμŠ€ν†€κΉŒμ§€ λͺ‡ λΌμš΄λ“œ λ‚¨μ•˜λ‚˜?"λ₯Ό 회수. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14234
14380
  { name: 'leerness_milestones', description: '1.9.229 (1.9.226 ν™•μž₯) β€” 도달 λ§ˆμΌμŠ€ν†€ + λ‹€μŒ ETA. git tag 순차 λΆ„μ„μœΌλ‘œ 25/50/75/100/125/150/175/200/250/300/400/500 λ§ˆμΌμŠ€ν†€ 도달 일자 + λ‹€μŒ λ§ˆμΌμŠ€ν†€ ETA (ν˜„μž¬ 속도 κΈ°μ€€) 계산. 응닡: { totalRounds, reached: [{milestone, version, reachedAt, daysFromBaseline}], next: {milestone, roundsRemaining, etaDays, etaDate}, baselineAt, avgRoundsPerDay }. μ™ΈλΆ€ AIκ°€ "μ§€κΈˆκΉŒμ§€ μ–΄λ–€ λ§ˆμΌμŠ€ν†€μ„ μ–Έμ œ λ‹¬μ„±ν–ˆκ³  λ‹€μŒ λ§ˆμΌμŠ€ν†€ μ˜ˆμƒ 도달일은?"을 회수. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14235
- { name: 'leerness_pulse', description: '1.9.231 β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ). 응닡: { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }. μ™ΈλΆ€ AIκ°€ "leerness μƒνƒœ ν•œ λˆˆμ— 보기"λ₯Ό κ°€λ²Όμš΄ 단일 호좜둜 회수. handoff 보닀 5λ°° 빠름 (drift/health 계산 skip). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
14381
+ { name: 'leerness_pulse', description: '1.9.231 β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ). 응닡: { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }. μ™ΈλΆ€ AIκ°€ "leerness μƒνƒœ ν•œ λˆˆμ— 보기"λ₯Ό κ°€λ²Όμš΄ 단일 호좜둜 회수. handoff 보닀 5λ°° 빠름 (drift/health 계산 skip). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
14382
+ { name: 'leerness_commands', description: '1.9.233 β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘ (9 μΉ΄ν…Œκ³ λ¦¬). 응닡: { version, totalCommands, categories: { status, task, memory, audit, workflow, release, skill, bridge, config } }. μ™ΈλΆ€ AIκ°€ "leerness κ°€ μ œκ³΅ν•˜λŠ” λͺ…령이 뭐가 μžˆλ‚˜"λ₯Ό 직접 회수. 맀뉴얼/도움말 동적 생성. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
14236
14383
  ];
14237
14384
 
14238
14385
  function send(obj) {
@@ -14405,6 +14552,10 @@ function mcpServeCmd(root) {
14405
14552
  // 1.9.231: ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ)
14406
14553
  cliArgs = ['pulse', '--path', targetPath, '--json'];
14407
14554
  break;
14555
+ case 'leerness_commands':
14556
+ // 1.9.233: μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
14557
+ cliArgs = ['commands', '--json'];
14558
+ break;
14408
14559
  default:
14409
14560
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
14410
14561
  }
@@ -16625,6 +16776,10 @@ function healthCmd(root) {
16625
16776
  avgRoundsPerDay: ms.avgRoundsPerDay
16626
16777
  };
16627
16778
  } catch { out.milestones = { error: 'milestones 점검 μ‹€νŒ¨' }; }
16779
+ // 1.9.234: health --json recentChanges 톡합 (3 λͺ…λ Ή 8 ν•„λ“œ 일관성)
16780
+ try {
16781
+ out.recentChanges = _computeRecentChanges(root, 5);
16782
+ } catch { out.recentChanges = { error: 'recentChanges 점검 μ‹€νŒ¨' }; }
16628
16783
  // 1.9.163: 5λŠ₯λ ₯ 맀트릭슀 μžλ™ 평가 (1.9.155 sub-agent 점검 β†’ μ½”λ“œ 기반 μžλ™ν™”)
16629
16784
  // 각 λŠ₯λ ₯을 μ½”λ“œ grep 으둜 κ²€μΆœ β†’ 0~100 점수. μ‚¬μš©μžκ°€ λ§€ health 호좜 μ‹œ leerness 자기 평가 확인.
16630
16785
  try {
@@ -18064,6 +18219,8 @@ async function main() {
18064
18219
  if (cmd === 'milestones') return milestonesCmd(arg('--path', process.cwd()));
18065
18220
  // 1.9.231: leerness pulse β€” ν•œ 쀄 μ’…ν•© μš”μ•½ (10 핡심 μ§€ν‘œ)
18066
18221
  if (cmd === 'pulse') return pulseCmd(arg('--path', process.cwd()));
18222
+ // 1.9.233: leerness commands β€” μΉ΄ν…Œκ³ λ¦¬ν™”λœ 전체 CLI λͺ…λ Ή λͺ©λ‘
18223
+ if (cmd === 'commands') return commandsCmd(arg('--path', process.cwd()));
18067
18224
  // 1.9.208: leerness constraints <list|check|add> β€” ν”Œλž«νΌ/API μ œμ•½ 사전 체크 (μ‚¬μš©μž λͺ…μ‹œ)
18068
18225
  if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
18069
18226
  // 1.9.209: leerness pre-wake-audit β€” sleep μ „ sub-agent audit (μ‚¬μš©μž λͺ…μ‹œ)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.232",
3
+ "version": "1.9.234",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",