leerness 1.9.216 β†’ 1.9.218

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,86 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.218 β€” 2026-05-22
4
+
5
+ **πŸ” handoff --json 톡합 κ°•ν™” + 5μΆ• 맀트릭슀 보강 (98β†’100 후보).**
6
+
7
+ ### 1. handoff --json 톡합 ν•„λ“œ μΆ”κ°€ (session close 와 동일 νŒ¨ν„΄)
8
+ | ν•„λ“œ | 좜처 | λ‚΄μš© |
9
+ |---|---|---|
10
+ | `userRequestsAudit` | 1.9.207 | total/open/missing/tracked/stale |
11
+ | `preWakeAudit` | 1.9.209 | auditedAt/ageMin/critical/warning/needsAttention (λ³΄κ³ μ„œ μžˆμ„ λ•Œλ§Œ) |
12
+ | `idempotencyAudit` | 1.9.212 | violations/high/medium/low/verified/overall |
13
+
14
+ ### 2. JSON 일관성 확보 β€” handoff / session close / health / drift check 4μ’… λͺ¨λ‘ 톡합
15
+ - μ™ΈλΆ€ μžλ™ν™” 도ꡬ / CI κ°€ 4 JSON λͺ…λ ΉμœΌλ‘œ μ’…ν•© 회수 κ°€λŠ₯
16
+ - 1.9.207~213 μ‹ κ·œ κΈ°λŠ₯이 λͺ¨λ“  μ£Όμš” JSON 좜λ ₯에 λ…ΈμΆœ
17
+
18
+ ### 3. 5μΆ• 맀트릭슀 보강 (98 β†’ 100 후보)
19
+ 1.9.207~217 11 λΌμš΄λ“œ λˆ„μ  영ν–₯:
20
+ - **AμΆ• (λ²”μš© AI ν•˜λ„€μŠ€)** 9.5β†’10: 1.9.208 constraints (6 ν”Œλž«νΌ catalog) + 1.9.213 intent (5 도메인)
21
+ - **BμΆ• (λ©€ν‹° Sub-Agent)** 9.5β†’10: 1.9.209 pre-wake audit + 1.9.216 MCP 5μ’… (59 도ꡬ)
22
+ - **CμΆ• (곡식 μŠ€ν‚¬)** 10/10 μœ μ§€
23
+ - **DμΆ• (μž₯κΈ° λ§₯락)** 9.5β†’10: 1.9.211 .harnessβ†’.leerness AI μ°Έμ‘° κ°€μ΄λ“œ
24
+ - **EμΆ• (κ²ŒμœΌλ¦„ λ°©μ§€)** 9.5β†’10: 1.9.207 λ―Έλ‹΅ μš”μ²­ + 1.9.212 λ©±λ“±μ„± + 1.9.217 session close 톡합
25
+
26
+ β†’ **100/100 (5μΆ• 평균 10/10)**
27
+
28
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~217) β€” λͺ¨λ‘ μœ μ§€
29
+
30
+ ### 5. stress-v163 β€” 16/16 PASS
31
+ - 1.9.218 (5): VERSION + JSON 톡합 3μ’… ν•„λ“œ 검증
32
+ - userRequestsAudit total=1 검증, idempotency overall=clean 검증
33
+ - pre-wake-audit μžλ™ 톡합 검증
34
+ - μ„±λŠ₯ (2): cold_start 450ms / MCP 59 도ꡬ 417ms
35
+ - λˆ„μ  νšŒκ·€ (9)
36
+
37
+ ### 6. μžλ™ release (80 λΌμš΄λ“œ main-push streak Β· 41 λΌμš΄λ“œ npm publish streak)
38
+
39
+ πŸŽ‰ **5μΆ• 맀트릭슀 100/100 도달**
40
+
41
+ ---
42
+
43
+ ## 1.9.217 β€” 2026-05-22
44
+
45
+ **πŸ”š session close μžλ™ 톡합 β€” 1.9.207/209/212 μžλ™ 호좜.**
46
+
47
+ ### 1. session close μžλ™ 호좜 3μ’… (마감 μ‹œ)
48
+ | μ˜μ—­ | 좜처 | λ™μž‘ |
49
+ |---|---|---|
50
+ | `userRequestsAudit` | 1.9.207 | open/in-progress μš”μ²­ β†’ missing/tracked/stale λΆ„λ₯˜ |
51
+ | `preWakeAudit` | 1.9.209 | sleep μ „ 6 μ˜μ—­ audit + .harness/pre-wake-report.json μžλ™ μ €μž₯ |
52
+ | `idempotencyAudit` | 1.9.212 | 4μ˜μ—­ λ©±λ“±μ„± 검사 (rule/task/user-requests/wakeups) |
53
+
54
+ ### 2. JSON λͺ¨λ“œ (`--json`) 톡합 ν•„λ“œ μΆ”κ°€
55
+ - `userRequestsAudit: { total, open, missing, tracked, stale }`
56
+ - `preWakeAudit: { auditedAt, critical, warning, info, needsAttention }`
57
+ - `idempotencyAudit: { violations, high, medium, low, verified, overall }`
58
+
59
+ ### 3. human 좜λ ₯ μžλ™ μ„Ήμ…˜
60
+ ```
61
+ ## πŸ”š session close μžλ™ 톡합 보고 (1.9.217)
62
+ ⚠ λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ N건 (task-log/plan/decisions λ§€μΉ­ μ•ˆ 됨)
63
+ 🚨 pre-wake-audit: critical N (λ‹€μŒ 깨어남 μ‹œ 점검 ν•„μš”)
64
+ βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified 4 μ˜μ—­
65
+ ```
66
+
67
+ ### 4. opt-out μ˜΅μ…˜
68
+ - `--no-pre-wake` β€” pre-wake audit μŠ€ν‚΅
69
+ - μ˜΅μ…˜ μ™Έ λ‹€λ₯Έ 톡합은 항상 μ‹€ν–‰ (가벼움)
70
+
71
+ ### 5. λˆ„μ  νšŒκ·€ (1.9.207~216) β€” λͺ¨λ‘ μœ μ§€
72
+
73
+ ### 6. stress-v162 β€” 18/18 PASS
74
+ - 1.9.217 (7): VERSION + JSON ν•„λ“œ + human μ„Ήμ…˜ + μžλ™ μ €μž₯ + opt-out + ν•„λ“œ ꡬ쑰 + clean
75
+ - μ„±λŠ₯ (2): cold_start 489ms / MCP 59 도ꡬ 785ms
76
+ - λˆ„μ  νšŒκ·€ (9)
77
+
78
+ ### 7. μžλ™ release (79 λΌμš΄λ“œ main-push streak Β· 40 λΌμš΄λ“œ npm publish streak)
79
+
80
+ πŸŽ‰ **session close κ°•ν™”** β€” λ§€ 마감 μ‹œ 운영 μ•ˆμ „ μžλ™ 점검
81
+
82
+ ---
83
+
3
84
  ## 1.9.216 β€” 2026-05-22
