leerness 1.9.215 β†’ 1.9.217

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,84 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.217 β€” 2026-05-22
4
+
5
+ **πŸ”š session close μžλ™ 톡합 β€” 1.9.207/209/212 μžλ™ 호좜.**
6
+
7
+ ### 1. session close μžλ™ 호좜 3μ’… (마감 μ‹œ)
8
+ | μ˜μ—­ | 좜처 | λ™μž‘ |
9
+ |---|---|---|
10
+ | `userRequestsAudit` | 1.9.207 | open/in-progress μš”μ²­ β†’ missing/tracked/stale λΆ„λ₯˜ |
11
+ | `preWakeAudit` | 1.9.209 | sleep μ „ 6 μ˜μ—­ audit + .harness/pre-wake-report.json μžλ™ μ €μž₯ |
12
+ | `idempotencyAudit` | 1.9.212 | 4μ˜μ—­ λ©±λ“±μ„± 검사 (rule/task/user-requests/wakeups) |
13
+
14
+ ### 2. JSON λͺ¨λ“œ (`--json`) 톡합 ν•„λ“œ μΆ”κ°€
15
+ - `userRequestsAudit: { total, open, missing, tracked, stale }`
16
+ - `preWakeAudit: { auditedAt, critical, warning, info, needsAttention }`
17
+ - `idempotencyAudit: { violations, high, medium, low, verified, overall }`
18
+
19
+ ### 3. human 좜λ ₯ μžλ™ μ„Ήμ…˜
20
+ ```
21
+ ## πŸ”š session close μžλ™ 톡합 보고 (1.9.217)
22
+ ⚠ λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ N건 (task-log/plan/decisions λ§€μΉ­ μ•ˆ 됨)
23
+ 🚨 pre-wake-audit: critical N (λ‹€μŒ 깨어남 μ‹œ 점검 ν•„μš”)
24
+ βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified 4 μ˜μ—­
25
+ ```
26
+
27
+ ### 4. opt-out μ˜΅μ…˜
28
+ - `--no-pre-wake` β€” pre-wake audit μŠ€ν‚΅
29
+ - μ˜΅μ…˜ μ™Έ λ‹€λ₯Έ 톡합은 항상 μ‹€ν–‰ (가벼움)
30
+
31
+ ### 5. λˆ„μ  νšŒκ·€ (1.9.207~216) β€” λͺ¨λ‘ μœ μ§€
32
+
33
+ ### 6. stress-v162 β€” 18/18 PASS
34
+ - 1.9.217 (7): VERSION + JSON ν•„λ“œ + human μ„Ήμ…˜ + μžλ™ μ €μž₯ + opt-out + ν•„λ“œ ꡬ쑰 + clean
35
+ - μ„±λŠ₯ (2): cold_start 489ms / MCP 59 도ꡬ 785ms
36
+ - λˆ„μ  νšŒκ·€ (9)
37
+
38
+ ### 7. μžλ™ release (79 λΌμš΄λ“œ main-push streak Β· 40 λΌμš΄λ“œ npm publish streak)
39
+
40
+ πŸŽ‰ **session close κ°•ν™”** β€” λ§€ 마감 μ‹œ 운영 μ•ˆμ „ μžλ™ 점검
41
+
42
+ ---
43
+
44
+ ## 1.9.216 β€” 2026-05-22
45
+
46
+ **πŸ”Œ MCP 5μ’… μΆ”κ°€ β€” 1.9.207~213 μ™ΈλΆ€ AI λ…ΈμΆœ (54 β†’ 59 도ꡬ).**
47
+
48
+ > 백둜그 μ†Œμ§„ ν›„ μ™ΈλΆ€ AI 톡합 κ°€μΉ˜ κ°•ν™” β€” Claude/Codex/Gemini 등이 μ‹ κ·œ 7 λΌμš΄λ“œ κΈ°λŠ₯을 직접 호좜 κ°€λŠ₯
49
+
50
+ ### 1. MCP μ‹ κ·œ 5μ’… (1.9.216 라벨)
51
+ | 도ꡬ | 좜처 | 인자 |
52
+ |---|---|---|
53
+ | `leerness_requests_audit` | 1.9.207 | `{ path? }` β†’ missing/tracked/stale 회수 |
54
+ | `leerness_constraints_check` | 1.9.208 | `{ request, path? }` β†’ ν”Œλž«νΌ alias λ§€μΉ­ |
55
+ | `leerness_pre_wake_audit` | 1.9.209 | `{ path? }` β†’ 6μ˜μ—­ audit |
56
+ | `leerness_intent_classify` | 1.9.213 | `{ request, path? }` β†’ intent + 도메인 + dry-run ν™•μž₯ |
57
+ | `leerness_idempotency_audit` | 1.9.212 | `{ path? }` β†’ 4μ˜μ—­ λ©±λ“±μ„± 검사 |
58
+
59
+ ### 2. 5μΆ• 맀트릭슀 BμΆ• (λ©€ν‹° Sub-Agent) κ°€μΉ˜ κ°•ν™”
60
+ - μ™ΈλΆ€ AI κ°€ leerness 의 7 λΌμš΄λ“œ μ‹ κ·œ κΈ°λŠ₯을 MCP 둜 직접 호좜
61
+ - Claude Desktop / Cursor / Codex CLI λ“±μ—μ„œ leerness MCP server 등둝 β†’ μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯
62
+ - "μ‚¬μš©μžκ°€ ν–ˆλ˜ μš”μ²­ 쀑 λˆ„λ½λœ 게 μžˆλ‚˜?" "이 κΈ°λŠ₯ κ΅¬ν˜„ μ „ μ–΄λ–€ API κ·œμ •?" "이 μš”μ²­μ€ μ •ν™•νžˆ κ·Έκ²ƒλ§Œ / 포괄적?" 등을 μ™ΈλΆ€ AIκ°€ 회수
63
+
64
+ ### 3. λˆ„μ  νšŒκ·€ (1.9.207~215) β€” λͺ¨λ‘ μœ μ§€
65
+
66
+ ### 4. stress-v161 β€” 19/19 PASS
67
+ - 1.9.216 (8): VERSION + tools/list 59개 + 5μ’… 등둝 + 4μ’… μ‹€ 호좜 검증
68
+ - leerness_intent_classify("λ§΅+캐릭터+κ²Œμž„ κΈ°λŠ₯") β†’ broad/game/8 candidates βœ“
69
+ - leerness_constraints_check("Stripe API") β†’ stripe matched βœ“
70
+ - leerness_pre_wake_audit β†’ audited 0 βœ“
71
+ - leerness_idempotency_audit β†’ clean βœ“
72
+ - leerness_requests_audit β†’ total=0 βœ“
73
+ - μ„±λŠ₯ (2): cold_start 544ms / MCP 59도ꡬ 541ms
74
+ - λˆ„μ  νšŒκ·€ (9): 1.9.207~215
75
+
76
+ ### 5. μžλ™ release (78 λΌμš΄λ“œ main-push streak Β· 39 λΌμš΄λ“œ npm publish streak)
77
+
78
+ πŸŽ‰ **MCP 58 도ꡬ λ§ˆμΌμŠ€ν†€** (이전 53 β†’ 59, +6 in 1.9.158/159/168/216)
79
+
80
+ ---
81
+
3
82
  ## 1.9.215 β€” 2026-05-22
