leerness 1.9.167 โ†’ 1.9.169

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,100 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.169 โ€” 2026-05-20
4
+
5
+ **๐Ÿ”ง Hotfix โ€” `_collectWorkspacePaths()` --include ๋ช…์‹œ ์‹œ cwd ์ž๋™ ์ถ”๊ฐ€ ์•ˆ ํ•จ.**
6
+
7
+ ์ž์œจ ๋ชจ๋“œ 99 ๋ผ์šด๋“œ. 1.9.168 release ํ›„ ๋ฐœ๊ฒฌ๋œ e2e flake (209/217) ์˜ ์˜๊ตฌ ํ•ด๊ฒฐ.
8
+
9
+ ### ๋ฌธ์ œ ์ง„๋‹จ
10
+ - `cwd: os.tmpdir()` ๋ช…๋ น ์‹คํ–‰ ์‹œ leerness๊ฐ€ cwd์˜ `.harness` ์ž๋™ ๋ฐœ๊ฒฌ โ†’ ์นด์šดํŠธ +1
11
+ - `os.tmpdir()` ์— ์ž”์กด `.harness` ๋””๋ ‰ํ† ๋ฆฌ ์กด์žฌ ์‹œ `--include` ๋ช…์‹œํ–ˆ์–ด๋„ cwd ์ถ”๊ฐ€๋จ
12
+ - ๊ฒฐ๊ณผ: `brainstorm --include p1,p2` ํ˜ธ์ถœ ์‹œ "3๊ฐœ ํ”„๋กœ์ ํŠธ" (cwd + p1 + p2) ์ž˜๋ชป ์นด์šดํŠธ
13
+ - 1.9.168 ํšŒ๊ท€ ์•„๋‹˜ โ€” 1.9.15 ์ด๋ž˜ ๋ˆ„์ ๋œ ์ž ์žฌ ๋ฒ„๊ทธ (ํ™˜๊ฒฝ ์˜์กด flake)
14
+ - 24,877๊ฐœ ๋ˆ„์  leerness-* ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ + ์ž”์กด `Temp/.harness` ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ
15
+
16
+ ### Fix โ€” _collectWorkspacePaths() (harness.js, 1.9.15 ๋„์ž… ํ•จ์ˆ˜)
17
+ ```javascript
18
+ function _collectWorkspacePaths(rootBase) {
19
+ const set = new Set();
20
+ const include = arg('--include', null);
21
+ // 1.9.169 fix: --include ๋ช…์‹œ ์‹œ cwd ์ž๋™ ์ถ”๊ฐ€ ์Šคํ‚ต (explicit-only)
22
+ if (!include) {
23
+ if (exists(path.join(rootBase, '.harness'))) set.add(rootBase);
24
+ }
25
+ // ... --all-apps ๋™์ž‘ ์œ ์ง€
26
+ if (include) { /* explicit paths only */ }
27
+ return Array.from(set);
28
+ }
29
+ ```
30
+
31
+ **์›์น™**: `--include` ๊ฐ€ ๋ช…์‹œ๋˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ explicit ๊ฒฝ๋กœ๋งŒ ์‚ฌ์šฉ. `--all-apps` ๋‹จ๋… ๋˜๋Š” ์ธ์ž ์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ๋™์ž‘ (cwd ์ž๋™ ์ถ”๊ฐ€) ์œ ์ง€.
32
+
33
+ ### ์˜ํ–ฅ ๋ฒ”์œ„
34
+ - `brainstorm --include`, `insights --include`, `handoff --include`, `reuse-map --include`, `retro --include`
35
+ - ๋ชจ๋“  `--include` / ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋ช…๋ น ์ •ํ™•ํ•œ ์นด์šดํŠธ
36
+
37
+ ### Verified
38
+ - e2e **217/217 โœ“** (1.9.168 ์‹œ์  209/217 โ†’ 1.9.169 217/217 ํšŒ๋ณต)
39
+ - stress-v114: 14/14 (hotfix 4 + e2e ํšŒ๋ณต 3 + ๋ˆ„์  ํšŒ๊ท€ 7)
40
+ - ์ง„๋‹จ ๊ฒ€์ฆ: `os.tmpdir()/.harness` ์‹œ๋ฎฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ •ํ™• ์นด์šดํŠธ
41
+ - VERSION = 1.9.169 / autonomous-rounds = 99 / main ์ž๋™ push 30 ๋ผ์šด๋“œ ์—ฐ์†
42
+
43
+ ### ๋‹ค์Œ ๋ผ์šด๋“œ (1.9.170) โ€” ๐ŸŽ‰ 100 ๋ผ์šด๋“œ ๋งˆ์ผ์Šคํ†ค ๋„๋‹ฌ
44
+
45
+ ---
46
+
47
+ ## 1.9.168 โ€” 2026-05-20
48
+
49
+ **MCP bridge 3์ข… ๋…ธ์ถœ (web/pc/lsp) โ€” 50 โ†’ 53 ๋„๊ตฌ + ์™ธ๋ถ€ AI ์ž๋™ํ™” ๋Šฅ๋ ฅ ์ง๊ฒฐ.**
50
+
51
+ ์ž์œจ ๋ชจ๋“œ 98 ๋ผ์šด๋“œ. 1.9.165~167 ์—์„œ leerness CLI ์— ์ถ”๊ฐ€ํ•œ web/pc/lsp bridge 3์ข…์„ MCP ๋„๊ตฌ๋กœ ๋…ธ์ถœ โ†’ ์™ธ๋ถ€ AI (Claude, Codex, Gemini, Copilot)๊ฐ€ leerness ์˜ ์›น/PC/LSP ์ž๋™ํ™” ๋Šฅ๋ ฅ์„ **์ง์ ‘ ํ˜ธ์ถœ** ๊ฐ€๋Šฅ.
52
+
53
+ ### Added โ€” MCP ๋„๊ตฌ 3์ข…
54
+ | ๋„๊ตฌ | ๋ผ์šฐํŒ… | ์„ค๋ช… |
55
+ |---|---|---|
56
+ | `leerness_web` | `web check\|screenshot\|extract` | 1.9.165 playwright bridge MCP ๋…ธ์ถœ |
57
+ | `leerness_pc` | `pc check\|click\|type\|screenshot` | 1.9.166 robotjs/nut-tree bridge MCP ๋…ธ์ถœ |
58
+ | `leerness_lsp` | `lsp check\|symbols\|references` | 1.9.167 LSP ์–ด๋Œ‘ํ„ฐ MCP ๋…ธ์ถœ (typescript opt-in + regex fallback) |
59
+
60
+ ### ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ฐ•ํ™”
61
+ 1.9.156 `agents multi --execute` (์‹ค์ œ spawn + multi-signal consensus) ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด:
62
+ - ์™ธ๋ถ€ AI 1 (Claude) โ†’ `leerness_web screenshot` (๊ฒ€์ˆ˜ ์ž๋ฃŒ ์บก์ฒ˜)
63
+ - ์™ธ๋ถ€ AI 2 (Codex) โ†’ `leerness_lsp symbols` (์ฝ”๋“œ ์ธํ…”๋ฆฌ์ „์Šค)
64
+ - ์™ธ๋ถ€ AI 3 (Gemini) โ†’ `leerness_pc screenshot` (UI ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)
65
+
66
+ โ†’ **leerness ๊ฐ€ ๋ชจ๋“  ์™ธ๋ถ€ AI์˜ ๋„๊ตฌ ๊ณต๊ธ‰๋ง ์—ญํ• ** (= ์ง„์ •ํ•œ ๋ฒ”์šฉ AI ํ•˜๋„ค์Šค).
67
+
68
+ ### MCP 53 ๋„๊ตฌ ๋งˆ์ผ์Šคํ†ค
69
+ | ๋ผ์šด๋“œ | ๋„๊ตฌ ์ˆ˜ | ๋งˆ์ผ์Šคํ†ค |
70
+ |---|---|---|
71
+ | 1.9.110 | 30 | Memory CRUD 5์ข… ์™„์„ฑ |
72
+ | 1.9.159 | 50 | Provider Registry CRUD ์™„์„ฑ |
73
+ | **1.9.168** | **53** | **Bridge 3์ข… ์™ธ๋ถ€ ๋…ธ์ถœ (web/pc/lsp)** |
74
+
75
+ ### ์‚ฌ์šฉ ์˜ˆ์‹œ (MCP tools/call)
76
+ ```json
77
+ { "name": "leerness_lsp", "arguments": { "sub": "symbols", "file": "src/api.ts" } }
78
+ { "name": "leerness_web", "arguments": { "sub": "screenshot", "url": "https://example.com", "out": "shot.png" } }
79
+ { "name": "leerness_pc", "arguments": { "sub": "click", "x": 800, "y": 400 } }
80
+ ```
81
+
82
+ ### Verified
83
+ - e2e 217/217 baseline (1.9.167 ์œ ์ง€)
84
+ - stress-v113: 17/17 (MCP ๋“ฑ๋ก 4 + tools/call ์‹ค ๋™์ž‘ 4 + 6๋Šฅ๋ ฅ ๋งคํŠธ๋ฆญ์Šค 2 + ๋ˆ„์  ํšŒ๊ท€ 7)
85
+ - ์‹ค์ธก: `leerness_lsp symbols harness.js` (MCP) โ†’ 472 symbols
86
+ - VERSION = 1.9.168 / autonomous-rounds = 98 / main ์ž๋™ push 29 ๋ผ์šด๋“œ ์—ฐ์†
87
+
88
+ ### 6๋Šฅ๋ ฅ ๋งคํŠธ๋ฆญ์Šค (์˜ํ–ฅ ์—†์Œ, 100 ๋ผ์šด๋“œ ๋งˆ์ผ์Šคํ†ค ์ž„๋ฐ•)
89
+ | ์˜์—ญ | 1.9.167 | **1.9.168** |
90
+ |---|---|---|
91
+ | (5) MCP ๋„๊ตฌ | 100% (50+ 50 ๋„๊ตฌ) | **100% (53 ๋„๊ตฌ)** |
92
+ | ์ข…ํ•ฉ | 72% | **72%** (production-ready ์œ ์ง€) |
93
+
94
+ ๋‹ค์Œ ๋ผ์šด๋“œ (1.9.169~170): 100 ๋ผ์šด๋“œ ๋งˆ์ผ์Šคํ†ค ์ž„๋ฐ• (2 ๋ผ์šด๋“œ ๋‚จ์Œ).
95
+
96
+ ---
97
+
3
98
  ## 1.9.167 โ€” 2026-05-20
