leerness 1.9.158 โ 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 +94 -0
- package/README.md +2 -2
- package/bin/harness.js +103 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,99 @@
|
|
|
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
|
+
|
|
52
|
+
## 1.9.159 โ 2026-05-20
|
|
53
|
+
|
|
54
|
+
**๐ MCP 50 ๋๊ตฌ ๋ง์ผ์คํค โ Provider Registry CRUD MCP ์์ฑ (list/add/remove).**
|
|
55
|
+
|
|
56
|
+
์์จ ๋ชจ๋ 89 ๋ผ์ด๋. 1.9.158 (list) ์ ์์ฐ์ค๋ฌ์ด ํ์ โ add/remove ๊น์ง MCP ๋ก ๋
ธ์ถ โ ์ธ๋ถ AI ๊ฐ ์๊ฐ ํ์ฅ ๊ฐ๋ฅ.
|
|
57
|
+
|
|
58
|
+
### Added โ MCP `leerness_provider_add` (49๋ฒ์งธ ๋๊ตฌ)
|
|
59
|
+
- ์ธ๋ถ AI ๊ฐ ์ provider ๋์ ๋ฑ๋ก โ OpenRouter / Bedrock / Groq / Hugging Face ๋ฑ
|
|
60
|
+
- ์ธ์: `{ id (required), bin?, envFlag?, versionArgs?, desc?, installHint?, path? }`
|
|
61
|
+
- ๊ฐ์ id ๋ ๋ฒ โ ๊ฐฑ์ / ๋นํธ์ธ id โ user override
|
|
62
|
+
- id ์ ๊ท์ ๊ฒ์ฆ (์๋ฌธ์/์ซ์/_- ๋ง)
|
|
63
|
+
|
|
64
|
+
### Added โ MCP `leerness_provider_remove` (50๋ฒ์งธ ๋๊ตฌ) ๐
|
|
65
|
+
- ์ฌ์ฉ์ ์ ์ provider ๋ง ์ ๊ฑฐ (๋นํธ์ธ 5์ข
โ ๊ฑฐ๋ถ)
|
|
66
|
+
- ์ธ์: `{ id (required), path? }`
|
|
67
|
+
|
|
68
|
+
### Provider Registry CRUD MCP ์์ฑ
|
|
69
|
+
| ์์
| CLI | MCP | ๋ง์ผ์คํค |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| Read | `leerness provider list` | `leerness_provider_list` | 1.9.158 (48๋ฒ์งธ) |
|
|
72
|
+
| Write | `leerness provider add` | `leerness_provider_add` | 1.9.159 (49๋ฒ์งธ) |
|
|
73
|
+
| Delete | `leerness provider remove` | `leerness_provider_remove` | 1.9.159 (50๋ฒ์งธ) ๐ |
|
|
74
|
+
|
|
75
|
+
### Use Cases โ ์ธ๋ถ AI ์๊ฐ ํ์ฅ
|
|
76
|
+
```javascript
|
|
77
|
+
// ๋ฉ์ธ ์์ด์ ํธ๊ฐ OpenRouter ๋ฐ๊ฒฌ ์ ์๊ฐ ๋ฑ๋ก
|
|
78
|
+
await mcp.callTool('leerness_provider_add', {
|
|
79
|
+
id: 'openrouter', bin: 'openrouter-cli',
|
|
80
|
+
desc: 'OpenRouter 200+ models aggregator'
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// ์๋ชป ๋ฑ๋กํ provider ์๊ฐ ์ ๋ฆฌ
|
|
84
|
+
await mcp.callTool('leerness_provider_remove', { id: 'broken-provider' });
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### MCP ๋๊ตฌ ์นด์ดํธ ์งํ
|
|
88
|
+
- 1.9.43: 8 โ 1.9.110: **30** ๐ โ 1.9.128: **40** ๐ โ 1.9.145: 47 โ 1.9.158: 48 โ **1.9.159: 50** ๐
|
|
89
|
+
|
|
90
|
+
### Verified
|
|
91
|
+
- e2e 217/217 โ
|
|
92
|
+
- stress-v104: 16/16 (MCP tools/list 50๊ฐ 3์ข
+ provider_add 3์ข
+ provider_remove 3์ข
+ ๋์ ํ๊ท 7์ข
) ๐ **MCP 50 ๋๊ตฌ ๋ง์ผ์คํค**
|
|
93
|
+
- VERSION = 1.9.159 / autonomous-rounds = 89
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
3
97
|
## 1.9.158 โ 2026-05-20
|
|
4
98
|
|
|
5
99
|
**๐ MCP 48๋ฒ์งธ ๋๊ตฌ `leerness_provider_list` โ Provider Registry ์ธ๋ถ AI ๋
ธ์ถ ๋ง์ผ์คํค.**
|
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 ์ถ์ฒ
|
|
@@ -9742,7 +9828,9 @@ function mcpServeCmd(root) {
|
|
|
9742
9828
|
{ name: 'leerness_feature_add', description: '1.9.142 โ Feature Graph ์ ์ ๋
ธ๋ ์ถ๊ฐ (์ธ๋ถ AI๊ฐ ์ฝ๋ ์์ฑ ์ค ์ง์ feature ๋ฑ๋ก). ์ธ์: { title (required), dependsOn?, affects?, coChangesWith?, files?, path? }. ์๋ F-XXXX ID ๋ถ์ฌ. CRUD ์์ฑ์ ๊ธฐ์ฌ', inputSchema: { type: 'object', properties: { title: { type: 'string' }, dependsOn: { type: 'string' }, affects: { type: 'string' }, coChangesWith: { type: 'string' }, files: { type: 'string' }, path: { type: 'string' } }, required: ['title'] } },
|
|
9743
9829
|
{ name: 'leerness_feature_link', description: '1.9.142 โ ๊ธฐ์กด feature ๋
ธ๋์ ์์กด/์ํฅ/๊ณต๋ณ๊ฒฝ ์ฃ์ง ์ถ๊ฐ. ์ธ์: { id (required, F-XXXX), dependsOn?, affects?, coChangesWith?, path? }. ์ธ๋ถ AI๊ฐ ์ฝ๋ ๋ณ๊ฒฝ ๋์ค ๋ฐ๊ฒฌํ ์ธ๊ณผ๊ด๊ณ๋ฅผ ์ฆ์ ๊ทธ๋ํ์ ๋ฐ์', inputSchema: { type: 'object', properties: { id: { type: 'string' }, dependsOn: { type: 'string' }, affects: { type: 'string' }, coChangesWith: { type: 'string' }, path: { type: 'string' } }, required: ['id'] } },
|
|
9744
9830
|
{ name: 'leerness_env_detect', description: '1.9.145 โ ์คํ ํ๊ฒฝ ์๋ ๊ฐ์ง + ๋ณ๋ ์ถ์ JSON ({ snapshot: { os, hardware, locale, shell, node, tools, scriptDependencies }, diff: { firstCapture, changes, missing }, persisted }). "X์(๋) ๋ด๋ถ ๋๋ ์ธ๋ถ ๋ช
๋ น... ์๋๋๋ค" ์ฌ์ ๋ฐฉ์ง: package.json scripts ์์กด ๋๊ตฌ๊ฐ PATH์ ์๋์ง ๊ฒ์ฆ + ๋จธ์ /Node/๋๊ตฌ ๋ณ๊ฒฝ ๊ฐ์ง. ์ ๋๊ฒฝ๋ก ๋ง์คํน (๋ณด์). ์ธ์: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
9745
|
-
{ name: 'leerness_provider_list', description: '1.9.157/158 โ Provider Registry ์กฐํ JSON ({ total, builtin, user, providers: [{ id, bin, envFlag, source, desc }] }). ๋นํธ์ธ 5์ข
(claude/codex/gemini/copilot/ollama) + .harness/providers.json ์ฌ์ฉ์ ์ ์ ํตํฉ. ์ธ๋ถ AI๊ฐ sub-agent ๋ถ๋ฐฐ ๊ฐ๋ฅํ provider ์ ์ฒด ํ์ (OpenRouter/Bedrock ๋ฑ ๋ฑ๋ก๋์ด ์์ผ๋ฉด ๊ฐ์ด ๋
ธ์ถ). ๐ MCP 48 ๋๊ตฌ ๋ง์ผ์คํค', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
|
|
9831
|
+
{ name: 'leerness_provider_list', description: '1.9.157/158 โ Provider Registry ์กฐํ JSON ({ total, builtin, user, providers: [{ id, bin, envFlag, source, desc }] }). ๋นํธ์ธ 5์ข
(claude/codex/gemini/copilot/ollama) + .harness/providers.json ์ฌ์ฉ์ ์ ์ ํตํฉ. ์ธ๋ถ AI๊ฐ sub-agent ๋ถ๋ฐฐ ๊ฐ๋ฅํ provider ์ ์ฒด ํ์ (OpenRouter/Bedrock ๋ฑ ๋ฑ๋ก๋์ด ์์ผ๋ฉด ๊ฐ์ด ๋
ธ์ถ). ๐ MCP 48 ๋๊ตฌ ๋ง์ผ์คํค', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
9832
|
+
{ name: 'leerness_provider_add', description: '1.9.159 โ Provider Registry ์ ์ provider ๋์ ์ถ๊ฐ. ์ธ์: { id (required), bin?, envFlag?, versionArgs?, desc?, path? }. ์ธ๋ถ AI๊ฐ ์ CLI ๋ฐ๊ฒฌ ์ ์๊ฐ ํ์ฅ (OpenRouter / Bedrock / Groq / Hugging Face ๋ฑ ๋ฑ๋ก). ๊ฐ์ id ๋ ๋ฒ ํธ์ถ โ ๊ฐฑ์ . ๋นํธ์ธ id ํธ์ถ โ user override. id ๋ ์๋ฌธ์/์ซ์/_- ๋ง ํ์ฉ.', inputSchema: { type: 'object', properties: { id: { type: 'string' }, bin: { type: 'string' }, envFlag: { type: 'string' }, versionArgs: { type: 'string' }, desc: { type: 'string' }, installHint: { type: 'string' }, path: { type: 'string' } }, required: ['id'] } },
|
|
9833
|
+
{ name: 'leerness_provider_remove', description: '1.9.159 โ Provider Registry ์์ ์ฌ์ฉ์ ์ ์ provider ์ ๊ฑฐ. ์ธ์: { id (required), path? }. ๋นํธ์ธ 5์ข
id ๋ ์ ๊ฑฐ ๋ถ๊ฐ (override ๋ง ์ ๊ฑฐ ๊ฐ๋ฅ). ๐ MCP 50 ๋๊ตฌ ๋ง์ผ์คํค โ Provider Registry CRUD MCP ์์ฑ (list/add/remove)', inputSchema: { type: 'object', properties: { id: { type: 'string' }, path: { type: 'string' } }, required: ['id'] } }
|
|
9746
9834
|
];
|
|
9747
9835
|
|
|
9748
9836
|
function send(obj) {
|
|
@@ -9837,6 +9925,18 @@ function mcpServeCmd(root) {
|
|
|
9837
9925
|
case 'leerness_env_detect': cliArgs = ['env', 'detect', targetPath, '--json']; break;
|
|
9838
9926
|
// 1.9.158: Provider Registry โ ์ธ๋ถ AI ๊ฐ ๋ฑ๋ก๋ provider ํ์
|
|
9839
9927
|
case 'leerness_provider_list': cliArgs = ['provider', 'list', '--path', targetPath, '--json']; break;
|
|
9928
|
+
// 1.9.159: Provider Registry CRUD โ ์ธ๋ถ AI ๊ฐ ์๊ฐ ํ์ฅ
|
|
9929
|
+
case 'leerness_provider_add':
|
|
9930
|
+
cliArgs = ['provider', 'add', String(args.id || ''), '--path', targetPath];
|
|
9931
|
+
if (args.bin) cliArgs.push('--bin', String(args.bin));
|
|
9932
|
+
if (args.envFlag) cliArgs.push('--env-flag', String(args.envFlag));
|
|
9933
|
+
if (args.versionArgs) cliArgs.push('--version-args', String(args.versionArgs));
|
|
9934
|
+
if (args.desc) cliArgs.push('--desc', String(args.desc));
|
|
9935
|
+
if (args.installHint) cliArgs.push('--install-hint', String(args.installHint));
|
|
9936
|
+
break;
|
|
9937
|
+
case 'leerness_provider_remove':
|
|
9938
|
+
cliArgs = ['provider', 'remove', String(args.id || ''), '--path', targetPath];
|
|
9939
|
+
break;
|
|
9840
9940
|
default:
|
|
9841
9941
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
9842
9942
|
}
|
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",
|