4
83
 
5
84
  **🎯 handoff ν—€λ“œλΌμΈμ— constraints/intent μžλ™ 톡합 + AGENTS.md 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.215-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v160-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-145-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-77_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-98%2F100_(5μΆ•)-brightgreen)]() [![handoff-auto](https://img.shields.io/badge/handoff_ν—€λ“œλΌμΈ-15μš”μ†Œ-success)]() [![perf](https://img.shields.io/badge/cold_start-677ms-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.217-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v162-18%2F18-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-59-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-147-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-79_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-98%2F100_(5μΆ•)-brightgreen)]() [![session-close](https://img.shields.io/badge/session_close-μžλ™_톡합_3μ’…-success)]() [![perf](https://img.shields.io/badge/cold_start-489ms-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.215 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.217 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ 🎯 handoff ν—€λ“œλΌμΈ constraints/intent μžλ™ 톡합 (15μš”μ†Œ) β•‘
17
+ β•‘ πŸ”š session close μžλ™ 톡합 (requests/pre-wake/idempotency) β•‘
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.215';
10
+ const VERSION = '1.9.217';
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 처리).
@@ -9465,7 +9465,98 @@ function sessionClose(root, opts = {}) {
9465
9465
  };
9466
9466
  } catch {}
9467
9467
  } catch {}