4
99
 
5
100
  **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.169-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v114-14%2F14-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-53-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-99-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-30_rounds-success)]() [![hotfix](https://img.shields.io/badge/1.9.169-include_explicit--only-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.169 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
+ โ•‘ hotfix --include explicit-only ยท 30 ๋ผ์šด๋“œ main ์ž๋™ push โ•‘
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.169';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -6343,9 +6343,16 @@ function _retroOneLine(agg) {
6343
6343
  }
6344
6344
 
6345
6345
  // 1.9.15: --all-apps / --include ๊ฒฝ๋กœ ๋ชจ์Œ
6346
+ // 1.9.169 fix: --include ๋ช…์‹œ๋˜๋ฉด cwd ์ž๋™ ์ถ”๊ฐ€ ์•ˆ ํ•จ (explicit-only).
6347
+ // ๊ธฐ์กด: cwd/.harness ์ž๋™ ์ถ”๊ฐ€ โ†’ ์ž”์กด .harness ์‹œ ์˜๋„์น˜ ์•Š์€ ์นด์šดํŠธ ์ฆ๊ฐ€ (e2e flake ์›์ธ)
6348
+ // ๋ณ€๊ฒฝ: --include ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œํ•œ ๊ฒฝ๋กœ๋งŒ ์‚ฌ์šฉ. --all-apps ๋‹จ๋…์€ ๊ธฐ์กด ๋™์ž‘ ์œ ์ง€.
6346
6349
  function _collectWorkspacePaths(rootBase) {
6347
6350
  const set = new Set();
6348
- if (exists(path.join(rootBase, '.harness'))) set.add(rootBase);
6351
+ const include = arg('--include', null);
6352
+ // --include ๋ช…์‹œ ์‹œ cwd ์ž๋™ ์ถ”๊ฐ€ ์Šคํ‚ต (explicit-only ๋ณด์žฅ)
6353
+ if (!include) {
6354
+ if (exists(path.join(rootBase, '.harness'))) set.add(rootBase);
6355
+ }
6349
6356
  if (has('--all-apps')) {
6350
6357
  const baseCandidates = [path.resolve(rootBase, '_apps'), path.resolve(rootBase, '..', '_apps')];
6351
6358
  for (const base of baseCandidates) {
@@ -6360,7 +6367,6 @@ function _collectWorkspacePaths(rootBase) {
6360
6367
  }
6361
6368
  }
6362
6369
  }
6363
- const include = arg('--include', null);
6364
6370
  if (include) {
6365
6371
  for (const p of String(include).split(',')) {
6366
6372
  const abs = path.resolve(p.trim());
@@ -9850,7 +9856,10 @@ function mcpServeCmd(root) {
9850
9856
  { 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
9857
  { 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
9858
  { 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'] } }
9859
+ { 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'] } },
9860
+ { 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'] } },
9861
+ { 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'] } },
9862
+ { 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
9863
  ];
9855
9864
 
9856
9865
  function send(obj) {
@@ -9957,6 +9966,27 @@ function mcpServeCmd(root) {
9957
9966
  case 'leerness_provider_remove':
9958
9967
  cliArgs = ['provider', 'remove', String(args.id || ''), '--path', targetPath];
9959
9968
  break;
9969
+ // 1.9.168: Bridge 3์ข… MCP ๋…ธ์ถœ (web/pc/lsp) โ€” ์™ธ๋ถ€ AI ๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœ
9970
+ case 'leerness_web':
9971
+ cliArgs = ['web', String(args.sub || 'check'), '--path', targetPath, '--json'];
9972
+ if (args.url) cliArgs.splice(2, 0, String(args.url));
9973
+ if (args.out) cliArgs.push('--out', String(args.out));
9974
+ if (args.selector) cliArgs.push('--selector', String(args.selector));
9975
+ break;
9976
+ case 'leerness_pc':
9977
+ cliArgs = ['pc', String(args.sub || 'check'), '--path', targetPath, '--json'];
9978
+ if (typeof args.x === 'number' && typeof args.y === 'number') {
9979
+ cliArgs.splice(2, 0, String(args.x), String(args.y));
9980
+ }
9981
+ if (args.text) cliArgs.splice(2, 0, String(args.text));
9982
+ if (args.out) cliArgs.push('--out', String(args.out));
9983
+ break;
9984
+ case 'leerness_lsp':
9985
+ cliArgs = ['lsp', String(args.sub || 'check'), '--path', targetPath, '--json'];
9986
+ if (args.file) cliArgs.splice(2, 0, String(args.file));
9987
+ if (args.name) cliArgs.splice(2, 0, String(args.name));
9988
+ if (args.in) cliArgs.push('--in', String(args.in));
9989
+ break;
9960
9990
  default:
9961
9991
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
9962
9992
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.167",
3
+ "version": "1.9.169",
4
4
  "description": "Leerness: ๋น„ํŒŒ๊ดด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์ž๋™ ๋ฒ„์ „ ๊ฐ์ง€ยท์—…๋ฐ์ดํŠธ, ๊ณ„ํš/์ง„ํ–‰/ํ•ธ๋“œ์˜คํ”„ ์ž๋™ํ™”, ๊ฒŒ์œผ๋ฆ„ยท์‹œํฌ๋ฆฟยท์ธ์ฝ”๋”ฉ ์ž๋™ ๊ฐ€๋“œ, Claude Code ์Šฌ๋ž˜์‹œ ํ†ตํ•ฉ์„ ๊ฐ–์ถ˜ ํ•œ๊ตญ์–ด ์šฐ์„  AI ๊ฐœ๋ฐœ ํ•˜๋„ค์Šค.",
5
5
  "keywords": [
6
6
  "leerness",