leerness 1.9.184 β†’ 1.9.185

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,79 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.185 β€” 2026-05-21
4
+
5
+ **πŸ”§ DEP0190 μžμ‹ process μ „νŒŒ fix + REPL stream 친절 진단 + Hermes UX 뢄석 보고 (μ‚¬μš©μž λͺ…μ‹œ).**
6
+
7
+ 자율 λͺ¨λ“œ 115 λΌμš΄λ“œ. μ‚¬μš©μž λͺ…μ‹œ 3μ’…:
8
+ 1. *"REPL μ—μ΄μ „νŠΈ λͺ¨λ“œ ꡬ동 μ‹€νŒ¨ + μΆ”λ‘ λ‚΄μš©/diff λ―Έν‘œμ‹œ"* β†’ μΉœμ ˆν•œ 진단 λ©”μ‹œμ§€
9
+ 2. *"agent[claude/actor/β–Ά]> (node:54076) [DEP0190] ..."* β†’ μžμ‹ process μ „νŒŒ fix
10
+ 3. *"SSH duffy@192.168.68.89 의 hermes REPL UX 확인 β†’ μœ μ‚¬ κ΅¬ν˜„"* β†’ λ³΄κ³ μ„œ μž‘μ„±
11
+
12
+ ### Fix #1 β€” DEP0190 μžμ‹ process μ „νŒŒ
13
+ 1.9.184 의 `process.on('warning')` ν•Έλ“€λŸ¬λŠ” λΆ€λͺ¨λ§Œ. claude/codex/gemini CLI κ°€ λ‚΄λΆ€ Node child λ₯Ό spawnν•  λ•Œ μžμ‹μ— 상속 X β†’ μ‚¬μš©μž REPL μž…λ ₯ 후에도 DEP0190 좜λ ₯.
14
+
15
+ ```js
16
+ // 1.9.185 (μ‚¬μš©μž λͺ…μ‹œ): NODE_OPTIONS=--no-deprecation μžλ™ μ„€μ • β†’ λͺ¨λ“  Node child κΉŒμ§€ μ „νŒŒ.
17
+ if (!/--no-deprecation/.test(process.env.NODE_OPTIONS || '')) {
18
+ process.env.NODE_OPTIONS = ((process.env.NODE_OPTIONS || '') + ' --no-deprecation').trim();
19
+ }
20
+ ```
21
+
22
+ `process.env` 변경은 μžμ‹ spawn μ‹œ 상속. λΆ€λͺ¨λŠ” 1.9.184 의 `process.on('warning')` 으둜 처리.
23
+
24
+ ### Fix #2 β€” REPL stream μ‹€νŒ¨ 친절 진단
25
+ **Before**:
26
+ ```
27
+ agent[claude/actor/β–Ά]> μ›Ήκ°œλ°œμ„ μ§„ν–‰ν•΄μ€˜
28
+ ── /stream (120053ms) ──
29
+ ⚠ μ‹€νŒ¨: exit=null
30
+ πŸ’‘ μ „ν™˜ κ°€λŠ₯: :provider codex / :provider gemini / :provider copilot
31
+ ```
32
+
33
+ **After**:
34
+ ```
35
+ agent[claude/actor/β–Ά]> μ›Ήκ°œλ°œμ„ μ§„ν–‰ν•΄μ€˜
36
+ ── /stream (120053ms) ──
37
+ ⚠ claude CLI 응닡 μ‹€νŒ¨: exit=null
38
+ ↳ κ°€λŠ₯ 원인: (1) claude CLI 응닡 μ‹œκ°„ 초과 (λͺ¨λΈ λ‘œλ”©/큰 응닡 λŒ€κΈ° 쀑)
39
+ (2) network/auth 문제 (특히 codex/gemini λŠ” 인터넷 + 토큰 ν•„μš”)
40
+ ↳ 직접 검증: claude --print "ping"
41
+ πŸ’‘ μ¦‰μ‹œ μ „ν™˜: :provider codex Β· :provider gemini Β· :provider copilot λ˜λŠ” Tab ν‚€
42
+ ```
43
+
44
+ μ‹€νŒ¨ μΌ€μ΄μŠ€ λΆ„κΈ°:
45
+ - `exit=null` / `timeout` β†’ 응닡 μ‹œκ°„ 초과 + 직접 검증 λͺ…λ Ή
46
+ - `exit=1` / `unauth` / `login` β†’ 인증 λˆ„λ½ + login λͺ…λ Ή (claude/codex/gemini login, copilot=gh auth login)
47
+
48
+ ### #3 β€” Hermes UX 뢄석 (μ‚¬μš©μž SSH 접속 μš”μ²­)
49
+
50
+ **SSH λ³΄μ•ˆ μ •μ±…**: νŒ¨μŠ€μ›Œλ“œλŠ” `LEERNESS_SSH_PASS` env λ³€μˆ˜λ‘œλ§Œ 전달. paramiko μž„μ‹œ μŠ€ν¬λ¦½νŠΈλŠ” 뢄석 μ™„λ£Œ ν›„ μ¦‰μ‹œ μ‚­μ œ. μ½”λ“œ/λ‘œκ·Έμ— μ ˆλŒ€ μ €μž₯ X.
51
+
52
+ **Hermes 사양 확인** (v0.14.0, Python 3.11, 89 commands Β· 29 tools Β· 85 skills):
53
+ - μœ„μΉ˜: `~/.local/bin/hermes` (Ollama hermes-gemma:latest)
54
+ - 2-column Welcome λ°•μŠ€ (logo + toolsets/skills catalog)
55
+ - μ‹€μ‹œκ°„ μƒνƒœλ°”: `βš• model β”‚ ctx % β”‚ [progress bar] β”‚ elapsed β”‚ ⏲ timer`
56
+ - minimal prompt: `❯ `
57
+ - slash commands: `/help`, `/compress`, `/quit`
58
+ - `-z/--oneshot` 슀크립트 λͺ¨λ“œ (λ°°λ„ˆ/μŠ€ν”Όλ„ˆ/μ„Έμ…˜ID λͺ¨λ‘ 제거)
59
+
60
+ **leerness 차용 후보** (1.9.186+):
61
+ 1. μƒνƒœλ°” μ‹€μ‹œκ°„ κ°±μ‹  (`⚑ provider β”‚ ctx N% β”‚ [bar] β”‚ elapsed β”‚ ⏲ timer`)
62
+ 2. `:compress` slash command β€” context μ••μΆ•
63
+ 3. 2-column Welcome λ°•μŠ€ μž¬λ””μžμΈ
64
+ 4. `--oneshot/-z` λͺ…ν™•ν™” (λ°°λ„ˆ/μŠ€ν”Όλ„ˆ 제거)
65
+ 5. Tip 라인 (`✦ Tip: ...`)
66
+
67
+ 상세 λ³΄κ³ μ„œ: `_reports/hermes-ux-analysis-1.9.185.md` (λΉ„κ³΅κ°œ)
68
+
69
+ ### Verified
70
+ - stress-v130: **15/15 PASS** (μ‚¬μš©μž λͺ…μ‹œ 4 + live 3 + λˆ„μ  8)
71
+ - e2e 217/217 baseline μœ μ§€
72
+ - `agents list` 호좜: DEP0190 좜λ ₯ μ—†μŒ βœ“
73
+ - VERSION = 1.9.185 Β· autonomous-rounds = 115 Β· main μžλ™ push 46 λΌμš΄λ“œ 연속
74
+
75
+ ---
76
+
3
77
  ## 1.9.184 β€” 2026-05-21