9468
+
9469
+ // 1.9.217: session close μžλ™ 톡합 β€” 1.9.207 + 1.9.209 + 1.9.212
9470
+ // 마감 μ‹œ λ―Έλ‹΅ μš”μ²­ / pre-wake audit / λ©±λ“±μ„± 검사 μžλ™ μ‹€ν–‰ + JSON 톡합
9471
+ try {
9472
+ // 1.9.207: λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ audit
9473
+ const reqAudit = _auditUserRequests(root);
9474
+ jsonResult.userRequestsAudit = {
9475
+ total: reqAudit.total,
9476
+ open: reqAudit.open,
9477
+ missing: reqAudit.missing ? reqAudit.missing.length : 0,
9478
+ tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
9479
+ stale: reqAudit.stale ? reqAudit.stale.length : 0
9480
+ };
9481
+ } catch {}
9482
+ try {
9483
+ // 1.9.209: pre-wake-audit μžλ™ μ‹€ν–‰ + μ €μž₯ (sleep μ „ μžλ™ 점검)
9484
+ if (!opts.noPreWake && !has('--no-pre-wake')) {
9485
+ const audit = _runPreWakeAudit(root);
9486
+ _saveAndAppendPreWakeReport(root, audit);
9487
+ jsonResult.preWakeAudit = {
9488
+ auditedAt: audit.auditedAt,
9489
+ critical: audit.summary.criticalCount,
9490
+ warning: audit.summary.warningCount,
9491
+ info: audit.summary.infoCount,
9492
+ needsAttention: audit.summary.needsAttention
9493
+ };
9494
+ }
9495
+ } catch {}
9496
+ try {
9497
+ // 1.9.212: λ©±λ“±μ„± 검사 μžλ™ μ‹€ν–‰ (rule/task/user-requests/wakeups 4μ˜μ—­)
9498
+ const idemp = _runIdempotencyAudit(root);
9499
+ jsonResult.idempotencyAudit = {
9500
+ violations: idemp.summary.totalViolations,
9501
+ high: idemp.summary.highSeverity,
9502
+ medium: idemp.summary.mediumSeverity,
9503
+ low: idemp.summary.lowSeverity,
9504
+ verified: idemp.summary.verifiedAreas,
9505
+ overall: idemp.summary.overall
9506
+ };
9507
+ } catch {}
9508
+
9468
9509
  process.stdout.write(JSON.stringify(jsonResult, null, 2) + '\n');
