leerness 1.9.214 β†’ 1.9.216

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,75 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.216 β€” 2026-05-22
4
+
5
+ **πŸ”Œ MCP 5μ’… μΆ”κ°€ β€” 1.9.207~213 μ™ΈλΆ€ AI λ…ΈμΆœ (54 β†’ 59 도ꡬ).**
6
+
7
+ > 백둜그 μ†Œμ§„ ν›„ μ™ΈλΆ€ AI 톡합 κ°€μΉ˜ κ°•ν™” β€” Claude/Codex/Gemini 등이 μ‹ κ·œ 7 λΌμš΄λ“œ κΈ°λŠ₯을 직접 호좜 κ°€λŠ₯
8
+
9
+ ### 1. MCP μ‹ κ·œ 5μ’… (1.9.216 라벨)
10
+ | 도ꡬ | 좜처 | 인자 |
11
+ |---|---|---|
12
+ | `leerness_requests_audit` | 1.9.207 | `{ path? }` β†’ missing/tracked/stale 회수 |
13
+ | `leerness_constraints_check` | 1.9.208 | `{ request, path? }` β†’ ν”Œλž«νΌ alias λ§€μΉ­ |
14
+ | `leerness_pre_wake_audit` | 1.9.209 | `{ path? }` β†’ 6μ˜μ—­ audit |
15
+ | `leerness_intent_classify` | 1.9.213 | `{ request, path? }` β†’ intent + 도메인 + dry-run ν™•μž₯ |
16
+ | `leerness_idempotency_audit` | 1.9.212 | `{ path? }` β†’ 4μ˜μ—­ λ©±λ“±μ„± 검사 |
17
+
18
+ ### 2. 5μΆ• 맀트릭슀 BμΆ• (λ©€ν‹° Sub-Agent) κ°€μΉ˜ κ°•ν™”
19
+ - μ™ΈλΆ€ AI κ°€ leerness 의 7 λΌμš΄λ“œ μ‹ κ·œ κΈ°λŠ₯을 MCP 둜 직접 호좜
20
+ - Claude Desktop / Cursor / Codex CLI λ“±μ—μ„œ leerness MCP server 등둝 β†’ μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯
21
+ - "μ‚¬μš©μžκ°€ ν–ˆλ˜ μš”μ²­ 쀑 λˆ„λ½λœ 게 μžˆλ‚˜?" "이 κΈ°λŠ₯ κ΅¬ν˜„ μ „ μ–΄λ–€ API κ·œμ •?" "이 μš”μ²­μ€ μ •ν™•νžˆ κ·Έκ²ƒλ§Œ / 포괄적?" 등을 μ™ΈλΆ€ AIκ°€ 회수
22
+
23
+ ### 3. λˆ„μ  νšŒκ·€ (1.9.207~215) β€” λͺ¨λ‘ μœ μ§€
24
+
25
+ ### 4. stress-v161 β€” 19/19 PASS
26
+ - 1.9.216 (8): VERSION + tools/list 59개 + 5μ’… 등둝 + 4μ’… μ‹€ 호좜 검증
27
+ - leerness_intent_classify("λ§΅+캐릭터+κ²Œμž„ κΈ°λŠ₯") β†’ broad/game/8 candidates βœ“
28
+ - leerness_constraints_check("Stripe API") β†’ stripe matched βœ“
29
+ - leerness_pre_wake_audit β†’ audited 0 βœ“
30
+ - leerness_idempotency_audit β†’ clean βœ“
31
+ - leerness_requests_audit β†’ total=0 βœ“
32
+ - μ„±λŠ₯ (2): cold_start 544ms / MCP 59도ꡬ 541ms
33
+ - λˆ„μ  νšŒκ·€ (9): 1.9.207~215
34
+
35
+ ### 5. μžλ™ release (78 λΌμš΄λ“œ main-push streak Β· 39 λΌμš΄λ“œ npm publish streak)
36
+
37
+ πŸŽ‰ **MCP 58 도ꡬ λ§ˆμΌμŠ€ν†€** (이전 53 β†’ 59, +6 in 1.9.158/159/168/216)
38
+
39
+ ---
40
+
41
+ ## 1.9.215 β€” 2026-05-22
42
+
43
+ **🎯 handoff ν—€λ“œλΌμΈμ— constraints/intent μžλ™ 톡합 + AGENTS.md 7 λΌμš΄λ“œ λˆ„μ .**
44
+
45
+ > 백둜그 μ†Œμ§„ ν›„ 운영 κ°€μΉ˜ κ°•ν™” β€” ν˜„μž¬ μ§„ν–‰ 쀑 taskμ—μ„œ μžλ™μœΌλ‘œ ν”Œλž«νΌ μ œμ•½ + μ˜λ„ λΆ„λ₯˜ λ…ΈμΆœ
46
+
47
+ ### 1. handoff ν—€λ“œλΌμΈ 15번째 μš”μ†Œ (1.9.215)
48
+ - progress-tracker.md 의 **첫 ν™œμ„± task** request μžλ™ μΆ”μΆœ
49
+ - **1.9.208 constraints 톡합**: ν”Œλž«νΌ alias λ§€μΉ­ μ‹œ `🚦 N ν”Œλž«νΌ μ œμ•½` λ…ΈμΆœ
50
+ - 예: "Stripe API 결제 λͺ¨λ“ˆ" β†’ `🚦 1 ν”Œλž«νΌ μ œμ•½`
51
+ - **1.9.213 intent 톡합**: μ˜λ„ μžλ™ λΆ„λ₯˜ μ‹œ `🎯 intent broad/<domain>` λ˜λŠ” `🎯 intent precise` λ…ΈμΆœ
52
+ - 예: "κ²Œμž„ λ§Œλ“€μ–΄μ€˜ ... 포괄적" β†’ `🎯 intent broad/game`
53
+ - ν—€λ“œλΌμΈ 라벨: `1.9.81/93/113/152/162/192/197/204/207/209/215`
54
+ - done/dropped/blocked/completed taskλŠ” λ¬΄μ‹œ (ν™œμ„±λ§Œ 뢄석)
55
+
56
+ ### 2. AGENTS.md 7 λΌμš΄λ“œ λˆ„μ  κ°±μ‹  (CLAUDE.md λ“±κ°€)
57
+ - `## μ‚¬μš©μž λͺ…μ‹œ μ‹ κ·œ 7μ’… (1.9.207~213)` ν‘œ ν˜•μ‹ (버전 / κΈ°λŠ₯ / CLI)
58
+ - `### handoff ν—€λ“œλΌμΈ μžλ™ λ…ΈμΆœ (1.9.215+)` μ„Ήμ…˜
59
+ - `### μ˜λ„ 보호 원칙 (1.9.213)` λͺ…μ‹œ
60
+
61
+ ### 3. λˆ„μ  νšŒκ·€ (1.9.207~214) β€” λͺ¨λ‘ μœ μ§€
62
+
63
+ ### 4. stress-v160 β€” 17/17 PASS
64
+ - 1.9.215 (6): VERSION + ν—€λ“œλΌμΈ μ½”λ“œ + AGENTS.md + 격리 검증 3μ’…
65
+ - stripe task β†’ 🚦 μžλ™ / broad+game task β†’ 🎯 μžλ™ / done task λ¬΄μ‹œ
66
+ - μ„±λŠ₯ (2) + λˆ„μ  νšŒκ·€ (9)
67
+ - μ„±λŠ₯: --version cold start avg 677ms Β· MCP 54 도ꡬ 453ms
68
+
69
+ ### 5. μžλ™ release (77 λΌμš΄λ“œ main-push streak Β· 38 λΌμš΄λ“œ npm publish streak)
70
+
71
+ ---
72
+
3
73
  ## 1.9.214 β€” 2026-05-22
