leerness 1.9.229 β†’ 1.9.230

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,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.230 β€” 2026-05-23
4
+
5
+ **πŸ“Š handoff/session close/health --json milestones 톡합 (7 ν•„λ“œ μ™„μ„±) + ν—€λ“œλΌμΈ ETA μž„λ°• ν‘œμ‹œ.**
6
+
7
+ ### 1. handoff/session close/health --json 7번째 톡합 ν•„λ“œ `milestones`
8
+ - 1.9.229 milestones 데이터λ₯Ό JSON 3 λͺ…λ Ή λͺ¨λ‘μ— 톡합
9
+ - 동일 ν˜•μ‹: `{ reachedCount, reached: [{milestone, version, reachedAt}], next, avgRoundsPerDay }`
10
+ - 1.9.218 (4 ν•„λ“œ) β†’ 1.9.223 (5) β†’ 1.9.227 (6) β†’ 1.9.230 (**7 ν•„λ“œ**)
11
+
12
+ ### 2. 3 λͺ…λ Ή milestones 동일 ν˜•μ‹ 일관성
13
+ - handoff/session close/health λͺ¨λ‘ λ™μΌν•œ `milestones` 객체 λ°˜ν™˜
14
+ - μ™ΈλΆ€ μžλ™ν™”/CI κ°€ μ–΄λŠ λͺ…λ ΉμœΌλ‘œ μ‘°νšŒν•΄λ„ 동일 κ²°κ³Ό
15
+ - 일관성 맀트릭슀: 3 λͺ…λ Ή Γ— 7 ν•„λ“œ = **21 톡합 포인트**
16
+
17
+ ### 3. handoff ν—€λ“œλΌμΈ μž„λ°• ETA ν‘œμ‹œ (1.9.230)
18
+ - λ‹€μŒ λ§ˆμΌμŠ€ν†€μ΄ **10R 이내** + ETAκ°€ **7일 이내** 일 λ•Œλ§Œ 별도 λ…ΈμΆœ
19
+ - `🎯 R200 ETA 2026-05-24` ν˜•μ‹ (ν˜„μž¬λŠ” 14R 남아 보호 κ°€λ“œ λ°œλ™ X)
20
+ - λ§ˆμΌμŠ€ν†€ μž„λ°• μ‹œ μžλ™ κ°•μ‘° (슀팸 λ°©μ§€: 쑰건 μΆ©μ‘± μ‹œλ§Œ)
21
+
22
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~229) β€” λͺ¨λ‘ μœ μ§€
23
+
24
+ ### 5. stress-v175 β€” 17/17 PASS
25
+ - 1.9.230 (7): VERSION + handoff/session close/health JSON + 3 λͺ…λ Ή 일관성 + 7 ν•„λ“œ 검증 + ν—€λ“œλΌμΈ ETA
26
+ - μ„±λŠ₯ (2): cold_start avg 439ms / handoff --json (7 ν•„λ“œ) 1019ms
27
+ - λˆ„μ  νšŒκ·€ (8): 1.9.207~229
28
+
29
+ ### 6. μžλ™ release (92 λΌμš΄λ“œ main-push streak Β· 53 λΌμš΄λ“œ npm publish streak)
30
+
31
+ πŸ“Š **JSON 톡합 맀트릭슀 7 ν•„λ“œ μ™„μ„±** β€” μ™ΈλΆ€ μžλ™ν™”κ°€ leerness μƒνƒœλ₯Ό 7 차원 동기 회수 (3 λͺ…λ Ή 일관성)
32
+
33
+ ---
34
+
3
35
  ## 1.9.229 β€” 2026-05-23
4
36
 
5
37
  **🎯 leerness milestones CLI + MCP 63번째 도ꡬ (도달 λ§ˆμΌμŠ€ν†€ + ETA 예츑).**
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.229-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v174-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-63-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-185-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-91_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![milestones](https://img.shields.io/badge/🎯_milestones-R175_β†’_R200_ETA-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-442ms-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.230-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v175-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-63-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-186-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-92_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![json-7fields](https://img.shields.io/badge/πŸ“Š_JSON_톡합_ν•„λ“œ-7%2F7-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-439ms-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.229 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.230 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ 🎯 milestones CLI Β· MCP 63 Β· 도달 이λ ₯ + ETA 예츑 β•‘
17
+ β•‘ πŸ“Š JSON 3 λͺ…λ Ή Γ— 7 ν•„λ“œ = 21 톡합 포인트 β•‘
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.229';
10
+ const VERSION = '1.9.230';
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 처리).
@@ -6006,6 +6006,16 @@ function handoff(root) {
6006
6006
  avgRoundsPerDay: rh.avgRoundsPerDay
6007
6007
  };
6008
6008
  } catch {}