9510
+ } else {
9511
+ // 1.9.217: human 좜λ ₯ λͺ¨λ“œμ—μ„œλ„ 톡합 보고 λ…ΈμΆœ (마감 직전)
9512
+ try {
9513
+ const isTty = process.stdout.isTTY;
9514
+ const grn = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
9515
+ const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
9516
+ const red = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
9517
+ const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
9518
+
9519
+ log('');
9520
+ log(`## πŸ”š session close μžλ™ 톡합 보고 (1.9.217)`);
9521
+ // 1.9.207
9522
+ try {
9523
+ const reqAudit = _auditUserRequests(root);
9524
+ const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
9525
+ if (missCnt > 0) {
9526
+ log(red(` ⚠ λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ ${missCnt}건 (task-log/plan/decisions λ§€μΉ­ μ•ˆ 됨)`));
9527
+ } else if (reqAudit.open > 0) {
9528
+ log(grn(` βœ“ μ‚¬μš©μž μš”μ²­ ${reqAudit.open}건 λͺ¨λ‘ tracked`));
9529
+ } else {
9530
+ log(dim(` β„Ή μ‚¬μš©μž μš”μ²­ μ—†μŒ (UR 백둜그 λΉ„μ–΄μžˆμŒ)`));
9531
+ }
9532
+ } catch {}
9533
+ // 1.9.209
9534
+ try {
9535
+ if (!opts.noPreWake && !has('--no-pre-wake')) {
9536
+ const audit = _runPreWakeAudit(root);
9537
+ _saveAndAppendPreWakeReport(root, audit);
9538
+ const sum = audit.summary;
9539
+ if (sum.criticalCount > 0) {
9540
+ log(red(` 🚨 pre-wake-audit: critical ${sum.criticalCount} (λ‹€μŒ 깨어남 μ‹œ 점검 ν•„μš”)`));
9541
+ } else if (sum.warningCount > 0) {
9542
+ log(yel(` ⚠ pre-wake-audit: warning ${sum.warningCount}`));
9543
+ } else {
9544
+ log(grn(` βœ“ pre-wake-audit: clean (sleep μ•ˆμ „)`));
9545
+ }
9546
+ }
9547
+ } catch {}
9548
+ // 1.9.212
9549
+ try {
9550
+ const idemp = _runIdempotencyAudit(root);
9551
+ const v = idemp.summary.totalViolations;
9552
+ if (v > 0) {
9553
+ log(red(` ⚠ λ©±λ“±μ„± μœ„λ°˜ ${v}건 (high: ${idemp.summary.highSeverity})`));
9554
+ log(dim(` β†’ leerness idempotency audit 으둜 상세 확인`));
9555
+ } else {
9556
+ log(grn(` βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified ${idemp.summary.verifiedAreas} μ˜μ—­`));
9557
+ }
9558
+ } catch {}
9559
+ } catch {}
9469
9560
  }
9470
9561
  }
9471
9562
 
@@ -13284,7 +13375,12 @@ function mcpServeCmd(root) {
13284
13375
  { 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'] } },
13285
13376
  { 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'] } },
13286
13377
  { 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'] } },
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'] } }
13378
+ { 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'] } },
13379
+ { 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' } } } },
13380
+ { 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'] } },
13381
+ { 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' } } } },
13382
+ { 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'] } },
13383
+ { 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' } } } }
13288
13384
  ];
13289
13385
 
13290
13386
  function send(obj) {
@@ -13416,6 +13512,26 @@ function mcpServeCmd(root) {
13416
13512
  // 1.9.176: μ‚¬μš©μž μš”μ²­ 사전 κ²€ν†  (μ‚¬μš©μž λͺ…μ‹œ μš”μ²­)
13417
13513
  cliArgs = ['review-request', String(args.request || ''), '--path', targetPath, '--json'];
13418
13514
  break;
13515
+ case 'leerness_requests_audit':
13516
+ // 1.9.216 (1.9.207): μ‚¬μš©μž μš”μ²­ λˆ„λ½ 확인 절차
13517
+ cliArgs = ['requests', 'audit', '--path', targetPath, '--json'];
13518
+ break;
13519
+ case 'leerness_constraints_check':
13520
+ // 1.9.216 (1.9.208): ν”Œλž«νΌ/API μ œμ•½ 사전 체크
13521
+ cliArgs = ['constraints', 'check', String(args.request || ''), '--path', targetPath, '--json'];
13522
+ break;
13523
+ case 'leerness_pre_wake_audit':
13524
+ // 1.9.216 (1.9.209): pre-wake sub-agent audit
13525
+ cliArgs = ['pre-wake-audit', '--path', targetPath, '--json'];
13526
+ break;
13527
+ case 'leerness_intent_classify':
13528
+ // 1.9.216 (1.9.213): intent inference + scope expansion (dry-run)
13529
+ cliArgs = ['intent', 'expand', String(args.request || ''), '--path', targetPath, '--json'];
13530
+ break;
13531
+ case 'leerness_idempotency_audit':
13532
+ // 1.9.216 (1.9.212): λ©±λ“±μ„± 감사 (rule/task/user-requests/wakeups 4μ˜μ—­)
13533
+ cliArgs = ['idempotency', 'audit', '--path', targetPath, '--json'];
13534
+ break;
13419
13535
  default:
13420
13536
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
13421
13537
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.215",
3
+ "version": "1.9.217",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",