4
74
 
5
75
  **πŸ›  운영 μ•ˆμ •ν™” λΌμš΄λ“œ β€” drift 차단 + AGENTS/CLAUDE 7 λΌμš΄λ“œ λˆ„μ  κ°±μ‹  + μ’…ν•© νšŒκ·€.**
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.214-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v159-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-144-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-76_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-98%2F100_(5μΆ•)-brightgreen)]() [![user-backlog](https://img.shields.io/badge/μ‚¬μš©μž_백둜그-0_pending-success)]() [![perf](https://img.shields.io/badge/cold_start-516ms-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.216-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v161-19%2F19-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-59-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-146-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-78_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-98%2F100_(5μΆ•)-brightgreen)]() [![mcp-7r](https://img.shields.io/badge/MCP_7λΌμš΄λ“œ-5μ’…_μΆ”κ°€-success)]() [![perf](https://img.shields.io/badge/cold_start-544ms-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)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,9 +12,9 @@
12
12
  β•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β•β•β–ˆβ–ˆβ•‘ β•‘
13
13
  β•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β•‘
14
14
  β•‘ β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β• β•‘
15
- β•‘ v1.9.214 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.216 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ›  운영 μ•ˆμ •ν™” + 7 λΌμš΄λ“œ λˆ„μ  톡합 (백둜그 0 pending) β•‘
17
+ β•‘ πŸ”Œ MCP 59 도ꡬ (1.9.207~213 μ™ΈλΆ€ AI λ…ΈμΆœ +5μ’…) β•‘
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.214';
10
+ const VERSION = '1.9.216';
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 처리).
@@ -5658,10 +5658,45 @@ function handoff(root) {
5658
5658
  }
5659
5659
  }