4
85
 
5
86
  **πŸ”Œ MCP 5μ’… μΆ”κ°€ β€” 1.9.207~213 μ™ΈλΆ€ AI λ…ΈμΆœ (54 β†’ 59 도ꡬ).**
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.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)]()
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.218-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v163-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-59-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-148-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-80_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![handoff-json](https://img.shields.io/badge/handoff_JSON-3μ’…_톡합-success)]() [![perf](https://img.shields.io/badge/cold_start-450ms-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.216 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.218 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ”Œ MCP 59 도ꡬ (1.9.207~213 μ™ΈλΆ€ AI λ…ΈμΆœ +5μ’…) β•‘
17
+ β•‘ πŸŽ‰ 5μΆ• 맀트릭슀 100/100 Β· handoff JSON 3μ’… 톡합 (μ™ΈλΆ€ μžλ™ν™”) β•‘
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.216';
10
+ const VERSION = '1.9.218';
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 처리).
@@ -5486,6 +5486,42 @@ function handoff(root) {
5486
5486
  };
5487
5487
  } catch {}
5488
5488
  } catch {}
5489
+ // 1.9.218: handoff JSON 톡합 κ°•ν™” β€” 1.9.207/209/212 μžλ™ 톡합 (session close 와 동일 νŒ¨ν„΄)
5490
+ try {
5491
+ const reqAudit = _auditUserRequests(root);
5492
+ result.userRequestsAudit = {
5493
+ total: reqAudit.total,
5494
+ open: reqAudit.open,
5495
+ missing: reqAudit.missing ? reqAudit.missing.length : 0,
5496
+ tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
5497
+ stale: reqAudit.stale ? reqAudit.stale.length : 0
5498
+ };
5499
+ } catch {}
5500
+ try {
5501
+ const pwState = _loadPreWakeReport(root);
5502
+ if (pwState.reports.length > 0) {
5503
+ const latest = pwState.reports[pwState.reports.length - 1];
5504
+ const ageMin = Math.floor((Date.now() - new Date(latest.auditedAt).getTime()) / 60000);
5505
+ result.preWakeAudit = {
5506
+ auditedAt: latest.auditedAt,
5507
+ ageMin,
5508
+ critical: latest.summary?.criticalCount || 0,
5509
+ warning: latest.summary?.warningCount || 0,
5510
+ needsAttention: !!latest.summary?.needsAttention
5511
+ };
5512
+ }
5513
+ } catch {}
5514
+ try {
5515
+ const idemp = _runIdempotencyAudit(root);
5516
+ result.idempotencyAudit = {
5517
+ violations: idemp.summary.totalViolations,
5518
+ high: idemp.summary.highSeverity,
5519
+ medium: idemp.summary.mediumSeverity,
5520
+ low: idemp.summary.lowSeverity,
5521
+ verified: idemp.summary.verifiedAreas,
5522
+ overall: idemp.summary.overall
5523
+ };
5524
+ } catch {}
5489
5525
  log(JSON.stringify(result, null, 2));
