leerness 1.9.223 β†’ 1.9.225

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,78 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.225 β€” 2026-05-22
4
+
5
+ **πŸ”§ drift check --auto-fix delivered 톡합 + LEERNESS_AUTO_APPLY_DELIVERED env opt-in.**
6
+
7
+ ### 1. `drift check --auto-fix` delivered νŒ¨ν„΄ μžλ™ 적용 (1.9.82 νŒ¨ν„΄ ν™•μž₯)
8
+ - 1.9.82 λ³΄μ•ˆ μ‹ ν˜Έ β†’ audit --fix μžλ™ 호좜 νŒ¨ν„΄μ„ delivered μ‹œμŠ€ν…œμ—λ„ 적용
9
+ - `--auto-fix` ν”Œλž˜κ·Έ μ‚¬μš© μ‹œ `_detectDeliveredRequests` β†’ 후보 μžλ™ μ™„λ£Œ
10
+ - `autoCompleteReason: 'drift-auto-fix-1.9.225'` 좔적
11
+ - drift score κ°€μ€‘μΉ˜ κ°€μ§œ λ―Έλ‹΅ μ‹ ν˜Έ 제거 β†’ drift 회볡 완성도 ν–₯상
12
+
13
+ ### 2. `LEERNESS_AUTO_APPLY_DELIVERED=1` env opt-in (자율 λͺ¨λ“œμš©)
14
+ - handoff 첫 호좜 μ‹œ μžλ™ 적용 (`autoCompleteReason: 'env-auto-apply-1.9.225'`)
15
+ - 자율 λͺ¨λ“œμ—μ„œ λ§€ λΌμš΄λ“œλ§ˆλ‹€ μžλ™ 정리 β†’ AIκ°€ μ‹ κ²½ μ“Έ ν•„μš” X
16
+ - env λ―Έμ„€μ • μ‹œ κΈ°μ‘΄ λ™μž‘ (μ•ˆλ‚΄λ§Œ)
17
+
18
+ ### 3. handoff λ³Έλ¬Έ κ°€μ΄λ“œ μΆ”κ°€
19
+ - 1.9.224 λ³Έλ¬Έ μ„Ήμ…˜μ— `β†’ 자율 λͺ¨λ“œ μžλ™ 적용: export LEERNESS_AUTO_APPLY_DELIVERED=1` μ•ˆλ‚΄
20
+ - μ‚¬μš©μžκ°€ 자율 λͺ¨λ“œ opt-in λ°œκ²¬ν•˜κΈ° μ‰½κ²Œ
21
+
22
+ ### 4. μ‚¬μš©μž μš”μ²­ μžλ™ μ™„λ£Œ μ‹œμŠ€ν…œ β€” 4 λΌμš΄λ“œ λˆ„μ  μ™„μ„±
23
+ - 1.9.223 CLI auto-complete (μˆ˜λ™ 호좜)
24
+ - 1.9.224 MCP 61 + handoff λ³Έλ¬Έ + session close μžλ™ 적용
25
+ - 1.9.225 drift --auto-fix 톡합 + env opt-in μžλ™ν™”
26
+
27
+ ### 5. λˆ„μ  νšŒκ·€ (1.9.207~224) β€” λͺ¨λ‘ μœ μ§€
28
+
29
+ ### 6. stress-v170 β€” 14/14 PASS
30
+ - 1.9.225 (5): VERSION + drift auto-fix 톡합 + drift κΈ°λ³Έ 보쑴 + env auto-apply + env μ—†μœΌλ©΄ 미적용
31
+ - μ„±λŠ₯ (2): cold_start avg 367ms / drift auto-fix 383ms
32
+ - λˆ„μ  νšŒκ·€ (7): 1.9.207~224
33
+
34
+ ### 7. μžλ™ release (87 λΌμš΄λ“œ main-push streak Β· 48 λΌμš΄λ“œ npm publish streak)
35
+
36
+ πŸ”§ **drift 회볡 μ‹œμŠ€ν…œ λˆ„μ  κ°•ν™”** (1.9.39/82/225 β€” 3 λΌμš΄λ“œ)
37
+
38
+ ---
39
+
40
+ ## 1.9.224 β€” 2026-05-22
41
+
42
+ **πŸ”Œ MCP 61 도ꡬ (leerness_requests_auto_complete) + handoff λ³Έλ¬Έ + session close --auto-apply-delivered.**
43
+
44
+ ### 1. MCP 61번째 도ꡬ β€” `leerness_requests_auto_complete`
45
+ - 1.9.223 delivered νŒ¨ν„΄ μžλ™ 감지λ₯Ό μ™ΈλΆ€ AI에 λ…ΈμΆœ
46
+ - 인자: `{ path?, apply? (default false) }`
47
+ - 응닡: `{ total, candidates: [{id, text, claimedVersion, currentVersion, deliveredKeyword, recordedAt}], currentVersion, applied, completedIds[] }`
48
+ - MCP 60 (1.9.221) β†’ 61 도ꡬ (+1)
49
+
50
+ ### 2. handoff λ³Έλ¬Έ μžλ™ λ…ΈμΆœ
51
+ - delivered 후보 β‰₯ 1건 μ‹œ: `## πŸ“₯ μ‚¬μš©μž μš”μ²­ μžλ™ μ™„λ£Œ κ°€λŠ₯ (1.9.224, N건)` λ³Έλ¬Έ μ„Ήμ…˜
52
+ - top 5 후보 λ…ΈμΆœ (overflowλŠ” `... +N건 더`)
53
+ - μžλ™ ꢌμž₯: `β†’ leerness requests auto-complete --apply`
54
+ - 1.9.222 비정상 μ’…λ£Œ λ³Έλ¬Έ λ‹€μŒ, ν™œμ„± λ£° 이전 μœ„μΉ˜
55
+
56
+ ### 3. `session close --auto-apply-delivered` ν”Œλž˜κ·Έ
57
+ - 마감 μ‹œ delivered 후보 μžλ™ μ™„λ£Œ (μ•ˆμ „: νŒ¨ν„΄ λ§€μΉ­ + 버전 κ°€λ“œ)
58
+ - `autoCompleteReason: 'session-close-auto-apply-1.9.224'` 좔적
59
+ - ν”Œλž˜κ·Έ μ—†μœΌλ©΄ κΈ°μ‘΄ λ™μž‘ (μ•ˆλ‚΄λ§Œ)
60
+
61
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~223) β€” λͺ¨λ‘ μœ μ§€
62
+
63
+ ### 5. stress-v169 β€” 16/16 PASS
64
+ - 1.9.224 (7): VERSION + MCP 61 + μ‹€ 호좜 + handoff λ³Έλ¬Έ + λ³Έλ¬Έ λ―Έλ…ΈμΆœ + session close auto-apply + κΈ°λ³Έ 보쑴
65
+ - μ„±λŠ₯ (2): cold_start avg 556ms / MCP 61 tools/list 417ms
66
+ - λˆ„μ  νšŒκ·€ (7): 1.9.207~223
67
+
68
+ ### 6. μžλ™ release (86 λΌμš΄λ“œ main-push streak Β· 47 λΌμš΄λ“œ npm publish streak)
69
+
70
+ πŸ”Œ **μ‚¬μš©μž μš”μ²­ μžλ™ μ™„λ£Œ μ‹œμŠ€ν…œ μ™„μ„±** (3 λΌμš΄λ“œ λˆ„μ ):
71
+ - 1.9.223 CLI auto-complete
72
+ - 1.9.224 MCP 61 + handoff λ³Έλ¬Έ + session close μžλ™ 적용
73
+
74
+ ---
75
+
3
76
  ## 1.9.223 β€” 2026-05-22
