leerness 1.9.220 β†’ 1.9.221

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,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.221 β€” 2026-05-22
4
+
5
+ **πŸŽ‰ MCP 60 도ꡬ λ§ˆμΌμŠ€ν†€ + abnormalShutdown JSON 톡합 (handoff/session close).**
6
+
7
+ ### 1. MCP 60번째 도ꡬ β€” `leerness_session_resume`
8
+ - 1.9.220 비정상 μ’…λ£Œ 감지 μ‹œμŠ€ν…œμ„ μ™ΈλΆ€ AI에 λ…ΈμΆœ
9
+ - 인자: `{ path? }`
10
+ - 응닡: `{ abnormalShutdown, severity, signals[], resumeGuide[] }`
11
+ - 5μ‹ ν˜Έ 뢄석 (last-handoff/wakeup-missed/in-progress-stale/auto-resume-plan/release-branch)
12
+
13
+ ### 2. handoff --json `abnormalShutdown` ν•„λ“œ μΆ”κ°€
14
+ - `{ detected, severity, signalCount, signals[], resumeGuide[] }`
15
+ - μ™ΈλΆ€ λͺ¨λ‹ˆν„°λ§ 도ꡬ / CI κ°€ 비정상 μ’…λ£Œ μžλ™ 감지
16
+ - 1.9.218 톡합 νŒ¨ν„΄ ν™•μž₯ (handoff JSON 4μ’… ν•„λ“œ μ™„μ„±: userRequests/preWake/idempotency/abnormalShutdown)
17
+
18
+ ### 3. session close --json 동일 톡합
19
+ - 마감 μ‹œ λ‹€μŒ λΌμš΄λ“œ μ§„μž… μ‹œ 재개 κ°€μ΄λ“œ μžλ™ 회수
20
+ - CI 마감 ν›„ 비정상 μ’…λ£Œ detect κ°€λŠ₯
21
+
22
+ ### 4. λˆ„μ  νšŒκ·€ (1.9.207~220) β€” λͺ¨λ‘ μœ μ§€
23
+
24
+ ### 5. stress-v166 β€” 16/16 PASS
25
+ - 1.9.221 (4): VERSION + MCP 60 + session_resume 등둝 + μ‹€ 호좜 (high severity 응닡)
26
+ - abnormalShutdown JSON 톡합 (3): handoff/session close + wakeup miss μ‹œλ‚˜λ¦¬μ˜€
27
+ - μ„±λŠ₯ (2): cold_start 374ms / MCP 60 도ꡬ 385ms
28
+ - λˆ„μ  νšŒκ·€ (7): 1.9.207~220
29
+
30
+ ### 6. μžλ™ release (83 λΌμš΄λ“œ main-push streak Β· 44 λΌμš΄λ“œ npm publish streak)
31
+
32
+ πŸŽ‰ **MCP 60 도ꡬ 도달** (53 β†’ 60, +7: 1.9.168 +3 / 1.9.216 +5 / 1.9.221 +1)
33
+ πŸŽ‰ **handoff/session close JSON 4 톡합 ν•„λ“œ μ™„μ„±** (userRequests/preWake/idempotency/abnormalShutdown)
34
+
35
+ ---
36
+
3
37
  ## 1.9.220 β€” 2026-05-22
4
38
 
5
39
  **πŸ”Œ 비정상 μ’…λ£Œ ν›„ 자율 재개 μ‹œμŠ€ν…œ (μ‚¬μš©μž λͺ…μ‹œ).**
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.220-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v165-18%2F18-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-59-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-150-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-82_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![resilience](https://img.shields.io/badge/session_resume-5μ‹ ν˜Έ_μžλ™κ°μ§€-success)]() [![perf](https://img.shields.io/badge/cold_start-461ms-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.221-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v166-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-60_πŸŽ‰-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-151-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-83_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-100%2F100_(5μΆ•)-brightgreen)]() [![mcp-60](https://img.shields.io/badge/πŸŽ‰_MCP-60_도ꡬ_λ§ˆμΌμŠ€ν†€-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-374ms-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.220 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.221 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ”Œ 비정상 μ’…λ£Œ β†’ 자율 재개 5μ‹ ν˜Έ μžλ™ 감지 (μ‚¬μš©μž λͺ…μ‹œ) β•‘
17
+ β•‘ πŸŽ‰ MCP 60 도ꡬ λ§ˆμΌμŠ€ν†€ Β· handoff JSON 4 톡합 ν•„λ“œ μ™„μ„± β•‘
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.220';
10
+ const VERSION = '1.9.221';
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 처리).
@@ -5697,6 +5697,17 @@ function handoff(root) {
5697
5697
  overall: idemp.summary.overall
5698
5698
  };
