leerness 1.9.194 β 1.9.195
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 +59 -0
- package/README.md +3 -3
- package/bin/harness.js +108 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.195 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π AμΆ (λ²μ© AI νλ€μ€) λ³΄κ° β `leerness provider probe` μ κ· λͺ
λ Ή (CLI/endpoint/API ν€ 3μ’
μλ κ°μ§).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 125 λΌμ΄λ. 1.9.192 C / 193 B / 194 E 보κ°μ μ΄μ΄ **AμΆ (9/10 β λͺ©ν 9.5/10)** 보κ°.
|
|
8
|
+
|
|
9
|
+
### μ¬μ©μ μλ μ λ ¬ (1.9.191 verbatim)
|
|
10
|
+
> *"λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"*
|
|
11
|
+
|
|
12
|
+
### 1. `leerness provider probe` μ κ· λͺ
λ Ή (AμΆ ν΅μ¬)
|
|
13
|
+
- **3μ’
μλ κ°μ§** (μμ‘΄μ± 0 β Node built-in cp + http):
|
|
14
|
+
1. **CLI binaries**: claude / codex / gemini / copilot / ollama (PATH + `--version`)
|
|
15
|
+
2. **Local endpoint**: Ollama (11434) / LM Studio (1234) / llama.cpp (8080)
|
|
16
|
+
3. **Cloud API key**: OPENROUTER / GROQ / TOGETHER / ANTHROPIC / OPENAI
|
|
17
|
+
|
|
18
|
+
- **μΆλ ₯ μ΅μ
**: `--json` (μλν/CI) Β· ν
μ€νΈ λ§ν¬λ€μ΄ (μ¬λ μ½κΈ°)
|
|
19
|
+
- **νμμμ**: `--timeout 1500` (κΈ°λ³Έ, ms)
|
|
20
|
+
- **νκ²½λ³μ override**: `OLLAMA_HOST` / `LMSTUDIO_HOST` / `LLAMACPP_HOST`
|
|
21
|
+
|
|
22
|
+
### 2. μ€ μΈ‘μ (κ°λ° PC)
|
|
23
|
+
```
|
|
24
|
+
| id | bin | found | version |
|
|
25
|
+
| claude | claude | β | 2.1.146 (Claude Code) |
|
|
26
|
+
| codex | codex | β | codex-cli 0.132.0 |
|
|
27
|
+
| gemini | gemini | β | - |
|
|
28
|
+
| copilot | copilot | β | - |
|
|
29
|
+
| ollama | ollama | β | (installed) |
|
|
30
|
+
|
|
31
|
+
β μ¬μ© κ°λ₯ ν보 3건
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 3. μ κ· ν¨μ
|
|
35
|
+
- `_probeProviderEndpoints(root, timeoutMs)` β 3μ’
ν΅ν© κ°μ§
|
|
36
|
+
- `_probeHttpEndpoint(url, timeoutMs)` β Promise κΈ°λ° HTTP reachability check
|
|
37
|
+
|
|
38
|
+
### 4. λμ νκ· (1.9.189~194) β λͺ¨λ μ μ§
|
|
39
|
+
- [1.9.194] _suggestNextActions + lazy κ°μ§
|
|
40
|
+
- [1.9.193] agents multi consensus β lessons.md
|
|
41
|
+
- [1.9.192] _loadOfficialSkillCache + 24h μΊμ
|
|
42
|
+
- [1.9.191] ꡬ쑰 μ΅μ ν λ³΄κ³ μ 88/100
|
|
43
|
+
- [1.9.190] _selectOne/_selectMany Ctrl+C μ¦μ μ’
λ£
|
|
44
|
+
- [1.9.189] _showSlashCommandList + Tab cycle ν μ€ κ°±μ
|
|
45
|
+
|
|
46
|
+
### 5. stress-v140 β 15/15 PASS
|
|
47
|
+
- provider probe (6: ν¨μ + 3μ’
λμ + --json + ν
μ€νΈ) + μ±λ₯ (2) + λμ νκ· (7)
|
|
48
|
+
- μ±λ₯: --version cold start avg **442 ms** Β· MCP 54 λꡬ **514 ms**
|
|
49
|
+
|
|
50
|
+
### 6. 5μΆ λ§€νΈλ¦μ€ λ³λ
|
|
51
|
+
| μΆ | 1.9.194 | 1.9.195 | Ξ |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| A. λ²μ© AI νλ€μ€ | 9/10 | **9.5/10** | +0.5 (universal probe β 11 backend ν보 μλ κ°μ§) |
|
|
54
|
+
| μ’
ν© | 46/50 (92%) | **46.5/50 (93%)** | +1% |
|
|
55
|
+
|
|
56
|
+
### 7. μλ release νλ¦
|
|
57
|
+
- main μλ push **57 λΌμ΄λ μ°μ** (1.9.140~195)
|
|
58
|
+
- npm publish μλ (1.9.178~)
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
3
62
|
## 1.9.194 β 2026-05-21
|
|
4
63
|
|
|
5
64
|
**π― EμΆ (κ²μΌλ¦ λ°©μ§) λ³΄κ° β handoff λ€μ λ¨κ³ μλ μ μ + 24h+ 무μ§μ² lazy κ°μ§.**
|
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) []() []() []() []() []() []() [-brightgreen)]() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
β βββ ββββββ ββββββ ββββββββββββββββββββββββ ββββββββ β
|
|
13
13
|
β βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββ β
|
|
14
14
|
β βββββββββββββββββββββββββββ ββββββ βββββββββββββββββββββ β
|
|
15
|
-
β v1.9.
|
|
15
|
+
β v1.9.195 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π provider probe 11 backend μλ Β· 93/100 Β· 125 λΌμ΄λ β
|
|
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.195';
|
|
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 μ²λ¦¬).
|
|
@@ -5506,7 +5506,113 @@ function providerCmd(root, sub, ...args) {
|
|
|
5506
5506
|
if (!dryRun) log(` .env μ LEERNESS_ENABLE_<X>=1 μ€μ ν \`leerness agents list\` λ‘ νμΈ`);
|
|
5507
5507
|
})();
|
|
5508
5508
|
}
|
|
5509
|
-
|
|
5509
|
+
// 1.9.195: provider probe β AμΆ (λ²μ© AI νλ€μ€) 보κ°. μ¬μ©μ μλ: "λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"
|
|
5510
|
+
// μμ€ν
μ μ¬μ© κ°λ₯ν provider μλ κ°μ§ (PATH λͺ
λ Ή + λ‘컬 endpoint + API ν€ νκ²½λ³μ)
|
|
5511
|
+
// κ°μ§ λμ:
|
|
5512
|
+
// - CLI: claude / codex / gemini / copilot / ollama (PATH check)
|
|
5513
|
+
// - Local endpoint: Ollama (11434) / LM Studio (1234) / llama.cpp server (8080)
|
|
5514
|
+
// - Cloud API key: OPENROUTER_API_KEY / GROQ_API_KEY / TOGETHER_API_KEY / ANTHROPIC_API_KEY / OPENAI_API_KEY
|
|
5515
|
+
// κ²°κ³Ό β table + LEERNESS_ENABLE_* μ€μ κΆμ₯
|
|
5516
|
+
if (sub === 'probe') {
|
|
5517
|
+
return (async () => {
|
|
5518
|
+
const json = has('--json');
|
|
5519
|
+
const timeoutMs = Number(arg('--timeout', '1500'));
|
|
5520
|
+
const results = await _probeProviderEndpoints(root, timeoutMs);
|
|
5521
|
+
if (json) { log(JSON.stringify(results, null, 2)); return; }
|
|
5522
|
+
log(`# leerness provider probe (1.9.195 β AμΆ λ²μ© AI νλ€μ€ 보κ°)`);
|
|
5523
|
+
log(`νμμμ: ${timeoutMs}ms`);
|
|
5524
|
+
log('');
|
|
5525
|
+
log('## CLI binaries (PATH)');
|
|
5526
|
+
log('| id | bin | found | version |');
|
|
5527
|
+
log('|---|---|---|---|');
|
|
5528
|
+
for (const r of results.cli) {
|
|
5529
|
+
log(`| ${r.id} | ${r.bin} | ${r.found ? 'β' : 'β'} | ${r.version || '-'} |`);
|
|
5530
|
+
}
|
|
5531
|
+
log('');
|
|
5532
|
+
log('## Local endpoint (HTTP)');
|
|
5533
|
+
log('| name | url | reachable | latency |');
|
|
5534
|
+
log('|---|---|---|---|');
|
|
5535
|
+
for (const r of results.endpoints) {
|
|
5536
|
+
log(`| ${r.name} | ${r.url} | ${r.reachable ? 'β' : 'β'} | ${r.latencyMs != null ? r.latencyMs + 'ms' : '-'} |`);
|
|
5537
|
+
}
|
|
5538
|
+
log('');
|
|
5539
|
+
log('## Cloud API keys (.env)');
|
|
5540
|
+
log('| key | present | mask |');
|
|
5541
|
+
log('|---|---|---|');
|
|
5542
|
+
for (const r of results.cloudKeys) {
|
|
5543
|
+
log(`| ${r.key} | ${r.present ? 'β' : 'β'} | ${r.mask || '-'} |`);
|
|
5544
|
+
}
|
|
5545
|
+
log('');
|
|
5546
|
+
const total = results.cli.filter(x => x.found).length + results.endpoints.filter(x => x.reachable).length + results.cloudKeys.filter(x => x.present).length;
|
|
5547
|
+
log(`β μ¬μ© κ°λ₯ ν보 ${total}건`);
|
|
5548
|
+
log(' β νμ±ν: .env μ LEERNESS_ENABLE_<ID>=1 + ENDPOINT/API ν€ μ€μ ');
|
|
5549
|
+
log(' β νμΈ: leerness agents list');
|
|
5550
|
+
})();
|
|
5551
|
+
}
|
|
5552
|
+
fail(`μ μ μλ sub: ${sub} (list / add / remove / sync / probe)`);
|
|
5553
|
+
}
|
|
5554
|
+
|
|
5555
|
+
// 1.9.195: provider probe ν΅μ¬ β CLI/endpoint/API ν€ 3μ’
κ°μ§
|
|
5556
|
+
// μμ‘΄μ± 0 β Node built-in cp.spawnSync (CLI version) + http.get (endpoint) + process.env (API key)
|
|
5557
|
+
async function _probeProviderEndpoints(root, timeoutMs) {
|
|
5558
|
+
const result = { cli: [], endpoints: [], cloudKeys: [], at: new Date().toISOString() };
|
|
5559
|
+
// 1) CLI binaries β PATH + --version
|
|
5560
|
+
const cliTargets = [
|
|
5561
|
+
{ id: 'claude', bin: 'claude' },
|
|
5562
|
+
{ id: 'codex', bin: 'codex' },
|
|
5563
|
+
{ id: 'gemini', bin: 'gemini' },
|
|
5564
|
+
{ id: 'copilot', bin: 'copilot' },
|
|
5565
|
+
{ id: 'ollama', bin: 'ollama' }
|
|
5566
|
+
];
|
|
5567
|
+
for (const t of cliTargets) {
|
|
5568
|
+
try {
|
|
5569
|
+
const r = cp.spawnSync(t.bin, ['--version'], { encoding: 'utf8', timeout: timeoutMs, shell: true });
|
|
5570
|
+
// exit 0 λλ stdout μ "vX.Y.Z" λΉμ·ν ννκ° μμΌλ©΄ found μ²λ¦¬
|
|
5571
|
+
const out = (r.stdout || '').trim();
|
|
5572
|
+
const errOut = (r.stderr || '').trim();
|
|
5573
|
+
const looksLikeVersion = /\d+\.\d+\.\d+|\bversion\b/i.test(out);
|
|
5574
|
+
const found = r.status === 0 || looksLikeVersion;
|
|
5575
|
+
result.cli.push({ id: t.id, bin: t.bin, found, version: found ? (out.split('\n')[0].slice(0, 40) || null) : null });
|
|
5576
|
+
} catch (e) {
|
|
5577
|
+
result.cli.push({ id: t.id, bin: t.bin, found: false, version: null });
|
|
5578
|
+
}
|
|
5579
|
+
}
|
|
5580
|
+
// 2) Local endpoints β http GET (μμ‘΄μ± 0)
|
|
5581
|
+
const endpointTargets = [
|
|
5582
|
+
{ name: 'ollama', url: process.env.OLLAMA_HOST || 'http://localhost:11434', path: '/api/tags' },
|
|
5583
|
+
{ name: 'lmstudio', url: process.env.LMSTUDIO_HOST || 'http://localhost:1234', path: '/v1/models' },
|
|
5584
|
+
{ name: 'llama.cpp', url: process.env.LLAMACPP_HOST || 'http://localhost:8080', path: '/health' }
|
|
5585
|
+
];
|
|
5586
|
+
for (const t of endpointTargets) {
|
|
5587
|
+
const reach = await _probeHttpEndpoint(t.url + t.path, timeoutMs);
|
|
5588
|
+
result.endpoints.push({ name: t.name, url: t.url + t.path, reachable: reach.ok, latencyMs: reach.latencyMs, status: reach.status });
|
|
5589
|
+
}
|
|
5590
|
+
// 3) Cloud API keys β .env
|
|
5591
|
+
const cloudKeys = ['OPENROUTER_API_KEY', 'GROQ_API_KEY', 'TOGETHER_API_KEY', 'ANTHROPIC_API_KEY', 'OPENAI_API_KEY'];
|
|
5592
|
+
for (const k of cloudKeys) {
|
|
5593
|
+
const val = process.env[k] || '';
|
|
5594
|
+
const present = val.length >= 10;
|
|
5595
|
+
result.cloudKeys.push({ key: k, present, mask: present ? `${val.slice(0, 4)}...${val.slice(-2)}` : null });
|
|
5596
|
+
}
|
|
5597
|
+
return result;
|
|
5598
|
+
}
|
|
5599
|
+
|
|
5600
|
+
// 1.9.195: HTTP endpoint reachability check (μμ‘΄μ± 0)
|
|
5601
|
+
function _probeHttpEndpoint(url, timeoutMs) {
|
|
5602
|
+
return new Promise((resolve) => {
|
|
5603
|
+
try {
|
|
5604
|
+
const lib = url.startsWith('https:') ? require('https') : require('http');
|
|
5605
|
+
const t0 = Date.now();
|
|
5606
|
+
const req = lib.get(url, { timeout: timeoutMs }, (res) => {
|
|
5607
|
+
res.on('data', () => {});
|
|
5608
|
+
res.on('end', () => resolve({ ok: res.statusCode < 500, status: res.statusCode, latencyMs: Date.now() - t0 }));
|
|
5609
|
+
});
|
|
5610
|
+
req.on('timeout', () => { req.destroy(); resolve({ ok: false, latencyMs: null, status: null }); });
|
|
5611
|
+
req.on('error', () => resolve({ ok: false, latencyMs: null, status: null }));
|
|
5612
|
+
} catch {
|
|
5613
|
+
resolve({ ok: false, latencyMs: null, status: null });
|
|
5614
|
+
}
|
|
5615
|
+
});
|
|
5510
5616
|
}
|
|
5511
5617
|
|
|
5512
5618
|
// 1.9.36: μμ
ν€μλ λΆμμΌλ‘ μ΅μ CLI μΆμ²
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.195",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|