5660
5660
  } catch {}
5661
+ // 15) 1.9.215: ν˜„μž¬ ν™œμ„± taskμ—μ„œ constraints/intent μžλ™ 뢄석 (1.9.208/213 톡합)
5662
+ try {
5663
+ // progress-tracker.md 의 첫 active task request μΆ”μΆœ
5664
+ const ptPath = path.join(root, '.harness', 'progress-tracker.md');
5665
+ if (exists(ptPath)) {
5666
+ const content = read(ptPath);
5667
+ for (const line of content.split(/\r?\n/)) {
5668
+ if (!/^\|\s*T-\d{4,}\s*\|/.test(line)) continue;
5669
+ const cells = line.split('|').slice(1, -1).map(s => s.trim());
5670
+ if (cells.length < 3) continue;
5671
+ const status = (cells[1] || '').toLowerCase();
5672
+ const req = cells[2];
5673
+ if (!/^(done|dropped|blocked|completed)$/i.test(status) && req.length >= 5) {
5674
+ // 1.9.208 constraints λ§€μΉ­
5675
+ try {
5676
+ const cc = _checkRequestConstraints(root, req);
5677
+ if (cc.matched && cc.matched.length > 0) {
5678
+ parts.push(`🚦 ${cc.matched.length} ν”Œλž«νΌ μ œμ•½`);
5679
+ }
5680
+ } catch {}
5681
+ // 1.9.213 intent classify
5682
+ try {
5683
+ const cls = _classifyIntent(req);
5684
+ if (cls.intent === 'broad') {
5685
+ const det = _detectDomain(req, root);
5686
+ if (det.domain) parts.push(`🎯 intent broad/${det.domain}`);
5687
+ } else if (cls.intent === 'precise') {
5688
+ parts.push(`🎯 intent precise`);
5689
+ }
5690
+ } catch {}
5691
+ break; // 첫 active만 뢄석
5692
+ }
5693
+ }
5694
+ }
5695
+ } catch {}
5661
5696
  if (parts.length) {
5662
5697
  const isTty = process.stdout && process.stdout.isTTY;
5663
5698
  const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
5664
- log(cy(`πŸ“Š ν—€λ“œλΌμΈ (1.9.81/93/113/152/162/192/197/204/207/209): ${parts.join(' Β· ')}`));
5699
+ log(cy(`πŸ“Š ν—€λ“œλΌμΈ (1.9.81/93/113/152/162/192/197/204/207/209/215): ${parts.join(' Β· ')}`));
5665
5700
  }
5666
5701
  } catch {}
5667
5702
  }