5490
5526
  return;
5491
5527
  }
@@ -9465,7 +9501,98 @@ function sessionClose(root, opts = {}) {
9465
9501
  };
9466
9502
  } catch {}
9467
9503
  } catch {}
9504
+
9505
+ // 1.9.217: session close μžλ™ 톡합 β€” 1.9.207 + 1.9.209 + 1.9.212
9506
+ // 마감 μ‹œ λ―Έλ‹΅ μš”μ²­ / pre-wake audit / λ©±λ“±μ„± 검사 μžλ™ μ‹€ν–‰ + JSON 톡합
9507
+ try {
9508
+ // 1.9.207: λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ audit
9509
+ const reqAudit = _auditUserRequests(root);
9510
+ jsonResult.userRequestsAudit = {
9511
+ total: reqAudit.total,
9512
+ open: reqAudit.open,
9513
+ missing: reqAudit.missing ? reqAudit.missing.length : 0,
9514
+ tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
9515
+ stale: reqAudit.stale ? reqAudit.stale.length : 0
9516
+ };
9517
+ } catch {}
9518
+ try {
9519
+ // 1.9.209: pre-wake-audit μžλ™ μ‹€ν–‰ + μ €μž₯ (sleep μ „ μžλ™ 점검)
9520
+ if (!opts.noPreWake && !has('--no-pre-wake')) {
9521
+ const audit = _runPreWakeAudit(root);
9522
+ _saveAndAppendPreWakeReport(root, audit);
9523
+ jsonResult.preWakeAudit = {
9524
+ auditedAt: audit.auditedAt,
9525
+ critical: audit.summary.criticalCount,
9526
+ warning: audit.summary.warningCount,
9527
+ info: audit.summary.infoCount,
9528
+ needsAttention: audit.summary.needsAttention
9529
+ };
9530
+ }
9531
+ } catch {}
9532
+ try {
9533
+ // 1.9.212: λ©±λ“±μ„± 검사 μžλ™ μ‹€ν–‰ (rule/task/user-requests/wakeups 4μ˜μ—­)
9534
+ const idemp = _runIdempotencyAudit(root);
9535
+ jsonResult.idempotencyAudit = {
9536
+ violations: idemp.summary.totalViolations,
9537
+ high: idemp.summary.highSeverity,
9538
+ medium: idemp.summary.mediumSeverity,
9539
+ low: idemp.summary.lowSeverity,
9540
+ verified: idemp.summary.verifiedAreas,
9541
+ overall: idemp.summary.overall
9542
+ };
9543
+ } catch {}
9544
+
9468
9545
  process.stdout.write(JSON.stringify(jsonResult, null, 2) + '\n');
