leerness 1.9.158 β†’ 1.9.159

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 CHANGED
@@ -1,5 +1,50 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.159 β€” 2026-05-20
4
+
5
+ **πŸŽ‰ MCP 50 도ꡬ λ§ˆμΌμŠ€ν†€ β€” Provider Registry CRUD MCP μ™„μ„± (list/add/remove).**
6
+
7
+ 자율 λͺ¨λ“œ 89 λΌμš΄λ“œ. 1.9.158 (list) 의 μžμ—°μŠ€λŸ¬μš΄ 후속 β€” add/remove κΉŒμ§€ MCP 둜 λ…ΈμΆœ β†’ μ™ΈλΆ€ AI κ°€ μžκ°€ ν™•μž₯ κ°€λŠ₯.
8
+
9
+ ### Added β€” MCP `leerness_provider_add` (49번째 도ꡬ)
10
+ - μ™ΈλΆ€ AI κ°€ μƒˆ provider 동적 등둝 β€” OpenRouter / Bedrock / Groq / Hugging Face λ“±
11
+ - 인자: `{ id (required), bin?, envFlag?, versionArgs?, desc?, installHint?, path? }`
12
+ - 같은 id 두 번 β†’ κ°±μ‹  / 빌트인 id β†’ user override
13
+ - id μ •κ·œμ‹ 검증 (영문자/숫자/_- 만)
14
+
15
+ ### Added β€” MCP `leerness_provider_remove` (50번째 도ꡬ) πŸŽ‰
16
+ - μ‚¬μš©μž μ •μ˜ provider 만 제거 (빌트인 5μ’… β†’ κ±°λΆ€)
17
+ - 인자: `{ id (required), path? }`
18
+
19
+ ### Provider Registry CRUD MCP μ™„μ„±
20
+ | μž‘μ—… | CLI | MCP | λ§ˆμΌμŠ€ν†€ |
21
+ |---|---|---|---|
22
+ | Read | `leerness provider list` | `leerness_provider_list` | 1.9.158 (48번째) |
23
+ | Write | `leerness provider add` | `leerness_provider_add` | 1.9.159 (49번째) |
24
+ | Delete | `leerness provider remove` | `leerness_provider_remove` | 1.9.159 (50번째) πŸŽ‰ |
25
+
26
+ ### Use Cases β€” μ™ΈλΆ€ AI μžκ°€ ν™•μž₯
27
+ ```javascript
28
+ // 메인 μ—μ΄μ „νŠΈκ°€ OpenRouter 발견 μ‹œ μžκ°€ 등둝
29
+ await mcp.callTool('leerness_provider_add', {
30
+ id: 'openrouter', bin: 'openrouter-cli',
31
+ desc: 'OpenRouter 200+ models aggregator'
32
+ });
33
+
34
+ // 잘λͺ» λ“±λ‘ν•œ provider μžκ°€ 정리
35
+ await mcp.callTool('leerness_provider_remove', { id: 'broken-provider' });
36
+ ```
37
+
38
+ ### MCP 도ꡬ 카운트 μ§„ν™”
39
+ - 1.9.43: 8 β†’ 1.9.110: **30** πŸŽ‰ β†’ 1.9.128: **40** πŸŽ‰ β†’ 1.9.145: 47 β†’ 1.9.158: 48 β†’ **1.9.159: 50** πŸŽ‰
40
+
41
+ ### Verified
42
+ - e2e 217/217 βœ“
43
+ - stress-v104: 16/16 (MCP tools/list 50개 3μ’… + provider_add 3μ’… + provider_remove 3μ’… + λˆ„μ  νšŒκ·€ 7μ’…) πŸŽ‰ **MCP 50 도ꡬ λ§ˆμΌμŠ€ν†€**
44
+ - VERSION = 1.9.159 / autonomous-rounds = 89
45
+
46
+ ---
47
+
3
48
  ## 1.9.158 β€” 2026-05-20
4
49
 
5
50
  **πŸŽ‰ 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
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.158-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v103-12%2F12-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-48-blue)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-88-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-auto-success)]() [![provider-registry](https://img.shields.io/badge/provider_registry-CLI%2BMCP-success)]() [![multi-execute](https://img.shields.io/badge/agents_multi-real_spawn%2Bconsensus-success)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
5
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.159-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v104-16%2F16-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-50%20%F0%9F%8E%89-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-89-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-auto-success)]() [![provider-crud](https://img.shields.io/badge/provider_registry-CRUD_MCP_complete-success)]() [![multi-execute](https://img.shields.io/badge/agents_multi-real_spawn%2Bconsensus-success)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,7 +12,7 @@
12
12
  β•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β•β•β–ˆβ–ˆβ•‘ β•‘
13
13
  β•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β•‘
14
14
  β•‘ β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β• β•‘
15
- β•‘ v1.9.158 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.159 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.158';
9
+ const VERSION = '1.9.159';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -9742,7 +9742,9 @@ function mcpServeCmd(root) {
9742
9742
  { 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
9743
  { 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
9744
  { 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' } } } }
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' } } } },
9746
+ { 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'] } },
9747
+ { 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
9748
  ];
9747
9749
 
9748
9750
  function send(obj) {
@@ -9837,6 +9839,18 @@ function mcpServeCmd(root) {
9837
9839
  case 'leerness_env_detect': cliArgs = ['env', 'detect', targetPath, '--json']; break;
9838
9840
  // 1.9.158: Provider Registry β€” μ™ΈλΆ€ AI κ°€ λ“±λ‘λœ provider 회수
9839
9841
  case 'leerness_provider_list': cliArgs = ['provider', 'list', '--path', targetPath, '--json']; break;
9842
+ // 1.9.159: Provider Registry CRUD β€” μ™ΈλΆ€ AI κ°€ μžκ°€ ν™•μž₯
9843
+ case 'leerness_provider_add':
9844
+ cliArgs = ['provider', 'add', String(args.id || ''), '--path', targetPath];
9845
+ if (args.bin) cliArgs.push('--bin', String(args.bin));
9846
+ if (args.envFlag) cliArgs.push('--env-flag', String(args.envFlag));
9847
+ if (args.versionArgs) cliArgs.push('--version-args', String(args.versionArgs));
9848
+ if (args.desc) cliArgs.push('--desc', String(args.desc));
9849
+ if (args.installHint) cliArgs.push('--install-hint', String(args.installHint));
9850
+ break;
9851
+ case 'leerness_provider_remove':
9852
+ cliArgs = ['provider', 'remove', String(args.id || ''), '--path', targetPath];
9853
+ break;
9840
9854
  default:
9841
9855
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
9842
9856
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.158",
3
+ "version": "1.9.159",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",