leerness 1.9.183 β 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 +161 -0
- package/README.md +3 -3
- package/bin/harness.js +73 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,166 @@
|
|
|
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
|
+
|
|
77
|
+
## 1.9.184 β 2026-05-21
|
|
78
|
+
|
|
79
|
+
**π¨ μ€μΉ UX 4μ’
β Ctrl+C νμΈ prompt + λ‘λ©λ° + skillpack μ μΈ + DEP0190 μ΅μ (μ¬μ©μ λͺ
μ).**
|
|
80
|
+
|
|
81
|
+
μμ¨ λͺ¨λ 114 λΌμ΄λ. μ¬μ©μ λͺ
μ 4μ’
:
|
|
82
|
+
1. *"μ€μΉ κ°μ΄λμμ Ctrl+C μ
λ ₯ μ μ€μΉ μ’
λ£ μ¬λΆ νμΈ λ‘μ§ μΆκ°"* β SIGINT handler (2λ¨κ³ confirm)
|
|
83
|
+
2. *"leerness νμΌ μ€μΉ μμ μ λ‘λ©λ°λ‘ ꡬν + μμ± λͺ©λ‘ λμ΄ X"* β progress bar (TTY)
|
|
84
|
+
3. *"leerness-skillpack λ―Έμ¬μ© μμ β μ μΈ"* β μλ΄ λ©μμ§ μ κ±°
|
|
85
|
+
4. *"REPL agent λͺ¨λ μ§μ
μ DEP0190 deprecation warning μ κ±°"* β process warning handler
|
|
86
|
+
|
|
87
|
+
### Fix #1 β Ctrl+C μ’
λ£ νμΈ prompt
|
|
88
|
+
```js
|
|
89
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): μ€μΉ λμ€ Ctrl+C μ μ’
λ£ νμΈ prompt.
|
|
90
|
+
// 첫 Ctrl+C β μλ΄ (2μ΄ μ΄λ΄ ν λ² λ β μ’
λ£, κ·Έ μΈ β κ³μ).
|
|
91
|
+
let _sigintCount = 0; let _sigintTimer = null;
|
|
92
|
+
const _sigintHandler = () => {
|
|
93
|
+
_sigintCount++;
|
|
94
|
+
if (_sigintCount === 1) {
|
|
95
|
+
process.stdout.write('\n\n β μ€μΉ μ€λ¨νμκ² μ΅λκΉ? Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€. (κ·Έ μΈ β κ³μ μ§ν)\n');
|
|
96
|
+
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
process.exit(130);
|
|
100
|
+
};
|
|
101
|
+
```
|
|
102
|
+
install μμμ λ±λ‘, μ’
λ£/REPL μ§μ
μ cleanup.
|
|
103
|
+
|
|
104
|
+
### Fix #2 β νμΌ μ€μΉ progress bar (μμ± λͺ©λ‘ λ―Ένμ)
|
|
105
|
+
**Before** (line by line):
|
|
106
|
+
```
|
|
107
|
+
β create: AGENTS.md
|
|
108
|
+
β create: CLAUDE.md
|
|
109
|
+
β create: .harness/HARNESS_VERSION
|
|
110
|
+
β create: .harness/manifest.json
|
|
111
|
+
... (μμ μ€)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**After** (single progress bar):
|
|
115
|
+
```
|
|
116
|
+
ββββββββββββββββββββ 24/30 (80%) .harness/skills/office/SKILL.md
|
|
117
|
+
```
|
|
118
|
+
μλ£ μ:
|
|
119
|
+
```
|
|
120
|
+
β leerness νμΌ μ€μΉ μλ£ (30κ°)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Fix #3 β leerness-skillpack μλ΄ μ κ±°
|
|
124
|
+
```diff
|
|
125
|
+
- if (SKILLPACK_SOURCE === 'builtin') log(`Skill catalog source: builtin (leerness-skillpack λ―Έμ€μΉ β npm i leerness-skillpack λ‘ νμ₯ κ°λ₯)`);
|
|
126
|
+
- else log(`Skill catalog source: ${SKILLPACK_SOURCE} (leerness-skillpack${SKILLPACK_META ? ` v${SKILLPACK_META.version}` : ''})`);
|
|
127
|
+
+ // 1.9.184 (μ¬μ©μ λͺ
μ): leerness-skillpack λ―Έμ¬μ© μ μ±
β μλ΄ λ©μμ§ μ κ±°. builtin catalog λ§ μ¬μ©.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Fix #4 β DEP0190 DeprecationWarning μ΅μ
|
|
131
|
+
νμΌ μ΅μλ¨μμ process warning handler λ±λ‘:
|
|
132
|
+
```js
|
|
133
|
+
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ΅μ (μ¬μ©μ λͺ
μ).
|
|
134
|
+
// leerness λ cross-platform PATH resolution μ μν΄ shell: true λ₯Ό μλμ μΌλ‘ μ¬μ©.
|
|
135
|
+
process.removeAllListeners('warning');
|
|
136
|
+
process.on('warning', (w) => {
|
|
137
|
+
if (w && (w.code === 'DEP0190' || /DEP0190/.test(String(w.message || '')))) return;
|
|
138
|
+
process.stderr.write(`(node:${process.pid}) ${w.name || 'Warning'}: ${w.message || w}\n`);
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Before** (REPL μ§μ
μ):
|
|
143
|
+
```
|
|
144
|
+
agent[claude/actor/βΆ]> (node:54076) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true...
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**After** (REPL μ§μ
μ):
|
|
148
|
+
```
|
|
149
|
+
agent[claude/actor/βΆ]> _
|
|
150
|
+
```
|
|
151
|
+
κΉλ.
|
|
152
|
+
|
|
153
|
+
### Verified
|
|
154
|
+
- stress-v129: **14/14 PASS** (μ¬μ©μ λͺ
μ 4 + live install 3 + λμ 7)
|
|
155
|
+
- e2e 217/217 baseline μ μ§
|
|
156
|
+
- live install κ²μ¦:
|
|
157
|
+
- DEP0190 μΆλ ₯ μ λ¨ β
|
|
158
|
+
- "Skill catalog source: builtin" μλ΄ μμ β
|
|
159
|
+
- νμΌ μμ± λͺ©λ‘ 0건 (non-TTY) β
|
|
160
|
+
- VERSION = 1.9.184 Β· autonomous-rounds = 114 Β· main μλ push 45 λΌμ΄λ μ°μ
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
3
164
|
## 1.9.183 β 2026-05-21
|
|
4
165
|
|
|
5
166
|
**π¦ npm i leerness + ꡬλ²μ μλ κ°μ§/κ²½κ³ /μ
λ°μ΄νΈ λͺ
λ Ήμ΄ μλ΄ (μ¬μ©μ λͺ
μ 3μ’
).**
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **AI μ½λ© μμ΄μ νΈμ κ±°μ§ μλ£Β·μ€λ³΅Β·λ§κ°Β·μΆ©λμ λ§μμ£Όλ κ²μΒ·κΈ°μ΅Β·νμ
CLI νλ€μ€.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []() []() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
β βββ ββββββ ββββββ ββββββββββββββββββββββββ ββββββββ β
|
|
13
13
|
β βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββ β
|
|
14
14
|
β βββββββββββββββββββββββββββ ββββββ βββββββββββββββββββββ β
|
|
15
|
-
β v1.9.
|
|
15
|
+
β v1.9.185 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π§ DEP0190 μμ μ νΒ·REPL μΉμ μ§λ¨Β·Hermes UX λΆμ β
|
|
18
18
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -7,7 +7,23 @@ 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.
|
|
10
|
+
const VERSION = '1.9.185';
|
|
11
|
+
|
|
12
|
+
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ΅μ (μ¬μ©μ λͺ
μ).
|
|
13
|
+
// leerness λ cross-platform PATH resolution μ μν΄ shell: true λ₯Ό μλμ μΌλ‘ μ¬μ© (claude.cmd / ollama.cmd λ± Windows .cmd μ²λ¦¬).
|
|
14
|
+
// μΈμ escape κ° νμν μμΉλ κ²μ¦λ μ
λ ₯λ§ spawnSync μ μ λ¬. REPL agent μ§μ
μ _checkAgent κ° λ°μ°νλ λ
Έμ΄μ¦ μ κ±°.
|
|
15
|
+
process.removeAllListeners('warning');
|
|
16
|
+
process.on('warning', (w) => {
|
|
17
|
+
if (w && (w.code === 'DEP0190' || /DEP0190/.test(String(w.message || '')))) return;
|
|
18
|
+
process.stderr.write(`(node:${process.pid}) ${w.name || 'Warning'}: ${w.message || w}\n`);
|
|
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
|
+
}
|
|
26
|
+
|
|
11
27
|
const MARK = '<!-- leerness:managed -->';
|
|
12
28
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
13
29
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -767,6 +783,26 @@ async function resolveInstallOptions(root, opts = {}) {
|
|
|
767
783
|
|
|
768
784
|
async function install(root, opts = {}) {
|
|
769
785
|
root = absRoot(root); mkdirp(root);
|
|
786
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): μ€μΉ λμ€ Ctrl+C μ μ’
λ£ νμΈ prompt.
|
|
787
|
+
// 첫 Ctrl+C β μλ΄ (2μ΄ μ΄λ΄ ν λ² λ β μ’
λ£, κ·Έ μΈ β κ³μ).
|
|
788
|
+
// readline raw mode μ readline μ΄ 'SIGINT' μ΄λ²€νΈλ‘ ν‘μν μ μμ΄ process-level + finally ν΄μ .
|
|
789
|
+
let _sigintCount = 0; let _sigintTimer = null;
|
|
790
|
+
const _sigintHandler = () => {
|
|
791
|
+
_sigintCount++;
|
|
792
|
+
if (_sigintCount === 1) {
|
|
793
|
+
try { process.stdout.write('\n\n β μ€μΉ μ€λ¨νμκ² μ΅λκΉ? Ctrl+C λ₯Ό 2μ΄ μ΄λ΄μ ν λ² λ λλ₯΄λ©΄ μ’
λ£λ©λλ€. (κ·Έ μΈ β κ³μ μ§ν)\n'); } catch {}
|
|
794
|
+
clearTimeout(_sigintTimer);
|
|
795
|
+
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 2000);
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
clearTimeout(_sigintTimer);
|
|
799
|
+
try { process.stdout.write('\n β μ€μΉ μ€λ¨λ¨ (μ¬μ©μ μμ²)\n'); } catch {}
|
|
800
|
+
process.exit(130);
|
|
801
|
+
};
|
|
802
|
+
if (!opts.migration && !opts.nonInteractive && process.stdin.isTTY) {
|
|
803
|
+
process.on('SIGINT', _sigintHandler);
|
|
804
|
+
}
|
|
805
|
+
const _cleanupSigint = () => { try { process.removeListener('SIGINT', _sigintHandler); clearTimeout(_sigintTimer); } catch {} };
|
|
770
806
|
// 1.9.41: migrate μ§μ μ΄μ λ²μ μΊ‘μ² β μ°¨λΆ μλ΄μ μ¬μ©
|
|
771
807
|
try {
|
|
772
808
|
const hv = path.join(root, '.harness', 'HARNESS_VERSION');
|
|
@@ -796,8 +832,7 @@ async function install(root, opts = {}) {
|
|
|
796
832
|
if (resolved.startRepl) log(`REPL μλ μμ: μ (μ€μΉ μλ£ ν \`leerness agent\` μ§μ
)`);
|
|
797
833
|
if (resolved.permissionMode) log(`Agent κΆν λͺ¨λ: ${resolved.permissionMode} (1.9.174 β REPLμμ \`:permissions extended|full\` λ‘ μ¦μ λ³κ²½ κ°λ₯)`);
|
|
798
834
|
// 1.9.10: μ€ν¬ μΉ΄νλ‘κ·Έ μΆμ² μλ΄
|
|
799
|
-
|
|
800
|
-
else log(`Skill catalog source: ${SKILLPACK_SOURCE} (leerness-skillpack${SKILLPACK_META ? ` v${SKILLPACK_META.version}` : ''})`);
|
|
835
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): leerness-skillpack λ―Έμ¬μ© μ μ±
β μλ΄ λ©μμ§ μ κ±°. builtin catalog λ§ μ¬μ©.
|
|
801
836
|
const files = coreFiles(root, lang, skills);
|
|
802
837
|
const backup = createBackup(root, opts.force ? 'force' : (opts.migration ? 'migration' : 'init'), files, opts.dry);
|
|
803
838
|
if (opts.dry) {
|
|
@@ -816,7 +851,20 @@ async function install(root, opts = {}) {
|
|
|
816
851
|
'.claude/commands/handoff.md','.claude/commands/session-close.md','.claude/commands/audit.md','.claude/commands/lazy-detect.md','.claude/commands/update.md',
|
|
817
852
|
'.claude/skills/leerness.md'
|
|
818
853
|
]);
|
|
854
|
+
// 1.9.184 (μ¬μ©μ λͺ
μ): νμΌ μ€μΉ β μμ± λͺ©λ‘ λμ΄ X, λ‘λ©λ° + λ¨μΌ μλ£ λ©μμ§.
|
|
819
855
|
const actions = [];
|
|
856
|
+
const totalFiles = Object.keys(files).length;
|
|
857
|
+
const isTty = process.stdout.isTTY && !opts.dry;
|
|
858
|
+
const drawProgress = (done, file) => {
|
|
859
|
+
if (!isTty) return;
|
|
860
|
+
const pct = Math.round(done * 100 / totalFiles);
|
|
861
|
+
const filled = Math.floor(pct / 5);
|
|
862
|
+
const bar = '\x1b[36m' + 'β'.repeat(filled) + '\x1b[2m' + 'β'.repeat(20 - filled) + '\x1b[0m';
|
|
863
|
+
const truncFile = (file || '').length > 32 ? '...' + file.slice(-29) : (file || '');
|
|
864
|
+
process.stdout.write(`\r ${bar} \x1b[1m${done}/${totalFiles}\x1b[0m (${pct}%) \x1b[2m${truncFile}\x1b[0m\x1b[K`);
|
|
865
|
+
};
|
|
866
|
+
drawProgress(0, '');
|
|
867
|
+
let _done = 0;
|
|
820
868
|
for (const [f, c] of Object.entries(files)) {
|
|
821
869
|
const existsNow = exists(path.join(root, f));
|
|
822
870
|
const mergeManaged = managedOverwrite.has(f);
|
|
@@ -828,7 +876,12 @@ async function install(root, opts = {}) {
|
|
|
828
876
|
}
|
|
829
877
|
const r = writeIfSafe(root, f, c, { force: opts.force, mergeManaged, archiveDir: backup.archiveDir });
|
|
830
878
|
actions.push(r);
|
|
831
|
-
|
|
879
|
+
_done++;
|
|
880
|
+
drawProgress(_done, f);
|
|
881
|
+
}
|
|
882
|
+
if (isTty) {
|
|
883
|
+
process.stdout.write('\r\x1b[K'); // clear progress line
|
|
884
|
+
log(` \x1b[32mβ\x1b[0m leerness νμΌ μ€μΉ μλ£ (${totalFiles}κ°)`);
|
|
832
885
|
}
|
|
833
886
|
if (!opts.dry) {
|
|
834
887
|
mergeLinesFile(path.join(root, '.gitignore'), [
|
|
@@ -943,11 +996,13 @@ async function install(root, opts = {}) {
|
|
|
943
996
|
log('');
|
|
944
997
|
log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό μμν©λλ€...');
|
|
945
998
|
log('');
|
|
999
|
+
_cleanupSigint(); // 1.9.184: REPL μ§μ
μ SIGINT handler ν΄μ (readline μ΄ μ체 μ²λ¦¬)
|
|
946
1000
|
try {
|
|
947
1001
|
await _agentRepl(root, { role: 'actor' }); // provider λ―Έμ§μ β _agentRepl μ auto-select λμ (1.9.181 fix)
|
|
948
1002
|
} catch (e) { warn('REPL μ§μ
μ€ν¨: ' + e.message); }
|
|
949
1003
|
}
|
|
950
1004
|
}
|
|
1005
|
+
_cleanupSigint(); // 1.9.184: install ν¨μ μ’
λ£ μ SIGINT handler ν΄μ (λͺ¨λ μ’
λ£ κ²½λ‘)
|
|
951
1006
|
}
|
|
952
1007
|
|
|
953
1008
|
function installSkills(root, skills) { for (const name of skills) addSkill(root, name, true); }
|
|
@@ -11819,14 +11874,25 @@ async function _agentRepl(root, opts) {
|
|
|
11819
11874
|
}
|
|
11820
11875
|
if (state.history.length % 6 === 0) saveSession(); // 6ν΄λ§λ€ μλ μ μ₯
|
|
11821
11876
|
} else {
|
|
11822
|
-
|
|
11823
|
-
|
|
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 μλ΄
|
|
11824
11890
|
try {
|
|
11825
11891
|
const others = EXTERNAL_AGENTS.filter(a => a.id !== state.provider)
|
|
11826
11892
|
.map(a => ({ def: a, status: _checkAgent(a) }))
|
|
11827
11893
|
.filter(x => x.status.status === 'ready');
|
|
11828
11894
|
if (others.length) {
|
|
11829
|
-
log(C.dim(` π‘
|
|
11895
|
+
log(C.dim(` π‘ μ¦μ μ ν: ${others.map(x => `:provider ${x.def.id}`).join(' Β· ')} λλ Tab ν€`));
|
|
11830
11896
|
} else {
|
|
11831
11897
|
log(C.dim(` π‘ λ€λ₯Έ provider νμ±ν: .env μμ LEERNESS_ENABLE_<CLAUDE|CODEX|GEMINI|COPILOT>=1`));
|
|
11832
11898
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.185",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|