9546
+ } else {
9547
+ // 1.9.217: human 좜λ ₯ λͺ¨λ“œμ—μ„œλ„ 톡합 보고 λ…ΈμΆœ (마감 직전)
9548
+ try {
9549
+ const isTty = process.stdout.isTTY;
9550
+ const grn = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
9551
+ const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
9552
+ const red = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
9553
+ const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
9554
+
9555
+ log('');
9556
+ log(`## πŸ”š session close μžλ™ 톡합 보고 (1.9.217)`);
9557
+ // 1.9.207
9558
+ try {
9559
+ const reqAudit = _auditUserRequests(root);
9560
+ const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
9561
+ if (missCnt > 0) {
9562
+ log(red(` ⚠ λ―Έλ‹΅ μ‚¬μš©μž μš”μ²­ ${missCnt}건 (task-log/plan/decisions λ§€μΉ­ μ•ˆ 됨)`));
9563
+ } else if (reqAudit.open > 0) {
9564
+ log(grn(` βœ“ μ‚¬μš©μž μš”μ²­ ${reqAudit.open}건 λͺ¨λ‘ tracked`));
9565
+ } else {
9566
+ log(dim(` β„Ή μ‚¬μš©μž μš”μ²­ μ—†μŒ (UR 백둜그 λΉ„μ–΄μžˆμŒ)`));
9567
+ }
9568
+ } catch {}
9569
+ // 1.9.209
9570
+ try {
9571
+ if (!opts.noPreWake && !has('--no-pre-wake')) {
9572
+ const audit = _runPreWakeAudit(root);
9573
+ _saveAndAppendPreWakeReport(root, audit);
9574
+ const sum = audit.summary;
9575
+ if (sum.criticalCount > 0) {
9576
+ log(red(` 🚨 pre-wake-audit: critical ${sum.criticalCount} (λ‹€μŒ 깨어남 μ‹œ 점검 ν•„μš”)`));
9577
+ } else if (sum.warningCount > 0) {
9578
+ log(yel(` ⚠ pre-wake-audit: warning ${sum.warningCount}`));
9579
+ } else {
9580
+ log(grn(` βœ“ pre-wake-audit: clean (sleep μ•ˆμ „)`));
9581
+ }
9582
+ }
9583
+ } catch {}
9584
+ // 1.9.212
9585
+ try {
9586
+ const idemp = _runIdempotencyAudit(root);
9587
+ const v = idemp.summary.totalViolations;
9588
+ if (v > 0) {
9589
+ log(red(` ⚠ λ©±λ“±μ„± μœ„λ°˜ ${v}건 (high: ${idemp.summary.highSeverity})`));
9590
+ log(dim(` β†’ leerness idempotency audit 으둜 상세 확인`));
9591
+ } else {
9592
+ log(grn(` βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified ${idemp.summary.verifiedAreas} μ˜μ—­`));
9593
+ }
9594
+ } catch {}
9595
+ } catch {}
9469
9596
  }
9470
9597
  }
9471
9598
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.216",
3
+ "version": "1.9.218",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",