6009
+ // 1.9.230: milestones 톡합 (handoff JSON 7번째 톡합 ν•„λ“œ) β€” 도달 λ§ˆμΌμŠ€ν†€ + ETA
6010
+ try {
6011
+ const ms = _computeMilestones(root);
6012
+ result.milestones = {
6013
+ reachedCount: ms.reached.length,
6014
+ reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
6015
+ next: ms.next,
6016
+ avgRoundsPerDay: ms.avgRoundsPerDay
6017
+ };
6018
+ } catch {}
6009
6019
  } catch {}
6010
6020
  try {
6011
6021
  const pwState = _loadPreWakeReport(root);
@@ -6169,6 +6179,7 @@ function handoff(root) {
6169
6179
  }
6170
6180
  } catch {}
6171
6181
  // 17) 1.9.226: round-history ν—€λ“œλΌμΈ β€” 자율 λΌμš΄λ“œ μΉ΄μš΄ν„° + λ‹€μŒ λ§ˆμΌμŠ€ν†€ (5 λΌμš΄λ“œ 이상 μ‹œλ§Œ ν‘œμ‹œ)
6182
+ // 1.9.230: λ‹€μŒ λ§ˆμΌμŠ€ν†€ ETA (10R 이내 + ETA 7일 이내일 λ•Œ κ°•μ‘°)
6172
6183
  try {
6173
6184
  const rh = _computeRoundHistory(root);
6174
6185
  if (rh.roundCount >= 5) {
@@ -6177,6 +6188,13 @@ function handoff(root) {
6177
6188
  label += ` β†’ R${rh.nextMilestone} (${rh.roundsToNextMilestone}R λ‚¨μŒ)`;
6178
6189
  }
6179
6190
  parts.push(label);
6191
+ // 1.9.230: μž„λ°• λ§ˆμΌμŠ€ν†€ ETA 별도 λ…ΈμΆœ (λ‹€μŒ λ§ˆμΌμŠ€ν†€μ΄ 맀우 κ°€κΉŒμšΈ λ•Œλ§Œ)
6192
+ try {
6193
+ const ms = _computeMilestones(root);
6194
+ if (ms.next && ms.next.roundsRemaining <= 10 && ms.next.etaDays != null && ms.next.etaDays <= 7) {
6195
+ parts.push(`🎯 R${ms.next.milestone} ETA ${ms.next.etaDate}`);
6196
+ }
6197
+ } catch {}
6180
6198
  }
6181
6199
  } catch {}
6182
6200
  // 12) 1.9.204: μžλ™ λͺ¨λ“œ ν™œμ„± ν‘œμ‹œ (μ‚¬μš©μž λͺ…μ‹œ) β€” R-0001 every-round λ£° ν™œμ„± μ‹œ ν—€λ“œλΌμΈ λ…ΈμΆœ
@@ -10143,6 +10161,16 @@ function sessionClose(root, opts = {}) {
10143
10161
  avgRoundsPerDay: rh.avgRoundsPerDay
10144
10162
  };
10145
10163
  } catch {}
10164
+ // 1.9.230: milestones 톡합 (session close JSON 7번째 톡합 ν•„λ“œ)
10165
+ try {
10166
+ const ms = _computeMilestones(root);
10167
+ jsonResult.milestones = {
10168
+ reachedCount: ms.reached.length,
10169
+ reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
10170
+ next: ms.next,
10171
+ avgRoundsPerDay: ms.avgRoundsPerDay
10172
+ };
10173
+ } catch {}
10146
10174
  } catch {}
10147
10175
  try {
10148
10176
  // 1.9.209: pre-wake-audit μžλ™ μ‹€ν–‰ + μ €μž₯ (sleep μ „ μžλ™ 점검)
@@ -16474,6 +16502,16 @@ function healthCmd(root) {
16474
16502
  avgRoundsPerDay: rh.avgRoundsPerDay
16475
16503
  };
16476
16504
  } catch { out.roundHistory = { error: 'roundHistory 점검 μ‹€νŒ¨' }; }
16505
+ // 1.9.230: health --json milestones 톡합 (handoff/session close/health 3 λͺ…λ Ή 일관성 μœ μ§€)
16506
+ try {
16507
+ const ms = _computeMilestones(root);
16508
+ out.milestones = {
16509
+ reachedCount: ms.reached.length,
16510
+ reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
16511
+ next: ms.next,
16512
+ avgRoundsPerDay: ms.avgRoundsPerDay
16513
+ };
16514
+ } catch { out.milestones = { error: 'milestones 점검 μ‹€νŒ¨' }; }
16477
16515
  // 1.9.163: 5λŠ₯λ ₯ 맀트릭슀 μžλ™ 평가 (1.9.155 sub-agent 점검 β†’ μ½”λ“œ 기반 μžλ™ν™”)
16478
16516
  // 각 λŠ₯λ ₯을 μ½”λ“œ grep 으둜 κ²€μΆœ β†’ 0~100 점수. μ‚¬μš©μžκ°€ λ§€ health 호좜 μ‹œ leerness 자기 평가 확인.
16479
16517
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.229",
3
+ "version": "1.9.230",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",