leerness 1.9.167 → 1.9.168

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,56 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.168 — 2026-05-20
4
+
5
+ **MCP bridge 3종 노출 (web/pc/lsp) — 50 → 53 도구 + 외부 AI 자동화 능력 직결.**
6
+
7
+ 자율 모드 98 라운드. 1.9.165~167 에서 leerness CLI 에 추가한 web/pc/lsp bridge 3종을 MCP 도구로 노출 → 외부 AI (Claude, Codex, Gemini, Copilot)가 leerness 의 웹/PC/LSP 자동화 능력을 **직접 호출** 가능.
8
+
9
+ ### Added — MCP 도구 3종
10
+ | 도구 | 라우팅 | 설명 |
11
+ |---|---|---|
12
+ | `leerness_web` | `web check\|screenshot\|extract` | 1.9.165 playwright bridge MCP 노출 |
13
+ | `leerness_pc` | `pc check\|click\|type\|screenshot` | 1.9.166 robotjs/nut-tree bridge MCP 노출 |
14
+ | `leerness_lsp` | `lsp check\|symbols\|references` | 1.9.167 LSP 어댑터 MCP 노출 (typescript opt-in + regex fallback) |
15
+
16
+ ### 멀티 에이전트 오케스트레이션 강화
17
+ 1.9.156 `agents multi --execute` (실제 spawn + multi-signal consensus) 와 결합하면:
18
+ - 외부 AI 1 (Claude) → `leerness_web screenshot` (검수 자료 캡처)
19
+ - 외부 AI 2 (Codex) → `leerness_lsp symbols` (코드 인텔리전스)
20
+ - 외부 AI 3 (Gemini) → `leerness_pc screenshot` (UI 테스트 자동화)
21
+
22
+ → **leerness 가 모든 외부 AI의 도구 공급망 역할** (= 진정한 범용 AI 하네스).
23
+
24
+ ### MCP 53 도구 마일스톤
25
+ | 라운드 | 도구 수 | 마일스톤 |
26
+ |---|---|---|
27
+ | 1.9.110 | 30 | Memory CRUD 5종 완성 |
28
+ | 1.9.159 | 50 | Provider Registry CRUD 완성 |
29
+ | **1.9.168** | **53** | **Bridge 3종 외부 노출 (web/pc/lsp)** |
30
+
31
+ ### 사용 예시 (MCP tools/call)
32
+ ```json
33
+ { "name": "leerness_lsp", "arguments": { "sub": "symbols", "file": "src/api.ts" } }
34
+ { "name": "leerness_web", "arguments": { "sub": "screenshot", "url": "https://example.com", "out": "shot.png" } }
35
+ { "name": "leerness_pc", "arguments": { "sub": "click", "x": 800, "y": 400 } }
36
+ ```
37
+
38
+ ### Verified
39
+ - e2e 217/217 baseline (1.9.167 유지)
40
+ - stress-v113: 17/17 (MCP 등록 4 + tools/call 실 동작 4 + 6능력 매트릭스 2 + 누적 회귀 7)
41
+ - 실측: `leerness_lsp symbols harness.js` (MCP) → 472 symbols
42
+ - VERSION = 1.9.168 / autonomous-rounds = 98 / main 자동 push 29 라운드 연속
43
+
44
+ ### 6능력 매트릭스 (영향 없음, 100 라운드 마일스톤 임박)
45
+ | 영역 | 1.9.167 | **1.9.168** |
46
+ |---|---|---|
47
+ | (5) MCP 도구 | 100% (50+ 50 도구) | **100% (53 도구)** |
48
+ | 종합 | 72% | **72%** (production-ready 유지) |
49
+
50
+ 다음 라운드 (1.9.169~170): 100 라운드 마일스톤 임박 (2 라운드 남음).
51
+
52
+ ---
53
+
3
54
  ## 1.9.167 — 2026-05-20
4
55
 