@@ -13249,7 +13284,12 @@ function mcpServeCmd(root) {
13249
13284
  { name: 'leerness_web', description: '1.9.168 β€” Web Bridge (1.9.165 playwright opt-in). sub: check (μ„€μΉ˜ + permissions.browser 확인) | screenshot (URL β†’ PNG) | extract (URL + CSS selector β†’ DOM ν…μŠ€νŠΈ). μ™ΈλΆ€ AIκ°€ leerness 의 μ›Ή μžλ™ν™” λŠ₯λ ₯을 직접 호좜. playwright λ―Έμ„€μΉ˜ μ‹œ 친절 μ•ˆλ‚΄ (graceful). 인자: { sub (required), url?, out?, selector?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'screenshot', 'extract'] }, url: { type: 'string' }, out: { type: 'string' }, selector: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
13250
13285
  { name: 'leerness_pc', description: '1.9.168 β€” PC Bridge (1.9.166 robotjs/nut-tree opt-in). sub: check (μ„€μΉ˜ + permissions.mouse/keyboard) | click (x,y) | type (text) | screenshot (out). ⚠ full permissions ꢌμž₯ (mouse/keyboard μ ‘κ·Ό). μ™ΈλΆ€ AIκ°€ λ°μŠ€ν¬νƒ‘ μžλ™ν™” λŠ₯λ ₯을 직접 호좜. 인자: { sub (required), x?, y?, text?, out?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'click', 'type', 'screenshot'] }, x: { type: 'number' }, y: { type: 'number' }, text: { type: 'string' }, out: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
13251
13286
  { name: 'leerness_lsp', description: '1.9.168 β€” LSP Bridge (1.9.167 typescript opt-in + regex fallback). sub: check (μ„€μΉ˜ μ—¬λΆ€) | symbols (file β†’ function/class/interface/type/enum λͺ©λ‘) | references (name + in 디렉토리 β†’ 호좜 μœ„μΉ˜). μ™ΈλΆ€ AIκ°€ μ½”λ“œ μΈν…”λ¦¬μ „μŠ€λ₯Ό 직접 호좜 (μ˜μ‘΄μ„± 0 fallback λ™μž‘). πŸŽ‰ MCP 53 도ꡬ λ§ˆμΌμŠ€ν†€. 인자: { sub (required), file?, name?, in?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'symbols', 'references'] }, file: { type: 'string' }, name: { type: 'string' }, in: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
13252
- { name: 'leerness_review_request', description: '1.9.176 β€” μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (μ‚¬μš©μž λͺ…μ‹œ μš”μ²­). AI μ—μ΄μ „νŠΈκ°€ μ‚¬μš©μž μš”κ΅¬λ₯Ό **무쑰건 κ΅¬ν˜„ μ „**에 호좜. 뢄석: 1) estimatedType (route μΆ”μ •), 2) conflicts (lesson μ‹€νŒ¨/진행쀑 task), 3) reuseCandidates (skill/reuse-map λ§€μΉ­), 4) lessonsRecall (κ³Όκ±° κ²°μ •), 5) planConflicts (진행쀑 milestone), 6) featureConflicts (feature graph μ˜μ—­ κ²ΉμΉ¨), 7) recommendedSteps (μž‘μ—… μœ ν˜•λ³„ 3-5 단계), 8) efficiencyHints, 9) proceed (true/false). μ‚¬μš©μž κ²°μ • 도움. 인자: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } }
13287
+ { name: 'leerness_review_request', description: '1.9.176 β€” μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (μ‚¬μš©μž λͺ…μ‹œ μš”μ²­). AI μ—μ΄μ „νŠΈκ°€ μ‚¬μš©μž μš”κ΅¬λ₯Ό **무쑰건 κ΅¬ν˜„ μ „**에 호좜. 뢄석: 1) estimatedType (route μΆ”μ •), 2) conflicts (lesson μ‹€νŒ¨/진행쀑 task), 3) reuseCandidates (skill/reuse-map λ§€μΉ­), 4) lessonsRecall (κ³Όκ±° κ²°μ •), 5) planConflicts (진행쀑 milestone), 6) featureConflicts (feature graph μ˜μ—­ κ²ΉμΉ¨), 7) recommendedSteps (μž‘μ—… μœ ν˜•λ³„ 3-5 단계), 8) efficiencyHints, 9) proceed (true/false). μ‚¬μš©μž κ²°μ • 도움. 인자: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
13288
+ { name: 'leerness_requests_audit', description: '1.9.216 (1.9.207 μ‚¬μš©μž λͺ…μ‹œ) β€” μ‚¬μš©μž λͺ…μ‹œ μš”μ²­ λˆ„λ½ 확인 절차. .harness/user-requests.json 의 open/in-progress μš”μ²­μ„ task-log/plan/decisions 와 λ§€μΉ­ β†’ missing/tracked/stale λΆ„λ₯˜. μ™ΈλΆ€ AIκ°€ "μ‚¬μš©μžκ°€ ν–ˆλ˜ μš”μ²­ 쀑 λˆ„λ½λœ 게 μžˆλ‚˜?"λ₯Ό 직접 회수. 응닡: { total, open, missing[], tracked[], stale[], completed, dropped }. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
13289
+ { name: 'leerness_constraints_check', description: '1.9.216 (1.9.208 μ‚¬μš©μž λͺ…μ‹œ) β€” ν”Œλž«νΌ/API μ œμ•½ 사전 체크. μ‚¬μš©μž μš”μ²­ ν…μŠ€νŠΈμ—μ„œ ν”Œλž«νΌ alias λ§€μΉ­ (stripe/openai/anthropic/github/discord/twitter 6μ’… + μ‚¬μš©μž μ •μ˜) β†’ 각 ν”Œλž«νΌμ˜ rate-limit / idempotency / auth / cost μ œμ•½ λ…ΈμΆœ. μ™ΈλΆ€ AIκ°€ "이 κΈ°λŠ₯ κ΅¬ν˜„ μ „ μ–΄λ–€ κ·œμ •μ„ 봐야 ν•˜λ‚˜?"λ₯Ό 직접 회수. 인자: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
13290
+ { name: 'leerness_pre_wake_audit', description: '1.9.216 (1.9.209 μ‚¬μš©μž λͺ…μ‹œ) β€” sleep μ „ sub-agent audit. 6 μ˜μ—­ 점검: missing-user-requests / stale-in-progress / drift-handoff-stale / wakeup-missed / next-action-pending / auto-resume-plan. μ™ΈλΆ€ AIκ°€ "κΉ¨μ–΄λ‚˜κΈ° μ „ 점검할 λΆ€λΆ„"을 회수. 응닡: { auditedAt, findings: {critical, warning, info}, summary }. 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
13291
+ { name: 'leerness_intent_classify', description: '1.9.216 (1.9.213 μ‚¬μš©μž λͺ…μ‹œ) β€” μ‚¬μš©μž μ˜λ„ νŒŒμ•… + scope expansion 게이트. 응닡: { intent: precise|broad|default, signals, domain, explicitMentions, expansionCandidates, mode: dry-run }. 3원칙 μ•ˆμ „: (1) Always-Off Opt-In, (2) Dry-run κΈ°λ³Έ (μ‹€ν–‰ X), (3) λͺ…μ‹œ vs μΆ”λ‘  뢄리 라벨링. 5 도메인 (game/web/api/cli/data). μ™ΈλΆ€ AIκ°€ "이 μš”μ²­μ€ μ •ν™•νžˆ κ·Έκ²ƒλ§Œ / 포괄적 / 기본인가?"λ₯Ό 회수. 인자: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
13292
+ { name: 'leerness_idempotency_audit', description: '1.9.216 (1.9.212 μ‚¬μš©μž λͺ…μ‹œ) β€” λ©±λ“±μ„± μœ„λ°˜ 탐지. 4μ˜μ—­ 점검: rule-duplicate (medium) / task-duplicate-request (medium) / user-request-duplicate (low) / wakeup-duplicate (high). 응닡: { violations[], verified[], summary: {totalViolations, high/medium/low, overall} }. μ™ΈλΆ€ AIκ°€ "μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ— 쀑볡/좩돌이 μžˆλ‚˜?"λ₯Ό 회수. πŸŽ‰ MCP 58 도ꡬ λ§ˆμΌμŠ€ν†€ (50β†’58). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
13253
13293
  ];
13254
13294
 
13255
13295
  function send(obj) {
@@ -13381,6 +13421,26 @@ function mcpServeCmd(root) {
13381
13421
  // 1.9.176: μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (μ‚¬μš©μž λͺ…μ‹œ μš”μ²­)
13382
13422
  cliArgs = ['review-request', String(args.request || ''), '--path', targetPath, '--json'];
13383
13423
  break;
13424
+ case 'leerness_requests_audit':
13425
+ // 1.9.216 (1.9.207): μ‚¬μš©μž μš”μ²­ λˆ„λ½ 확인 절차
13426
+ cliArgs = ['requests', 'audit', '--path', targetPath, '--json'];
13427
+ break;
13428
+ case 'leerness_constraints_check':
13429
+ // 1.9.216 (1.9.208): ν”Œλž«νΌ/API μ œμ•½ 사전 체크
13430
+ cliArgs = ['constraints', 'check', String(args.request || ''), '--path', targetPath, '--json'];
13431
+ break;
13432
+ case 'leerness_pre_wake_audit':
13433
+ // 1.9.216 (1.9.209): pre-wake sub-agent audit
13434
+ cliArgs = ['pre-wake-audit', '--path', targetPath, '--json'];
13435
+ break;
13436
+ case 'leerness_intent_classify':
13437
+ // 1.9.216 (1.9.213): intent inference + scope expansion (dry-run)
13438
+ cliArgs = ['intent', 'expand', String(args.request || ''), '--path', targetPath, '--json'];
13439
+ break;
13440
+ case 'leerness_idempotency_audit':
13441
+ // 1.9.216 (1.9.212): λ©±λ“±μ„± 감사 (rule/task/user-requests/wakeups 4μ˜μ—­)
13442
+ cliArgs = ['idempotency', 'audit', '--path', targetPath, '--json'];
13443
+ break;
13384
13444
  default:
13385
13445
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
13386
13446
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.214",
3
+ "version": "1.9.216",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",