4
78
 
5
79
  **🎨 μ„€μΉ˜ UX 4μ’… β€” Ctrl+C 확인 prompt + λ‘œλ”©λ°” + skillpack μ œμ™Έ + DEP0190 μ–΅μ œ (μ‚¬μš©μž λͺ…μ‹œ).**
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.184-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v129-14%2F14-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-114-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-45_rounds-success)]() [![install-ux](https://img.shields.io/badge/μ„€μΉ˜_UX-Ctrl%2BC확인%2Bλ‘œλ”©λ°”-success)]() [![dep-clean](https://img.shields.io/badge/DEP0190-μ–΅μ œ-success)]() [![install](https://img.shields.io/badge/npm_i_leerness-μ¦‰μ‹œ_μ‚¬μš©_κ°€λŠ₯-success)]() [![stale-check](https://img.shields.io/badge/ꡬ버전_감지-λͺ¨λ“ _λͺ…λ Ή-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.185-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v130-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-115-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-46_rounds-success)]() [![dep-child](https://img.shields.io/badge/DEP0190-λΆ€λͺ¨%2Bμžμ‹_μ „νŒŒ-success)]() [![repl-diag](https://img.shields.io/badge/REPL_μ‹€νŒ¨-친절_진단_μ•ˆλ‚΄-success)]() [![hermes-ux](https://img.shields.io/badge/Hermes_UX-뢄석_μ™„λ£Œ-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.184 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.185 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ 🎨 μ„€μΉ˜ UX κ°œμ„  (λ‘œλ”©λ°”Β·Ctrl+C확인·DEP0190 μ–΅μ œΒ·κΉ¨λ—ν•œ REPL) β•‘
17
+ β•‘ πŸ”§ DEP0190 μžμ‹ μ „νŒŒΒ·REPL 친절 진단·Hermes UX 뢄석 β•‘
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.184';
10
+ const VERSION = '1.9.185';
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 처리).
@@ -17,6 +17,12 @@ process.on('warning', (w) => {
17
17
  if (w && (w.code === 'DEP0190' || /DEP0190/.test(String(w.message || '')))) return;
18
18
  process.stderr.write(`(node:${process.pid}) ${w.name || 'Warning'}: ${w.message || w}\n`);
19
19
  });
20
+ // 1.9.185 (μ‚¬μš©μž λͺ…μ‹œ): REPL μ§„μž… ν›„ user input μ‹œμ μ—λ„ DEP0190 λ°œμƒ (claude/ollama CLI κ°€ Node μžμ‹ spawn μ‹œ μžμ‹μ˜ λ…Έμ΄μ¦ˆ).
21
+ // λΆ€λͺ¨ ν•Έλ“€λŸ¬λŠ” μžμ‹μ— 상속 X β†’ NODE_OPTIONS=--no-deprecation 으둜 λͺ¨λ“  Node child κΉŒμ§€ μ „νŒŒ.
22
+ // process.env 변경은 μžμ‹ spawn μ‹œ 상속 (이미 μ‹œμž‘λœ λΆ€λͺ¨μ—λŠ” 영ν–₯ X, λΆ€λͺ¨λŠ” μœ„μ˜ 'warning' ν•Έλ“€λŸ¬λ‘œ 처리).
23
+ if (!/--no-deprecation/.test(process.env.NODE_OPTIONS || '')) {
24
+ process.env.NODE_OPTIONS = ((process.env.NODE_OPTIONS || '') + ' --no-deprecation').trim();
25
+ }
20
26
 
21
27
  const MARK = '<!-- leerness:managed -->';
22
28
  const README_START = '<!-- leerness:project-readme:start -->';
@@ -11868,14 +11874,25 @@ async function _agentRepl(root, opts) {
11868
11874
  }
11869
11875
  if (state.history.length % 6 === 0) saveSession(); // 6ν„΄λ§ˆλ‹€ μžλ™ μ €μž₯
11870
11876
  } else {
11871
- log(C.yel(` ⚠ μ‹€νŒ¨: ${result.error || 'unknown'}`));
11872
- // 1.9.164: μ‹€νŒ¨ μ‹œ μ¦‰μ‹œ μ „ν™˜ κ°€λŠ₯ provider μ•ˆλ‚΄ (UX κ°œμ„  β€” μ‚¬μš©μž λͺ…μ‹œ μš”μ²­)
11877
+ // 1.9.185 (μ‚¬μš©μž λͺ…μ‹œ): REPL 호좜 μ‹€νŒ¨ μΉœμ ˆν•œ 진단 β€” μ–΄λŠ λ‹¨κ³„μ—μ„œ μ‹€νŒ¨ν–ˆλŠ”μ§€ + μ¦‰μ‹œ 검증 λͺ…λ Ή μ•ˆλ‚΄
11878
+ const errMsg = result.error || 'unknown';
11879
+ log(C.yel(` ⚠ ${state.provider} CLI 응닡 μ‹€νŒ¨: ${errMsg}`));
11880
+ // μ‹€νŒ¨ 원인 λΆ„λ₯˜
11881
+ if (/exit=null/.test(errMsg) || /timeout/i.test(errMsg)) {
11882
+ log(C.dim(` ↳ κ°€λŠ₯ 원인: (1) ${state.provider} CLI 응닡 μ‹œκ°„ 초과 (λͺ¨λΈ λ‘œλ”©/큰 응닡 λŒ€κΈ° 쀑)`));
11883
+ log(C.dim(` (2) network/auth 문제 (특히 codex/gemini λŠ” 인터넷 + 토큰 ν•„μš”)`));
11884
+ log(C.dim(` ↳ 직접 검증: ${state.provider} --print "ping" ${state.provider === 'gemini' ? '--yolo' : ''}`));
11885
+ } else if (/exit=1/.test(errMsg) || /unauth/i.test(errMsg) || /login/i.test(errMsg)) {
11886
+ log(C.dim(` ↳ κ°€λŠ₯ 원인: 인증 λˆ„λ½ (login ν•„μš”)`));
11887
+ log(C.dim(` ↳ ν•΄κ²°: ${state.provider} login ${state.provider === 'copilot' ? '(gh auth login)' : ''}`));
11888
+ }
11889
+ // μ „ν™˜ κ°€λŠ₯ provider μ•ˆλ‚΄
11873
11890
  try {
11874
11891
  const others = EXTERNAL_AGENTS.filter(a => a.id !== state.provider)
11875
11892
  .map(a => ({ def: a, status: _checkAgent(a) }))
11876
11893
  .filter(x => x.status.status === 'ready');
11877
11894
  if (others.length) {
11878
- log(C.dim(` πŸ’‘ μ „ν™˜ κ°€λŠ₯: ${others.map(x => `:provider ${x.def.id}`).join(' / ')}`));
11895
+ log(C.dim(` πŸ’‘ μ¦‰μ‹œ μ „ν™˜: ${others.map(x => `:provider ${x.def.id}`).join(' Β· ')} λ˜λŠ” Tab ν‚€`));
11879
11896
  } else {
11880
11897
  log(C.dim(` πŸ’‘ λ‹€λ₯Έ provider ν™œμ„±ν™”: .env μ—μ„œ LEERNESS_ENABLE_<CLAUDE|CODEX|GEMINI|COPILOT>=1`));
11881
11898
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.184",
3
+ "version": "1.9.185",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",