4
77
 
5
78
  **πŸ“₯ μ‚¬μš©μž μš”μ²­ auto-complete (delivered νŒ¨ν„΄ μžλ™ 감지) + handoff/session close 톡합.**
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.223-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v168-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-60_πŸŽ‰-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-153-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-85_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![auto-complete](https://img.shields.io/badge/πŸ“₯_requests-auto--complete-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-401ms-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.225-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v170-14%2F14-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-61-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-155-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-87_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![drift-fix](https://img.shields.io/badge/πŸ”§_drift--auto--fix-delivered_톡합-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-367ms-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.223 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.225 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ“₯ requests auto-complete Β· handoff JSON 5 톡합 ν•„λ“œ β•‘
17
+ β•‘ πŸ”§ drift --auto-fix delivered + AUTO_APPLY env opt-in β•‘
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.223';
10
+ const VERSION = '1.9.225';
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 처리).
@@ -6139,6 +6139,46 @@ function handoff(root) {
6139
6139
  }
6140
6140
  } catch {}
6141
6141
 
6142
+ // 1.9.224: handoff λ³Έλ¬Έ μžλ™ λ…ΈμΆœ β€” delivered νŒ¨ν„΄ 후보 β‰₯ 1건 μ‹œ (1.9.223 ν™•μž₯)
6143
+ // "Round X.Y.Z β€” κ΅¬ν˜„ μ™„λ£Œ" νŒ¨ν„΄μ΄ λˆ„μ λ˜λ©΄ λ³Έλ¬Έ μ„Ήμ…˜μœΌλ‘œ μžλ™ μ•ˆλ‚΄ (ν—€λ“œλΌμΈλ§ŒμœΌλ‘œλŠ” λ†“μΉ˜κΈ° 쉬움)
6144
+ // 1.9.225: LEERNESS_AUTO_APPLY_DELIVERED=1 env ν™œμ„± μ‹œ handoff 첫 ν˜ΈμΆœμ—μ„œ μžλ™ 적용 (자율 λͺ¨λ“œμš© opt-in)
6145
+ try {
6146
+ let delivered = _detectDeliveredRequests(root);
6147
+ const envAutoApply = process.env.LEERNESS_AUTO_APPLY_DELIVERED === '1';
6148
+ if (envAutoApply && delivered.candidates && delivered.candidates.length > 0) {
6149
+ let appliedCnt = 0;
6150
+ for (const c of delivered.candidates) {
6151
+ const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'env-auto-apply-1.9.225' });
6152
+ if (u) appliedCnt++;
6153
+ }
6154
+ if (appliedCnt > 0) {
6155
+ const isTty = process.stdout && process.stdout.isTTY;
6156
+ const gr5 = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
6157
+ log('');
6158
+ log(gr5(`## πŸ“₯ μ‚¬μš©μž μš”μ²­ μžλ™ μ™„λ£Œ (1.9.225, env LEERNESS_AUTO_APPLY_DELIVERED=1, ${appliedCnt}건)`));
6159
+ // 적용 ν›„ 재쑰회
6160
+ delivered = _detectDeliveredRequests(root);
6161
+ }
6162
+ }
6163
+ if (delivered.candidates && delivered.candidates.length > 0) {
6164
+ const isTty = process.stdout && process.stdout.isTTY;
6165
+ const cy4 = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
6166
+ const yl4 = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
6167
+ const dm4 = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
6168
+ log('');
6169
+ log(yl4(`## πŸ“₯ μ‚¬μš©μž μš”μ²­ μžλ™ μ™„λ£Œ κ°€λŠ₯ (1.9.224, ${delivered.candidates.length}건)`));
6170
+ delivered.candidates.slice(0, 5).forEach(c => {
6171
+ log(` β€’ [${c.id}] v${c.claimedVersion} (${c.deliveredKeyword}) β€” ${c.text.slice(0, 70)}${c.text.length > 70 ? '…' : ''}`);
6172
+ });
6173
+ if (delivered.candidates.length > 5) {
6174
+ log(dm4(` ... +${delivered.candidates.length - 5}건 더`));
6175
+ }
6176
+ log(dm4(` β†’ κ²€ν† : leerness requests auto-complete`));
6177
+ log(dm4(` β†’ 적용: leerness requests auto-complete --apply (μ•ˆμ „ 정리)`));
6178
+ log(dm4(` β†’ 자율 λͺ¨λ“œ μžλ™ 적용: export LEERNESS_AUTO_APPLY_DELIVERED=1 (1.9.225)`));
6179
+ }
6180
+ } catch {}
6181
+
6142
6182
  // 1.9.8: active rules μžλ™ λ…ΈμΆœ (λ§€ μ„Έμ…˜ μ‹œμž‘ μ‹œ AIμ—κ²Œ λ³΄μž„)