5
56
  **LSP 어댑터 MVP — codeIntel 6번째 영역 신설 (typescript opt-in + regex fallback).**
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.167-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v112-23%2F23-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-50-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-97-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-28_rounds-success)]() [![lsp-bridge](https://img.shields.io/badge/lsp_bridge-typescript_opt--in%2Bregex_fallback-success)]() [![pc-bridge](https://img.shields.io/badge/pc_bridge-robotjs%2Fnut--tree_opt--in-success)]() [![web-bridge](https://img.shields.io/badge/playwright_bridge-opt--in_MVP-success)]() [![capability](https://img.shields.io/badge/6_capability-72%25_production--ready-brightgreen)]() [![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.168-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v113-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-53-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-98-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-29_rounds-success)]() [![mcp-bridge](https://img.shields.io/badge/MCP_bridge-web%2Fpc%2Flsp_노출-success)]() [![lsp-bridge](https://img.shields.io/badge/lsp_bridge-typescript_opt--in%2Bregex_fallback-success)]() [![pc-bridge](https://img.shields.io/badge/pc_bridge-robotjs%2Fnut--tree_opt--in-success)]() [![web-bridge](https://img.shields.io/badge/playwright_bridge-opt--in_MVP-success)]() [![capability](https://img.shields.io/badge/6_capability-72%25_production--ready-brightgreen)]() [![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,9 +12,9 @@
12
12
  ║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
13
13
  ║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
14
14
  ║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
15
- ║ v1.9.167 AI Agent Reliability Harness + Sandbox ║
15
+ ║ v1.9.168 AI Agent Reliability Harness + Sandbox ║
16
16
  ║ verify · remember · orchestrate · audit · sandbox · drift ║
17
- 6 capability 72% production-ready (web/pc/lsp opt-in MVP)
17
+ 53 MCP tools · web/pc/lsp bridge 외부 AI 직접 호출 가능
18
18
  ╚══════════════════════════════════════════════════════════════╝
19
19
  ```
20
20
 
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.167';
9
+ const VERSION = '1.9.168';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -9850,7 +9850,10 @@ function mcpServeCmd(root) {
9850
9850
  { 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' } } } },
9851
9851
  { 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' } } } },
9852
9852
  { 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'] } },
9853
- { 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'] } }
9853
+ { 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'] } },
9854
+ { name: 'leerness_web', description: '1.9.168 — Web Bridge (1.9.165 playwright opt-in). sub: check (설치 + permissions.browser 확인) | screenshot (URL → PNG) | extract (URL + CSS selector → DOM 텍스트). 외부 AI가 leerness 의 웹 자동화 능력을 직접 호출. playwright 미설치 시 친절 안내 (graceful). 인자: { sub (required), url?, out?, selector?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'screenshot', 'extract'] }, url: { type: 'string' }, out: { type: 'string' }, selector: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
9855
+ { name: 'leerness_pc', description: '1.9.168 — PC Bridge (1.9.166 robotjs/nut-tree opt-in). sub: check (설치 + permissions.mouse/keyboard) | click (x,y) | type (text) | screenshot (out). ⚠ full permissions 권장 (mouse/keyboard 접근). 외부 AI가 데스크탑 자동화 능력을 직접 호출. 인자: { sub (required), x?, y?, text?, out?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'click', 'type', 'screenshot'] }, x: { type: 'number' }, y: { type: 'number' }, text: { type: 'string' }, out: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
9856
+ { name: 'leerness_lsp', description: '1.9.168 — LSP Bridge (1.9.167 typescript opt-in + regex fallback). sub: check (설치 여부) | symbols (file → function/class/interface/type/enum 목록) | references (name + in 디렉토리 → 호출 위치). 외부 AI가 코드 인텔리전스를 직접 호출 (의존성 0 fallback 동작). 🎉 MCP 53 도구 마일스톤. 인자: { sub (required), file?, name?, in?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'symbols', 'references'] }, file: { type: 'string' }, name: { type: 'string' }, in: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } }
9854
9857
  ];
9855
9858
 
9856
9859
  function send(obj) {
@@ -9957,6 +9960,27 @@ function mcpServeCmd(root) {
9957
9960
  case 'leerness_provider_remove':
9958
9961
  cliArgs = ['provider', 'remove', String(args.id || ''), '--path', targetPath];
9959
9962
  break;
9963
+ // 1.9.168: Bridge 3종 MCP 노출 (web/pc/lsp) — 외부 AI 가 직접 호출
9964
+ case 'leerness_web':
9965
+ cliArgs = ['web', String(args.sub || 'check'), '--path', targetPath, '--json'];
9966
+ if (args.url) cliArgs.splice(2, 0, String(args.url));
9967
+ if (args.out) cliArgs.push('--out', String(args.out));
9968
+ if (args.selector) cliArgs.push('--selector', String(args.selector));
9969
+ break;
9970
+ case 'leerness_pc':
9971
+ cliArgs = ['pc', String(args.sub || 'check'), '--path', targetPath, '--json'];
9972
+ if (typeof args.x === 'number' && typeof args.y === 'number') {
9973
+ cliArgs.splice(2, 0, String(args.x), String(args.y));
9974
+ }
9975
+ if (args.text) cliArgs.splice(2, 0, String(args.text));
9976
+ if (args.out) cliArgs.push('--out', String(args.out));
9977
+ break;
9978
+ case 'leerness_lsp':
9979
+ cliArgs = ['lsp', String(args.sub || 'check'), '--path', targetPath, '--json'];
9980
+ if (args.file) cliArgs.splice(2, 0, String(args.file));
9981
+ if (args.name) cliArgs.splice(2, 0, String(args.name));
9982
+ if (args.in) cliArgs.push('--in', String(args.in));
9983
+ break;
9960
9984
  default:
9961
9985
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
9962
9986
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.167",
3
+ "version": "1.9.168",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",