leerness 1.9.159 โ 1.9.160
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 +49 -0
- package/README.md +2 -2
- package/bin/harness.js +88 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.160 โ 2026-05-20
|
|
4
|
+
|
|
5
|
+
**๐ ์์จ ๋ชจ๋ 90 ๋ผ์ด๋ ๋ง์ผ์คํค + `provider sync` (์ธ๋ถ catalog ์๋ ๋๊ธฐํ).**
|
|
6
|
+
|
|
7
|
+
### Added โ `leerness provider sync <url>` (1.9.157 Provider Registry ํ์ฅ)
|
|
8
|
+
- ์ธ๋ถ URL ์์ provider catalog ์๋ ๊ฐ์ ธ์ค๊ธฐ โ OpenRouter llms.txt / GitHub raw JSON / ์์ฒด ํธ์คํธ
|
|
9
|
+
- **์์กด์ฑ 0 ์ ์ง** โ Node built-in `https.get` ์ฌ์ฉ
|
|
10
|
+
- 2๊ฐ์ง ํ์ ์๋ ์ธ์:
|
|
11
|
+
1. **JSON array** โ `[{ id, bin, envFlag?, desc?, ... }, ...]` ๋๋ `{ providers: [...] }`
|
|
12
|
+
2. **llms.txt** โ ํ ์ค๋น `"id|bin|desc"` (`#` ์ฃผ์ ๋ฌด์)
|
|
13
|
+
- `--dry-run` โ ํ์ผ ์ฐ๊ธฐ ์คํตํ๊ณ ๊ฒฐ๊ณผ๋ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ
|
|
14
|
+
- ๋ณด์:
|
|
15
|
+
- `LEERNESS_OFFLINE=1` ์ ๊ฑฐ๋ถ
|
|
16
|
+
- http:// ๋๋ https:// ๊ฐ์
|
|
17
|
+
- response 1MB ์ ํ
|
|
18
|
+
- timeout 15s
|
|
19
|
+
- 3xx redirect ์๋ follow (1๋จ๊ณ)
|
|
20
|
+
- id ์ ๊ท์ ๊ฒ์ฆ (์๋ฌธ์/์ซ์/_- ๋ง โ sync ๋ add ์ ๋์ผ)
|
|
21
|
+
- ๊ฐ์ id ๋ ๋ฒ โ ๊ฐฑ์ (๋ฎ์ด์ฐ๊ธฐ) / ์๋ชป๋ id โ skip
|
|
22
|
+
|
|
23
|
+
### Use Case โ OpenRouter / Bedrock ์ผ๊ด ํก์
|
|
24
|
+
```bash
|
|
25
|
+
# ๊ฐ์์ leerness-providers catalog
|
|
26
|
+
leerness provider sync https://raw.githubusercontent.com/example/leerness-providers/main/openrouter.json
|
|
27
|
+
|
|
28
|
+
# ๋๋ llms.txt ํ์
|
|
29
|
+
leerness provider sync https://example.com/providers.txt --dry-run
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Verified โ ๐ 90 ๋ผ์ด๋ ๋ง์ผ์คํค ๋ณด๊ณ ์
|
|
33
|
+
- `_reports/1.9.160-90-rounds-milestone.md` (๋น๊ณต๊ฐ)
|
|
34
|
+
- 1.9.140 ~ 1.9.160 โ 21 ๋ผ์ด๋ ์งํ ํ์๋ผ์ธ (์ฌ์ฉ์ ๋ช
์ 11 / ์์จ ํ์ 10)
|
|
35
|
+
- MCP ๋๊ตฌ ์งํ: 8 โ 30 ๐ โ 40 ๐ โ 47 โ 48 โ **50 ๐**
|
|
36
|
+
- **21 ๋ผ์ด๋ ์ฐ์ `main` ์๋ sync** ์์ ์ฑ
|
|
37
|
+
- 5๋ฅ๋ ฅ ๋งคํธ๋ฆญ์ค ๊ฐฑ์ : 55% โ **65%**
|
|
38
|
+
|
|
39
|
+
### Pending โ ๋ค์ 10 ๋ผ์ด๋ ์ ๋ง (1.9.161 ~ 1.9.170)
|
|
40
|
+
1. LSP ์ด๋ํฐ MVP (TypeScript) โ 5๋ฅ๋ ฅ #2
|
|
41
|
+
2. playwright/computer-use bridge โ 5๋ฅ๋ ฅ #4
|
|
42
|
+
3. i18n + ์์ด docs ํ ๊ธ
|
|
43
|
+
4. REPL slash ์ถ๊ฐ (`:lessons`, `:brainstorm`)
|
|
44
|
+
|
|
45
|
+
### Verified
|
|
46
|
+
- e2e 217/217 โ
|
|
47
|
+
- stress-v105: 20/20 (provider sync 10์ข
+ ๋ง์ผ์คํค ๋ณด๊ณ ์ 3์ข
+ ๋์ ํ๊ท 7์ข
) ๐ **90 ๋ผ์ด๋ ๋ง์ผ์คํค**
|
|
48
|
+
- VERSION = 1.9.160 / autonomous-rounds = 90
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
3
52
|
## 1.9.159 โ 2026-05-20
|
|
4
53
|
|
|
5
54
|
**๐ MCP 50 ๋๊ตฌ ๋ง์ผ์คํค โ Provider Registry CRUD MCP ์์ฑ (list/add/remove).**
|
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,7 +12,7 @@
|
|
|
12
12
|
โ โโโ โโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโ โ
|
|
13
13
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
|
|
14
14
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
|
|
15
|
-
โ v1.9.
|
|
15
|
+
โ v1.9.160 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
17
|
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
18
18
|
```
|
package/bin/harness.js
CHANGED
|
@@ -6,7 +6,7 @@ const path = require('path');
|
|
|
6
6
|
const cp = require('child_process');
|
|
7
7
|
const readline = require('readline');
|
|
8
8
|
|
|
9
|
-
const VERSION = '1.9.
|
|
9
|
+
const VERSION = '1.9.160';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -4694,7 +4694,93 @@ function providerCmd(root, sub, ...args) {
|
|
|
4694
4694
|
ok(`provider ์ ๊ฑฐ: ${id}`);
|
|
4695
4695
|
return;
|
|
4696
4696
|
}
|
|
4697
|
-
|
|
4697
|
+
if (sub === 'sync') {
|
|
4698
|
+
// 1.9.160: ์ธ๋ถ catalog URL ์์ provider ์๋ ๋ฑ๋ก (์์กด์ฑ 0 โ Node built-in https)
|
|
4699
|
+
// ํ์ 1: llms.txt โ ํ ์ค๋น "id|bin|desc" (์: "openrouter|openrouter-cli|OpenRouter 200+ models")
|
|
4700
|
+
// ํ์ 2: JSON [{ id, bin, envFlag?, desc?, installHint? }, ...]
|
|
4701
|
+
// ๋ณด์: LEERNESS_OFFLINE=1 ์ ๊ฑฐ๋ถ
|
|
4702
|
+
const url = (args[0] || arg('--url', '')).trim();
|
|
4703
|
+
if (!url) return fail('provider sync <url> ํ์ (์: https://raw.githubusercontent.com/.../providers.json ๋๋ llms.txt)');
|
|
4704
|
+
if (process.env.LEERNESS_OFFLINE === '1') return fail('LEERNESS_OFFLINE=1 โ ์ธ๋ถ fetch ๊ฑฐ๋ถ (๋ณด์ ์ ์ฑ
)');
|
|
4705
|
+
if (!/^https?:\/\//.test(url)) return fail(`URL ํ์ ์ค๋ฅ: ${url} (http:// ๋๋ https://)`);
|
|
4706
|
+
const dryRun = has('--dry-run');
|
|
4707
|
+
return (async () => {
|
|
4708
|
+
const lib = url.startsWith('https:') ? require('https') : require('http');
|
|
4709
|
+
const fetchUrl = (u) => new Promise((resolve) => {
|
|
4710
|
+
try {
|
|
4711
|
+
const req = lib.get(u, { timeout: 15000, headers: { 'User-Agent': `leerness/${VERSION}` } }, (res) => {
|
|
4712
|
+
// redirect handling (3xx)
|
|
4713
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
4714
|
+
return resolve(fetchUrl(res.headers.location));
|
|
4715
|
+
}
|
|
4716
|
+
if (res.statusCode !== 200) return resolve({ ok: false, error: `HTTP ${res.statusCode}` });
|
|
4717
|
+
let data = '';
|
|
4718
|
+
res.on('data', c => { data += c; if (data.length > 1024 * 1024) { req.destroy(); resolve({ ok: false, error: 'response > 1MB' }); } });
|
|
4719
|
+
res.on('end', () => resolve({ ok: true, body: data, contentType: res.headers['content-type'] || '' }));
|
|
4720
|
+
});
|
|
4721
|
+
req.on('error', e => resolve({ ok: false, error: e.message }));
|
|
4722
|
+
req.on('timeout', () => { req.destroy(); resolve({ ok: false, error: 'timeout' }); });
|
|
4723
|
+
} catch (e) { resolve({ ok: false, error: e.message }); }
|
|
4724
|
+
});
|
|
4725
|
+
log(`# leerness provider sync (1.9.160)`);
|
|
4726
|
+
log(`URL: ${url}`);
|
|
4727
|
+
const r = await fetchUrl(url);
|
|
4728
|
+
if (!r.ok) { fail(`fetch ์คํจ: ${r.error}`); process.exitCode = 1; return; }
|
|
4729
|
+
// ํ์ฑ: JSON ์ฐ์ โ llms.txt fallback
|
|
4730
|
+
let entries = null;
|
|
4731
|
+
try {
|
|
4732
|
+
const j = JSON.parse(r.body);
|
|
4733
|
+
if (Array.isArray(j)) entries = j;
|
|
4734
|
+
else if (Array.isArray(j.providers)) entries = j.providers;
|
|
4735
|
+
} catch {}
|
|
4736
|
+
if (!entries) {
|
|
4737
|
+
// llms.txt ํ์ โ "id|bin|desc" ํ ์ค๋น
|
|
4738
|
+
entries = r.body.split('\n')
|
|
4739
|
+
.map(l => l.trim())
|
|
4740
|
+
.filter(l => l && !l.startsWith('#'))
|
|
4741
|
+
.map(l => {
|
|
4742
|
+
const parts = l.split('|').map(s => s.trim());
|
|
4743
|
+
if (parts.length < 2) return null;
|
|
4744
|
+
return { id: parts[0], bin: parts[1], desc: parts[2] || `(synced from ${url})` };
|
|
4745
|
+
})
|
|
4746
|
+
.filter(Boolean);
|
|
4747
|
+
}
|
|
4748
|
+
if (!entries.length) { fail(`URL ์๋ต์์ provider ์ถ์ถ ์คํจ (JSON array ๋๋ llms.txt "id|bin|desc" ํ์ ๊ธฐ๋)`); process.exitCode = 1; return; }
|
|
4749
|
+
log(`๋ฐ๊ฒฌ ${entries.length}๊ฐ ํ๋ณด`);
|
|
4750
|
+
log('');
|
|
4751
|
+
const userList = _readUserProviders(root);
|
|
4752
|
+
const existingIds = new Set(userList.map(u => u.id));
|
|
4753
|
+
const validIdRegex = /^[a-z][a-z0-9_-]*$/i;
|
|
4754
|
+
let added = 0, updated = 0, skipped = 0;
|
|
4755
|
+
for (const e of entries) {
|
|
4756
|
+
if (!e.id || !e.bin || !validIdRegex.test(e.id)) { skipped++; continue; }
|
|
4757
|
+
const entry = {
|
|
4758
|
+
id: e.id,
|
|
4759
|
+
bin: e.bin,
|
|
4760
|
+
envFlag: e.envFlag || `LEERNESS_ENABLE_${String(e.id).toUpperCase()}`,
|
|
4761
|
+
versionArgs: Array.isArray(e.versionArgs) ? e.versionArgs : (typeof e.versionArgs === 'string' ? e.versionArgs.split(/\s+/) : ['--version']),
|
|
4762
|
+
desc: e.desc || `(synced) ${e.id}`,
|
|
4763
|
+
installHint: e.installHint || ''
|
|
4764
|
+
};
|
|
4765
|
+
if (existingIds.has(e.id)) {
|
|
4766
|
+
const idx = userList.findIndex(u => u.id === e.id);
|
|
4767
|
+
if (!dryRun) userList[idx] = entry;
|
|
4768
|
+
updated++;
|
|
4769
|
+
log(` โบ ${e.id} (๊ฐฑ์ )`);
|
|
4770
|
+
} else {
|
|
4771
|
+
if (!dryRun) userList.push(entry);
|
|
4772
|
+
existingIds.add(e.id);
|
|
4773
|
+
added++;
|
|
4774
|
+
log(` + ${e.id} (์ ๊ท)`);
|
|
4775
|
+
}
|
|
4776
|
+
}
|
|
4777
|
+
if (!dryRun) _writeUserProviders(root, userList);
|
|
4778
|
+
log('');
|
|
4779
|
+
log(`โ sync ์๋ฃ: ์ ๊ท ${added} ยท ๊ฐฑ์ ${updated} ยท ๋ฌด์ ${skipped}${dryRun ? ' (--dry-run)' : ''}`);
|
|
4780
|
+
if (!dryRun) log(` .env ์ LEERNESS_ENABLE_<X>=1 ์ค์ ํ \`leerness agents list\` ๋ก ํ์ธ`);
|
|
4781
|
+
})();
|
|
4782
|
+
}
|
|
4783
|
+
fail(`์ ์ ์๋ sub: ${sub} (list / add / remove / sync)`);
|
|
4698
4784
|
}
|
|
4699
4785
|
|
|
4700
4786
|
// 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.160",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|