6143
6183
  const activeRules = readRules(root).filter(r => r.status === 'active');
6144
6184
  if (activeRules.length) {
@@ -9950,15 +9990,25 @@ function sessionClose(root, opts = {}) {
9950
9990
 
9951
9991
  log('');
9952
9992
  log(`## πŸ”š session close μžλ™ 톡합 보고 (1.9.217)`);
9953
- // 1.9.207 + 1.9.223 (delivered νŒ¨ν„΄ μžλ™ ꢌμž₯)
9993
+ // 1.9.207 + 1.9.223 (delivered νŒ¨ν„΄ μžλ™ ꢌμž₯) + 1.9.224 (--auto-apply-delivered μ˜΅μ…˜)
9954
9994
  try {
9955
9995
  const reqAudit = _auditUserRequests(root);
9956
9996
  const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
9957
9997
  let delivered = { candidates: [] };
9958
9998
  try { delivered = _detectDeliveredRequests(root); } catch {}
9959
9999
  if (delivered.candidates && delivered.candidates.length > 0) {
9960
- log(yel(` πŸ“₯ delivered νŒ¨ν„΄ ${delivered.candidates.length}건 (1.9.223) β€” μžλ™ μ™„λ£Œ κ°€λŠ₯`));
9961
- log(dim(` β†’ leerness requests auto-complete --apply (μ•ˆμ „ 정리)`));
10000
+ if (has('--auto-apply-delivered')) {
10001
+ // 1.9.224: μžλ™ 정리 (마감 μ‹œ 호좜 β€” μ•ˆμ „: νŒ¨ν„΄ λ§€μΉ­ + 버전 κ°€λ“œ)
10002
+ let ok = 0;
10003
+ for (const c of delivered.candidates) {
10004
+ const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'session-close-auto-apply-1.9.224' });
10005
+ if (u) ok++;
10006
+ }
10007
+ log(grn(` βœ“ delivered νŒ¨ν„΄ ${ok}건 μžλ™ μ™„λ£Œ (--auto-apply-delivered 1.9.224)`));
10008
+ } else {
10009
+ log(yel(` πŸ“₯ delivered νŒ¨ν„΄ ${delivered.candidates.length}건 (1.9.223) β€” μžλ™ μ™„λ£Œ κ°€λŠ₯`));
10010
+ log(dim(` β†’ leerness requests auto-complete --apply (μˆ˜λ™) λ˜λŠ” session close --auto-apply-delivered (1.9.224)`));
10011
+ }
9962
10012
  } else if (missCnt > 0) {
9963
10013
  log(red(` ⚠ λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ ${missCnt}건 (task-log/plan/decisions λ§€μΉ­ μ•ˆ 됨)`));
9964
10014
  } else if (reqAudit.open > 0) {
@@ -12835,6 +12885,26 @@ function driftCheckCmd(root, opts = {}) {
12835
12885
  log(`⚠ auto-fix λ³΄μ•ˆ 회볡 였λ₯˜: ${e.message}`);
12836
12886
  }
12837
12887
  }
12888
+ // 1.9.225: drift check --auto-fix 에 delivered νŒ¨ν„΄ μžλ™ 적용 톡합 (1.9.223/224 μ‹œμŠ€ν…œ 회수)
12889
+ // μ‚¬μš©μž μš”μ²­μ— "κ΅¬ν˜„ μ™„λ£Œ" νŒ¨ν„΄μ΄ λˆ„μ λ˜λ©΄ κ°€μ§œ λ―Έλ‹΅ μ‹ ν˜Έκ°€ drift score λ₯Ό κ°€μ€‘μ‹œν‚¬ 수 있음 β†’ μžλ™ 정리.
12890
+ // 1.9.82 audit --fix νŒ¨ν„΄κ³Ό 동일: --auto-fix μ‹œ μ¦‰μ‹œ 적용, 적용 ν›„ μž¬κ²€μ‚¬.
12891
+ if (autoFix) {
12892
+ try {
12893
+ const delivered = _detectDeliveredRequests(root);
12894
+ if (delivered.candidates && delivered.candidates.length > 0) {
12895
+ log('');
12896
+ log(`πŸ“₯ --auto-fix ν™œμ„± (1.9.225) β€” delivered νŒ¨ν„΄ ${delivered.candidates.length}건 μžλ™ μ™„λ£Œ 쀑...`);
12897
+ let ok = 0;
12898
+ for (const c of delivered.candidates) {
12899
+ const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'drift-auto-fix-1.9.225' });
12900
+ if (u) ok++;
12901
+ }
12902
+ log(`βœ“ delivered μžλ™ μ™„λ£Œ ${ok}/${delivered.candidates.length}건`);
12903
+ }
12904
+ } catch (e) {
12905
+ log(`⚠ delivered auto-apply 였λ₯˜ (1.9.225): ${e.message}`);
12906
+ }
12907
+ }
12838
12908
  if (autoFix && level === 'πŸ”΄ critical' && !hasSecurityFired) {
12839
12909
  log('');
12840
12910
  log(`πŸ”§ --auto-fix ν™œμ„± β€” session close μžλ™ μ‹€ν–‰ 쀑...`);
@@ -13818,7 +13888,8 @@ function mcpServeCmd(root) {
13818
13888
  { 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' } } } },
13819
13889
  { 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'] } },
13820
13890
  { 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' } } } },
13821
- { name: 'leerness_session_resume', description: '1.9.221 (1.9.220 μ‚¬μš©μž λͺ…μ‹œ) β€” 비정상 μ’…λ£Œ 감지 + 자율 재개. 5μ‹ ν˜Έ 뢄석: last-handoff-stale / wakeup-missed / in-progress-stale / auto-resume-plan-unused / release-branch-pending. 응닡: { abnormalShutdown, severity (none/low/medium/high), signals[], resumeGuide[] }. μ™ΈλΆ€ AIκ°€ "μ ˆμ „/μ‹œμŠ€ν…œμ’…λ£Œ/μ„Έμ…˜μ’…λ£Œ ν›„ leerness μƒνƒœκ°€ 정상인가? μ–΄λ–»κ²Œ 재개?"λ₯Ό 회수. πŸŽ‰ MCP 60 도ꡬ λ§ˆμΌμŠ€ν†€ (53β†’60, +7 in 1.9.168/216/221). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
13891
+ { name: 'leerness_session_resume', description: '1.9.221 (1.9.220 μ‚¬μš©μž λͺ…μ‹œ) β€” 비정상 μ’…λ£Œ 감지 + 자율 재개. 5μ‹ ν˜Έ 뢄석: last-handoff-stale / wakeup-missed / in-progress-stale / auto-resume-plan-unused / release-branch-pending. 응닡: { abnormalShutdown, severity (none/low/medium/high), signals[], resumeGuide[] }. μ™ΈλΆ€ AIκ°€ "μ ˆμ „/μ‹œμŠ€ν…œμ’…λ£Œ/μ„Έμ…˜μ’…λ£Œ ν›„ leerness μƒνƒœκ°€ 정상인가? μ–΄λ–»κ²Œ 재개?"λ₯Ό 회수. πŸŽ‰ MCP 60 도ꡬ λ§ˆμΌμŠ€ν†€ (53β†’60, +7 in 1.9.168/216/221). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
13892
+ { 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' } } } }
13822
13893
  ];
13823
13894
 
13824
13895
  function send(obj) {
@@ -13974,6 +14045,11 @@ function mcpServeCmd(root) {
13974
14045
  // 1.9.221 (1.9.220): 비정상 μ’…λ£Œ 감지 + 자율 재개
13975
14046
  cliArgs = ['session-resume', '--path', targetPath, '--json'];
13976
14047
  break;
14048
+ case 'leerness_requests_auto_complete':
14049
+ // 1.9.224 (1.9.223): delivered νŒ¨ν„΄ μžλ™ 감지 + μžλ™ μ™„λ£Œ
14050
+ cliArgs = ['requests', 'auto-complete', '--path', targetPath, '--json'];
14051
+ if (args.apply === true) cliArgs.push('--apply');
14052
+ break;
13977
14053
  default:
13978
14054
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
13979
14055
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.223",
3
+ "version": "1.9.225",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",