leerness 1.9.180 β 1.9.181
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 +71 -0
- package/README.md +3 -3
- package/bin/harness.js +37 -51
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.181 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**πͺ REPL μ§μ
νλ¦ μ 리 β μ¬μ©μ λͺ
μ 4μ’
+ μ§μ ꡬλ μ€ νΈμΆ κ²μ¦.**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 111 λΌμ΄λ. μ¬μ©μ μ§μ ꡬλ ν
μ€νΈ κ²°κ³Ό λ³΄κ³ (μ€ν¬λ¦°μ· 첨λΆ):
|
|
8
|
+
1. *"1.9.149 Hermes/OpenClaw μ€νμΌ λ±μ 문ꡬλ μ κ±°"* β μ€μΉ μλ£ λ©μμ§ λ¨μν
|
|
9
|
+
2. *"μ΄ λ¨κ³μμ Ollama μ μΈν λͺ¨λΈμ μ ννλλ° REPL μ§μ
μ Ollama μ°μ νΈμΆ"* β installβREPL provider μλ μ ν
|
|
10
|
+
3. *"νλ‘λ°μ΄λ μ ν μ ν λ¨κ³ μμ΄ λ°λ‘ μ±ν
λͺ¨λλ‘ μ§μ
"* β μ§μ
prompt μ κ±°
|
|
11
|
+
4. *"REPLμ μ§μ ꡬλν΄μ λͺ
λ Ή μ
λ ₯ν΄λ³΄κ³ κ°λ°/μΉ/PC/μΆλ‘ /μ§λ¬Έ-λ΅λ³ λμ ν
μ€νΈ"* β agents multi --execute μ€ νΈμΆ κ²μ¦
|
|
12
|
+
|
|
13
|
+
### Fix #1 β 문ꡬ λ¨μν
|
|
14
|
+
```diff
|
|
15
|
+
- log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό μμν©λλ€ (1.9.149 Hermes/OpenClaw μ€νμΌ)...');
|
|
16
|
+
+ log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό μμν©λλ€...');
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Fix #2 β installβREPL provider νλμ½λ© μ κ±°
|
|
20
|
+
```diff
|
|
21
|
+
- await _agentRepl(root, { provider: 'ollama', role: 'actor' }); // 1.9.151 β 무쑰건 ollama
|
|
22
|
+
+ await _agentRepl(root, { role: 'actor' }); // provider λ―Έμ§μ β auto-select λμ (1.9.181 fix)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Fix #3 β λΉ-Ollama μ°μ μλ μ ν (Ollama μ°μ νΈμΆ X)
|
|
26
|
+
```js
|
|
27
|
+
const ready = EXTERNAL_AGENTS.map(a => ({ def: a, status: _checkAgent(a) }))
|
|
28
|
+
.filter(x => x.status.status === 'ready');
|
|
29
|
+
const nonOllama = ready.filter(x => x.def.id !== 'ollama');
|
|
30
|
+
if (nonOllama.length >= 1) {
|
|
31
|
+
// λΉ-Ollama νμ± β 첫 λ²μ§Έ μλ (μ¬μ©μ λͺ
μ: Ollama μ°μ νΈμΆ X)
|
|
32
|
+
initialProvider = nonOllama[0].def.id;
|
|
33
|
+
_autoPickNote = nonOllama.length === 1
|
|
34
|
+
? `${initialProvider} μλ μ ν (νμ± CLI 1κ°)`
|
|
35
|
+
: `${initialProvider} μλ μ ν (νμ± CLI ${nonOllama.length}κ° Β· TabμΌλ‘ μ ν)`;
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Fix #4 β provider μ ν prompt λ¨κ³ μ κ±° (μλ μ ν)
|
|
40
|
+
μ΄μ :
|
|
41
|
+
```
|
|
42
|
+
β Ollama λ―Έκ°λ λλ λͺ¨λΈ μμ
|
|
43
|
+
π‘ νμ± μΈλΆ CLI 4κ° λ°κ²¬ β provider μ ν κ°λ₯:
|
|
44
|
+
1) claude (v2.1.145)
|
|
45
|
+
2) codex (vcodex-cli 0.132.0)
|
|
46
|
+
...
|
|
47
|
+
provider μ ν (λ²νΈ / Enter=ollama κ³μ): _
|
|
48
|
+
```
|
|
49
|
+
μ§κΈ:
|
|
50
|
+
```
|
|
51
|
+
βΈ Provider: claude μλ μ ν (νμ± CLI 4κ° Β· TabμΌλ‘ μ ν)
|
|
52
|
+
[μ±ν
λͺ¨λ μ¦μ μ§μ
]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### μ§μ ꡬλ μ€ νΈμΆ κ²μ¦ (μ¬μ©μ λͺ
μ 4λ²μ§Έ μμ²)
|
|
56
|
+
```bash
|
|
57
|
+
$ leerness agents multi "1+1=? μ«μλ§ λ΅ν΄μ£ΌμΈμ." --only claude,gemini --execute --timeout 30
|
|
58
|
+
β claude Β· 4810ms Β· 1 ν ν°
|
|
59
|
+
β gemini Β· 1266ms Β· exit=null
|
|
60
|
+
best: claude Β· score=0.600
|
|
61
|
+
--- μ²μ 600μ ---
|
|
62
|
+
2
|
|
63
|
+
```
|
|
64
|
+
**claude μΆλ‘ μλ΅ μ μ**. geminiλ λ³λ νκ²½ μ΄μ (--yolo κΆν λλ quota β 1.9.182μμ μΆκ° λλ²κ·Έ ν보).
|
|
65
|
+
|
|
66
|
+
### Verified
|
|
67
|
+
- stress-v126: **18/18** (μ¬μ©μ λͺ
μ 4 + μλ μ ν λμ 4 + μ§μ ꡬλ 2 + VERSION+λμ νκ· 8)
|
|
68
|
+
- e2e 217/217 baseline μ μ§
|
|
69
|
+
- claude μ€ νΈμΆ 4810ms Β· μλ΅ "2" β REPL agentμ ν΅μ¬ λ₯λ ₯ (μ€ λͺ¨λΈ νΈμΆ + μΆλ‘ + μλ΅ μμ ) λμ νμΈ
|
|
70
|
+
- VERSION = 1.9.181 Β· autonomous-rounds = 111 Β· main μλ push 42 λΌμ΄λ μ°μ
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
3
74
|
## 1.9.180 β 2026-05-21
|
|
4
75
|
|
|
5
76
|
**π§ REPL Tab cycle ν΅μ¬ fix + μ±ν
μμ separator β μ¬μ©μ λͺ
μ (μ§μ ꡬλ ν
μ€νΈ κ²°κ³Ό).**
|
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.181 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β πͺ REPL μ§μ
νλ¦ μ 리 (provider μλ μ ν Β· μ€νΈμΆ κ²μ¦) β
|
|
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.
|
|
10
|
+
const VERSION = '1.9.181';
|
|
11
11
|
const MARK = '<!-- leerness:managed -->';
|
|
12
12
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
13
13
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -934,12 +934,13 @@ async function install(root, opts = {}) {
|
|
|
934
934
|
// resolveInstallOptions (1.9.146) κ° μ΄λ―Έ λͺ¨λ prompt λͺ¨μ μμΉμ ν΅ν©λ 4μ§μ λ€ prompt μμ.
|
|
935
935
|
// λ³λ setupAgents λͺ
λ Ήμ μ¬μ©μκ° λͺ
μμ μΌλ‘ `leerness setup-agents` νΈμΆ μμλ§.
|
|
936
936
|
// 1.9.151: μ€μΉ μλ£ μ§ν β startRepl μ ν μ REPL agent λͺ¨λ μ¦μ μ§μ
(μ¬μ©μ λͺ
μ μμ²)
|
|
937
|
+
// 1.9.181: 문ꡬ λ¨μν + provider νλμ½λ© μ κ±° (μ¬μ©μ λͺ
μ β install μ νν CLIλ₯Ό REPLμ΄ μλ μ ν)
|
|
937
938
|
if (resolved.startRepl && !opts.migration && process.stdin.isTTY && process.env.LEERNESS_NO_PROMPT !== '1') {
|
|
938
939
|
log('');
|
|
939
|
-
log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό
|
|
940
|
+
log('π μ€μΉ μλ£ β REPL agent λͺ¨λλ₯Ό μμν©λλ€...');
|
|
940
941
|
log('');
|
|
941
942
|
try {
|
|
942
|
-
await _agentRepl(root, {
|
|
943
|
+
await _agentRepl(root, { role: 'actor' }); // provider λ―Έμ§μ β _agentRepl μ auto-select λμ (1.9.181 fix)
|
|
943
944
|
} catch (e) { warn('REPL μ§μ
μ€ν¨: ' + e.message); }
|
|
944
945
|
}
|
|
945
946
|
}
|
|
@@ -11066,23 +11067,28 @@ async function _agentRepl(root, opts) {
|
|
|
11066
11067
|
bold: s => `\x1b[1m${s}\x1b[0m`, green: s => `\x1b[32m${s}\x1b[0m`,
|
|
11067
11068
|
yel: s => `\x1b[33m${s}\x1b[0m`, mag: s => `\x1b[35m${s}\x1b[0m`
|
|
11068
11069
|
} : { cy:s=>s, dim:s=>s, bold:s=>s, green:s=>s, yel:s=>s, mag:s=>s };
|
|
11069
|
-
// 1.9.
|
|
11070
|
+
// 1.9.181 fix: provider μλ μ ν β prompt λ¨κ³ μ κ±°νκ³ μ¦μ μ±ν
λͺ¨λ μ§μ
(μ¬μ©μ λͺ
μ).
|
|
11071
|
+
// μ μ±
: λΉ-Ollama νμ± CLI μ°μ β Ollama β fallback. 볡μ νμ± μ prompt μμ΄ μ²« λΉ-Ollama μλ μ ν.
|
|
11072
|
+
// μ¬μ©μ μλ: "νλ‘λ°μ΄λ μ ν μ ν λ¨κ³μμ΄ λ°λ‘ μ±ν
λͺ¨λλ‘ μ§μ
ν΄λ λ κ±°κ°μ" + "Ollamaλ₯Ό μ°μ νΈμΆ X".
|
|
11073
|
+
// Tab μΌλ‘ μΈμ λ cycle κ°λ₯νλ―λ‘ μλ μ νν΄λ μ¬μ©μκ° μ¦μ μ ν κ°λ₯.
|
|
11070
11074
|
let initialProvider = opts.provider;
|
|
11075
|
+
let _autoPickNote = '';
|
|
11071
11076
|
if (!initialProvider) {
|
|
11072
11077
|
const ready = EXTERNAL_AGENTS.map(a => ({ def: a, status: _checkAgent(a) }))
|
|
11073
11078
|
.filter(x => x.status.status === 'ready');
|
|
11074
|
-
|
|
11075
|
-
|
|
11076
|
-
|
|
11077
|
-
|
|
11078
|
-
|
|
11079
|
-
|
|
11080
|
-
|
|
11081
|
-
|
|
11082
|
-
|
|
11083
|
-
|
|
11079
|
+
const nonOllama = ready.filter(x => x.def.id !== 'ollama');
|
|
11080
|
+
if (nonOllama.length >= 1) {
|
|
11081
|
+
// λΉ-Ollama νμ± β 첫 λ²μ§Έ μλ (μ¬μ©μ λͺ
μ: Ollama μ°μ νΈμΆ X)
|
|
11082
|
+
initialProvider = nonOllama[0].def.id;
|
|
11083
|
+
_autoPickNote = nonOllama.length === 1
|
|
11084
|
+
? `${initialProvider} μλ μ ν (νμ± CLI 1κ°)`
|
|
11085
|
+
: `${initialProvider} μλ μ ν (νμ± CLI ${nonOllama.length}κ° Β· TabμΌλ‘ μ ν)`;
|
|
11086
|
+
} else if (ready.length === 1) {
|
|
11087
|
+
initialProvider = ready[0].def.id; // ollama λ¨λ
|
|
11088
|
+
_autoPickNote = `${initialProvider} μλ μ ν`;
|
|
11084
11089
|
} else {
|
|
11085
|
-
initialProvider = 'ollama'; // νμ± 0κ° β fallback
|
|
11090
|
+
initialProvider = 'ollama'; // νμ± 0κ° β fallback
|
|
11091
|
+
_autoPickNote = 'fallback ollama (νμ± CLI μμ β .env μμ LEERNESS_ENABLE_* νμ±ν κΆμ₯)';
|
|
11086
11092
|
}
|
|
11087
11093
|
}
|
|
11088
11094
|
// μΈμ
state
|
|
@@ -11116,47 +11122,27 @@ async function _agentRepl(root, opts) {
|
|
|
11116
11122
|
log('');
|
|
11117
11123
|
log(C.dim(` βΈ Welcome back Β· ${wsName} (${rel(process.cwd(), absRoot(root))})`));
|
|
11118
11124
|
log(C.dim(` βΈ Session: ${state.sessionId}`));
|
|
11125
|
+
if (_autoPickNote) log(C.dim(` βΈ Provider: ${_autoPickNote}`));
|
|
11119
11126
|
log('');
|
|
11120
|
-
//
|
|
11127
|
+
// 1.9.181 fix: provider μ§μ
μμ prompt λ¨κ³ μ κ±° β μλ μ νλ§ μν (μ¬μ©μ λͺ
μ β λ°λ‘ μ±ν
λͺ¨λ μ§μ
).
|
|
11121
11128
|
if (state.provider === 'ollama' && !state.model) {
|
|
11122
|
-
|
|
11129
|
+
// Ollama μ¬μ© κ°λ₯ β 첫 λͺ¨λΈ μλ μ ν (μ¬μ©μ prompt μμ)
|
|
11123
11130
|
const r = await _ollamaListModels();
|
|
11124
11131
|
if (r.ok && r.models.length) {
|
|
11125
|
-
|
|
11126
|
-
|
|
11127
|
-
const choice = await new Promise(res => rl.question(C.cy('\n λͺ¨λΈ λ²νΈ μ ν (Enter=1): '), res));
|
|
11128
|
-
const idx = parseInt(choice, 10) - 1;
|
|
11129
|
-
state.model = (idx >= 0 && idx < r.models.length) ? r.models[idx] : r.models[0];
|
|
11130
|
-
log(C.green(` β λͺ¨λΈ μ ν: ${state.model}`));
|
|
11132
|
+
state.model = process.env.LEERNESS_OLLAMA_MODEL || r.models[0];
|
|
11133
|
+
log(C.dim(` βΈ Model: ${state.model} (Ollama ${r.models.length}κ° catalog Β· Shift+TabμΌλ‘ λ³κ²½)`));
|
|
11131
11134
|
} else {
|
|
11132
|
-
|
|
11133
|
-
|
|
11134
|
-
|
|
11135
|
-
|
|
11136
|
-
|
|
11137
|
-
|
|
11138
|
-
|
|
11139
|
-
|
|
11140
|
-
|
|
11141
|
-
readyCli.forEach((x, i) => log(` ${i + 1}) ${x.def.id} (v${x.status.version || '?'})`));
|
|
11142
|
-
const choice = await new Promise(res => rl.question(C.cy('\n provider μ ν (λ²νΈ / Enter=ollama κ³μ): '), res));
|
|
11143
|
-
const idx = parseInt(choice, 10) - 1;
|
|
11144
|
-
if (idx >= 0 && idx < readyCli.length) {
|
|
11145
|
-
state.provider = readyCli[idx].def.id;
|
|
11146
|
-
state.model = null; // μ provider κΈ°λ³Έ λͺ¨λΈ μ¬μ©
|
|
11147
|
-
log(C.green(` β provider μ ν: ${state.provider} (λ©μμ§ μ
λ ₯ μ¦μ μ¬μ©)`));
|
|
11148
|
-
} else {
|
|
11149
|
-
state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
|
|
11150
|
-
log(C.dim(` ollama fallback: ${state.model} β μΆν :provider <μ΄λ¦> μΌλ‘ μ ν κ°λ₯`));
|
|
11151
|
-
}
|
|
11152
|
-
} else {
|
|
11153
|
-
log(C.dim(` ollama serve + ollama pull <model> / λλ .env μμ LEERNESS_ENABLE_CLAUDE=1 λ± νμ±ν`));
|
|
11154
|
-
state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
|
|
11155
|
-
log(C.dim(` fallback: ${state.model} (μ€ νΈμΆ μ€ν¨ μ :provider λ©λ΄ λλ :quit)`));
|
|
11156
|
-
}
|
|
11157
|
-
} catch {
|
|
11135
|
+
// Ollama λ―Έκ°λ β λΉ-Ollama νμ± CLI κ° μμΌλ©΄ μλ μ ν, μμΌλ©΄ fallback ollama (warn)
|
|
11136
|
+
const readyCli = EXTERNAL_AGENTS.filter(a => a.id !== 'ollama')
|
|
11137
|
+
.map(a => ({ def: a, status: _checkAgent(a) }))
|
|
11138
|
+
.filter(x => x.status.status === 'ready');
|
|
11139
|
+
if (readyCli.length) {
|
|
11140
|
+
state.provider = readyCli[0].def.id;
|
|
11141
|
+
state.model = null;
|
|
11142
|
+
log(C.green(` βΈ Ollama λ―Έκ°λ β ${state.provider} μλ μ ν (TabμΌλ‘ λ€λ₯Έ provider μ ν κ°λ₯)`));
|
|
11143
|
+
} else {
|
|
11158
11144
|
state.model = process.env.LEERNESS_OLLAMA_MODEL || 'llama3';
|
|
11159
|
-
log(C.
|
|
11145
|
+
log(C.yel(` β Ollama λ―Έκ°λ + νμ± CLI μμ β fallback ${state.model} (μ€ νΈμΆ μ€ν¨ μ :quit λλ :provider)`));
|
|
11160
11146
|
}
|
|
11161
11147
|
}
|
|
11162
11148
|
}
|
|
@@ -11658,7 +11644,7 @@ async function _agentRepl(root, opts) {
|
|
|
11658
11644
|
async function agentCmd(root, taskArg) {
|
|
11659
11645
|
root = absRoot(root || process.cwd());
|
|
11660
11646
|
const task = (taskArg || arg('--task', '') || '').trim();
|
|
11661
|
-
// 1.9.149: REPL μ§μ
β μΈμ μκ±°λ --interactive λͺ
μ (
|
|
11647
|
+
// 1.9.149+1.9.181: REPL μ§μ
β μΈμ μκ±°λ --interactive λͺ
μ (provider μλ μ ν)
|
|
11662
11648
|
if (!task || has('--interactive') || has('--repl')) {
|
|
11663
11649
|
if (process.stdin.isTTY && !has('--no-repl') && process.env.LEERNESS_NO_PROMPT !== '1') {
|
|
11664
11650
|
const t0 = Date.now();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.181",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|