leerness 1.9.236 β†’ 1.9.238

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,77 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.238 β€” 2026-05-24
4
+
5
+ **πŸŽ‰ R100 main-push streak 달성 + CLAUDE/AGENTS/session-workflow drift 차단 (1.9.228~237 9 λΌμš΄λ“œ λˆ„μ ).**
6
+
7
+ ### 1. CLAUDE.md drift 차단 κ°±μ‹  (1.9.228~237 β€” 10 버전 톡합)
8
+ - μ‹ κ·œ μ„Ήμ…˜: "κ°€μ‹œν™” + μžλ™ν™” 9 λΌμš΄λ“œ (1.9.228~237)"
9
+ - 9 λΌμš΄λ“œ κ°œλ³„ ν•­λͺ© + 자율 λͺ¨λ“œ λ§ˆμΌμŠ€ν†€ μš”μ•½
10
+
11
+ ### 2. AGENTS.md drift 차단 κ°±μ‹ 
12
+ - "λΌμš΄λ“œ 진행도 κ°€μ‹œν™” (1.9.226~234)" μ„Ήμ…˜ ν™•μž₯ (8 ν•„λ“œ / MCP 66 / 51 CLI)
13
+ - "release cleanup μƒνƒœκ³„ (1.9.235~237 β€” 3 λΌμš΄λ“œ μ™„μ„±)" μ‹ κ·œ μ„Ήμ…˜
14
+
15
+ ### 3. session-workflow.md drift 차단 κ°±μ‹ 
16
+ - "λΌμš΄λ“œ 진행도 κ°€μ‹œν™” + μƒνƒœ λͺ…λ Ή (1.9.226~234)" β€” 4 μ‹ κ·œ λͺ…λ Ή
17
+ - "JSON 톡합 맀트릭슀 8 ν•„λ“œ (1.9.218~234)" β€” μ§„ν™” history
18
+ - "release cleanup μƒνƒœκ³„ (1.9.235~237)" β€” 3 λΌμš΄λ“œ μ™„μ„±
19
+
20
+ ### 4. πŸŽ‰ R100 main-push streak 달성 (1.9.140 β†’ 1.9.238)
21
+ - 1.9.140 (main μžλ™ push) μ‚¬μš©μž λͺ…μ‹œ λΆ€ν„° μ‹œμž‘
22
+ - 100 λΌμš΄λ“œ 연속 무손싀 μžλ™ commit + tag + push + main sync
23
+ - 1.9.178 λΆ€ν„° npm publish μžλ™ 톡합 (61 λΌμš΄λ“œ 연속)
24
+
25
+ ### 5. λˆ„μ  νšŒκ·€ (1.9.207~237) β€” λͺ¨λ‘ μœ μ§€
26
+
27
+ ### 6. stress-v183 β€” 13/13 PASS
28
+ - 1.9.238 (4): VERSION + CLAUDE 10 버전 + AGENTS κ°±μ‹  + session-workflow κ°±μ‹ 
29
+ - μ„±λŠ₯ (1): cold_start avg 312ms
30
+ - μ’…ν•© λˆ„μ  νšŒκ·€ (8): 1.9.207~237 λͺ¨λ“  μ‹œμŠ€ν…œ
31
+
32
+ ### 7. μžλ™ release (100 λΌμš΄λ“œ main-push streak πŸŽ‰ Β· 61 λΌμš΄λ“œ npm publish streak)
33
+
34
+ πŸŽ‰ **R100 main-push streak 달성** β€” leerness μžμ²΄κ°€ μ•ˆμ •μ„± 검증 μΈμŠ€ν„΄μŠ€
35
+
36
+ ---
37
+
38
+ ## 1.9.237 β€” 2026-05-24
39
+
40
+ **πŸ—‘ session close --auto-cleanup-branches + handoff body 50+ branches κ²½κ³ .**
41
+
42
+ ### 1. `session close --auto-cleanup-branches` μ˜΅μ…˜ (1.9.224 νŒ¨ν„΄ ν™•μž₯)
43
+ - 50+ release/* merged branches μ‹œ μžλ™ 정리 (keep 10)
44
+ - μ•ˆμ „: 1.9.235 κ°€λ“œ (merged 만, ν˜„μž¬ branch 보호)
45
+ - `--auto-apply-delivered` (1.9.224) 와 λ™μΌν•œ 자율 λͺ¨λ“œ νŒ¨ν„΄
46
+
47
+ ### 2. handoff body 50+ branches κ²½κ³  μžλ™ λ…ΈμΆœ
48
+ - `## πŸ—‘ release/* branches λˆ„μ  N개 (50+) (1.9.237)` λ³Έλ¬Έ μ„Ήμ…˜ μžλ™
49
+ - 3 κ°€μ§€ 정리 μ˜΅μ…˜ μžλ™ μ•ˆλ‚΄:
50
+ - μˆ˜λ™: `leerness release cleanup --apply --keep 10`
51
+ - 마감 μžλ™: `session close --auto-cleanup-branches`
52
+ - drift μžλ™: `drift check --auto-fix` (1.9.236)
53
+ - AI/μ‚¬μš©μž λˆ„μ  폐기물 κ°€μ‹œν™”
54
+
55
+ ### 3. release cleanup μƒνƒœκ³„ μ™„μ„± (3 λΌμš΄λ“œ λˆ„μ )
56
+ | λΌμš΄λ“œ | κΈ°λŠ₯ |
57
+ |---|---|
58
+ | 1.9.235 | CLI μ‹ μ„€ (μˆ˜λ™) |
59
+ | 1.9.236 | MCP 66 + drift --auto-fix 톡합 |
60
+ | **1.9.237** | **session close μžλ™ + handoff body κ²½κ³ ** ⭐ |
61
+
62
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~236) β€” λͺ¨λ‘ μœ μ§€
63
+
64
+ ### 5. stress-v182 β€” 15/15 PASS
65
+ - 1.9.237 (5): VERSION + flag μ½”λ“œ + session close μ•ˆλ‚΄ + handoff body κ²½κ³  + 격리 no-warning
66
+ - μ„±λŠ₯ (2): cold_start avg 387ms / handoff 4706ms
67
+ - λˆ„μ  νšŒκ·€ (8): 1.9.207~236
68
+
69
+ ### 6. μžλ™ release (99 λΌμš΄λ“œ main-push streak Β· 60 λΌμš΄λ“œ npm publish streak πŸŽ‰)
70
+
71
+ πŸŽ‰ **60 λΌμš΄λ“œ npm publish streak 달성** + 1 λΌμš΄λ“œ ν›„ **R100 main-push streak 도달**
72
+
73
+ ---
74
+
3
75
  ## 1.9.236 β€” 2026-05-24
4
76
 
5
77
  **πŸ”Œ MCP 66번째 도ꡬ (release_cleanup) + drift check --auto-fix 톡합 (50+ branches μžλ™ 정리).**
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.236-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v181-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-66-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-52-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-192-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-98_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![drift-recovery](https://img.shields.io/badge/πŸ”Œ_drift--auto--fix-4_톡합-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-389ms-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.238-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v183-13%2F13-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-66-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-52-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-194-blueviolet)]() [![main-push](https://img.shields.io/badge/πŸŽ‰_main--push_streak-100_rounds-success)]() [![npm-streak](https://img.shields.io/badge/πŸŽ‰_npm--publish-61_streak-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![drift-prevent](https://img.shields.io/badge/πŸ“š_drift--차단-9_λΌμš΄λ“œ_κ°±μ‹ -blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-312ms-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.236 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.238 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ”Œ MCP 66 Β· drift --auto-fix 4 톡합 (release cleanup) β•‘
17
+ β•‘ πŸŽ‰ R100 main-push streak Β· 9 λΌμš΄λ“œ doc drift 차단 β•‘
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.236';
10
+ const VERSION = '1.9.238';
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 처리).
@@ -6573,6 +6573,25 @@ function handoff(root) {
6573
6573
  }
6574
6574
  } catch {}
6575
6575
 
6576
+ // 1.9.237: handoff λ³Έλ¬Έ release/* λˆ„μ  κ²½κ³  β€” 50+ branches merged μ‹œ μžλ™ μ•ˆλ‚΄
6577
+ // 1.9.220 λΉ„μ •μƒμ’…λ£Œ release-branch-pending μ‹ ν˜Έμ˜ λ³Έλ¬Έ 보강 (handoff ν—€λ“œλΌμΈμ€ β€˜πŸ”Œ λΉ„μ •μƒμ’…λ£Œβ€™ 만 ν‘œμ‹œ)
6578
+ try {
6579
+ const branchR = cp.spawnSync('git', ['branch', '--merged', 'main', '--list', 'release/*'], { cwd: root, encoding: 'utf8' });
6580
+ if (branchR.status === 0) {
6581
+ const mergedCnt = (branchR.stdout || '').split('\n').filter(l => l.trim() && /release\/\d+\.\d+\.\d+/.test(l)).length;
6582
+ if (mergedCnt > 50) {
6583
+ const isTty = process.stdout && process.stdout.isTTY;
6584
+ const yl5 = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
6585
+ const dm5 = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
6586
+ log('');
6587
+ log(yl5(`## πŸ—‘ release/* branches λˆ„μ  ${mergedCnt}개 (50+) (1.9.237)`));
6588
+ log(dm5(` β†’ μˆ˜λ™ 정리: leerness release cleanup --apply --keep 10`));
6589
+ log(dm5(` β†’ 마감 μ‹œ μžλ™: session close --auto-cleanup-branches`));
6590
+ log(dm5(` β†’ drift μžλ™ 회볡: drift check --auto-fix (1.9.236, 50+ μ‹œ)`));
6591
+ }
6592
+ }
6593
+ } catch {}
6594
+
6576
6595
  // 1.9.224: handoff λ³Έλ¬Έ μžλ™ λ…ΈμΆœ β€” delivered νŒ¨ν„΄ 후보 β‰₯ 1건 μ‹œ (1.9.223 ν™•μž₯)
6577
6596
  // "Round X.Y.Z β€” κ΅¬ν˜„ μ™„λ£Œ" νŒ¨ν„΄μ΄ λˆ„μ λ˜λ©΄ λ³Έλ¬Έ μ„Ήμ…˜μœΌλ‘œ μžλ™ μ•ˆλ‚΄ (ν—€λ“œλΌμΈλ§ŒμœΌλ‘œλŠ” λ†“μΉ˜κΈ° 쉬움)
6578
6597
  // 1.9.225: LEERNESS_AUTO_APPLY_DELIVERED=1 env ν™œμ„± μ‹œ handoff 첫 ν˜ΈμΆœμ—μ„œ μžλ™ 적용 (자율 λͺ¨λ“œμš© opt-in)
@@ -10507,6 +10526,40 @@ function sessionClose(root, opts = {}) {
10507
10526
  log(grn(` βœ“ λ©±λ“±μ„± 검사 톡과 β€” verified ${idemp.summary.verifiedAreas} μ˜μ—­`));
10508
10527
  }
10509
10528
  } catch {}
10529
+ // 1.9.237: session close --auto-cleanup-branches β€” 50+ release/* branches μ‹œ μžλ™ 정리
10530
+ // 1.9.224 νŒ¨ν„΄ (--auto-apply-delivered) ν™•μž₯ β€” 마감 μ‹œ 운영 λˆ„μ  폐기물 μžλ™ 정리
10531
+ // μ•ˆμ „: keep 10, merged 만, ν˜„μž¬ branch 보호
10532
+ try {
10533
+ const branchR = cp.spawnSync('git', ['branch', '--merged', 'main', '--list', 'release/*'], { cwd: root, encoding: 'utf8' });
10534
+ if (branchR.status === 0) {
10535
+ const merged = (branchR.stdout || '').split('\n')
10536
+ .map(l => l.replace(/^\*?\s+/, '').trim())
10537
+ .filter(l => l && /^release\/\d+\.\d+\.\d+$/.test(l));
10538
+ if (merged.length > 50) {
10539
+ if (has('--auto-cleanup-branches')) {
10540
+ merged.sort((a, b) => {
10541
+ const va = a.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
10542
+ const vb = b.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
10543
+ for (let i = 0; i < 3; i++) if (va[i] !== vb[i]) return vb[i] - va[i];
10544
+ return 0;
10545
+ });
10546
+ const curR = cp.spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: root, encoding: 'utf8' });
10547
+ const cur = (curR.stdout || '').trim();
10548
+ const toDelete = merged.slice(10).filter(b => b !== cur);
10549
+ let okCnt = 0;
10550
+ for (const b of toDelete) {
10551
+ const r = cp.spawnSync('git', ['branch', '-d', b], { cwd: root, encoding: 'utf8' });
10552
+ if (r.status === 0) okCnt++;
10553
+ }
10554
+ log(grn(` βœ“ release 정리 ${okCnt}/${toDelete.length}건 (--auto-cleanup-branches 1.9.237, keep 10)`));
10555
+ } else {
10556
+ log(yel(` πŸ—‘ release/* merged ${merged.length}개 (50+) β€” cleanup κ°€λŠ₯ (1.9.235)`));
10557
+ log(dim(` β†’ leerness release cleanup --apply --keep 10 (μˆ˜λ™)`));
10558
+ log(dim(` β†’ λ˜λŠ” session close --auto-cleanup-branches (1.9.237 μžλ™)`));
10559
+ }
10560
+ }
10561
+ }
10562
+ } catch {}
10510
10563
  // 1.9.232: 마감 μ‹œ pulse ν•œ 쀄 μžλ™ λ…ΈμΆœ β€” λ‹€μŒ λΌμš΄λ“œ μ§„μž… μ‹œ μ¦‰μ‹œ μƒνƒœ 인지
10511
10564
  try {
10512
10565
  const rh = _computeRoundHistory(root);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.236",
3
+ "version": "1.9.238",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",