leerness 1.9.224 β†’ 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,42 @@
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
+
3
40
  ## 1.9.224 β€” 2026-05-22
4
41
 
5
42
  **πŸ”Œ MCP 61 도ꡬ (leerness_requests_auto_complete) + handoff λ³Έλ¬Έ + session close --auto-apply-delivered.**
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.224-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v169-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-61-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-154-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-86_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-556ms-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.224 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.225 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ”Œ MCP 61 Β· handoff λ³Έλ¬Έ + session close --auto-apply β•‘
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.224';
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 처리).
@@ -6141,8 +6141,25 @@ function handoff(root) {
6141
6141
 
6142
6142
  // 1.9.224: handoff λ³Έλ¬Έ μžλ™ λ…ΈμΆœ β€” delivered νŒ¨ν„΄ 후보 β‰₯ 1건 μ‹œ (1.9.223 ν™•μž₯)
6143
6143
  // "Round X.Y.Z β€” κ΅¬ν˜„ μ™„λ£Œ" νŒ¨ν„΄μ΄ λˆ„μ λ˜λ©΄ λ³Έλ¬Έ μ„Ήμ…˜μœΌλ‘œ μžλ™ μ•ˆλ‚΄ (ν—€λ“œλΌμΈλ§ŒμœΌλ‘œλŠ” λ†“μΉ˜κΈ° 쉬움)
6144
+ // 1.9.225: LEERNESS_AUTO_APPLY_DELIVERED=1 env ν™œμ„± μ‹œ handoff 첫 ν˜ΈμΆœμ—μ„œ μžλ™ 적용 (자율 λͺ¨λ“œμš© opt-in)
6144
6145
  try {
6145
- const delivered = _detectDeliveredRequests(root);
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
+ }
6146
6163
  if (delivered.candidates && delivered.candidates.length > 0) {
6147
6164
  const isTty = process.stdout && process.stdout.isTTY;
6148
6165
  const cy4 = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
@@ -6158,6 +6175,7 @@ function handoff(root) {
6158
6175
  }
6159
6176
  log(dm4(` β†’ κ²€ν† : leerness requests auto-complete`));
6160
6177
  log(dm4(` β†’ 적용: leerness requests auto-complete --apply (μ•ˆμ „ 정리)`));
6178
+ log(dm4(` β†’ 자율 λͺ¨λ“œ μžλ™ 적용: export LEERNESS_AUTO_APPLY_DELIVERED=1 (1.9.225)`));
6161
6179
  }
6162
6180
  } catch {}
6163
6181
 
@@ -12867,6 +12885,26 @@ function driftCheckCmd(root, opts = {}) {
12867
12885
  log(`⚠ auto-fix λ³΄μ•ˆ 회볡 였λ₯˜: ${e.message}`);
12868
12886
  }
12869
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
+ }
12870
12908
  if (autoFix && level === 'πŸ”΄ critical' && !hasSecurityFired) {
12871
12909
  log('');
12872
12910
  log(`πŸ”§ --auto-fix ν™œμ„± β€” session close μžλ™ μ‹€ν–‰ 쀑...`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.224",
3
+ "version": "1.9.225",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",