5699
5699
  } catch {}
5700
+ // 1.9.221: abnormalShutdown μžλ™ 감지 (1.9.220 톡합)
5701
+ try {
5702
+ const ad = _detectAbnormalShutdown(root);
5703
+ result.abnormalShutdown = {
5704
+ detected: ad.abnormalShutdown,
5705
+ severity: ad.severity,
5706
+ signalCount: ad.signals.length,
5707
+ signals: ad.signals.map(s => ({ kind: s.kind, severity: s.severity, detail: s.detail })),
5708
+ resumeGuide: ad.resumeGuide
5709
+ };
5710
+ } catch {}
5700
5711
  log(JSON.stringify(result, null, 2));
5701
5712
  return;
5702
5713
  }
@@ -9723,6 +9734,17 @@ function sessionClose(root, opts = {}) {
9723
9734
  overall: idemp.summary.overall
9724
9735
  };
9725
9736
  } catch {}
9737
+ try {
9738
+ // 1.9.221: abnormalShutdown μžλ™ 감지 (1.9.220 톡합) β€” session close μ‹œ λ‹€μŒ 재개 κ°€μ΄λ“œ 회수
9739
+ const ad = _detectAbnormalShutdown(root);
9740
+ jsonResult.abnormalShutdown = {
9741
+ detected: ad.abnormalShutdown,
9742
+ severity: ad.severity,
9743
+ signalCount: ad.signals.length,
9744
+ signals: ad.signals.map(s => ({ kind: s.kind, severity: s.severity, detail: s.detail })),
9745
+ resumeGuide: ad.resumeGuide
9746
+ };
9747
+ } catch {}
9726
9748
 
9727
9749
  process.stdout.write(JSON.stringify(jsonResult, null, 2) + '\n');
9728
9750
  } else {
@@ -13598,7 +13620,8 @@ function mcpServeCmd(root) {
13598
13620
  { 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'] } },
13599
13621
  { 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' } } } },
13600
13622
  { 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'] } },
13601
- { 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' } } } }
13623
+ { 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' } } } },
13624
+ { name: 'leerness_session_resume', description: '1.9.221 (1.9.220 μ‚¬μš©μž λͺ…μ‹œ) β€” 비정상 μ’…λ£Œ 감지 + 자율 재개. 5μ‹ ν˜Έ 뢄석: last-handoff-stale / wakeup-missed / in-progress-stale / auto-resume-plan-unused / release-branch-pending. 응닡: { abnormalShutdown, severity (none/low/medium/high), signals[], resumeGuide[] }. μ™ΈλΆ€ AIκ°€ "μ ˆμ „/μ‹œμŠ€ν…œμ’…λ£Œ/μ„Έμ…˜μ’…λ£Œ ν›„ leerness μƒνƒœκ°€ 정상인가? μ–΄λ–»κ²Œ 재개?"λ₯Ό 회수. πŸŽ‰ MCP 60 도ꡬ λ§ˆμΌμŠ€ν†€ (53β†’60, +7 in 1.9.168/216/221). 인자: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
13602
13625
  ];
13603
13626
 
13604
13627
  function send(obj) {
@@ -13750,6 +13773,10 @@ function mcpServeCmd(root) {
13750
13773
  // 1.9.216 (1.9.212): λ©±λ“±μ„± 감사 (rule/task/user-requests/wakeups 4μ˜μ—­)
13751
13774
  cliArgs = ['idempotency', 'audit', '--path', targetPath, '--json'];
13752
13775
  break;
13776
+ case 'leerness_session_resume':
13777
+ // 1.9.221 (1.9.220): 비정상 μ’…λ£Œ 감지 + 자율 재개
13778
+ cliArgs = ['session-resume', '--path', targetPath, '--json'];
13779
+ break;
13753
13780
  default:
13754
13781
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
13755
13782
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.220",
3
+ "version": "1.9.221",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",